]> git.ipfire.org Git - thirdparty/util-linux.git/blame - term-utils/mesg.c
Merge branch 'patch-1' of https://github.com/dtrebbien/util-linux
[thirdparty/util-linux.git] / term-utils / mesg.c
CommitLineData
6dbe3af9 1/*
726f69e2
KZ
2 * Copyright (c) 1987, 1993
3 * The Regents of the University of California. All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
6dbe3af9 9 *
726f69e2
KZ
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 * Modified Fri Mar 10 20:27:19 1995, faith@cs.unc.edu, for Linux
fd6b7a7f
KZ
39 * Modified Mon Jul 1 18:14:10 1996, janl@ifi.uio.no, writing to stdout
40 * as suggested by Michael Meskes <meskes@Informatik.RWTH-Aachen.DE>
7eda085c 41 *
b50945d4 42 * 1999-02-22 Arkadiusz Miƛkiewicz <misiek@pld.ORG.PL>
7eda085c
KZ
43 * - added Native Language Support
44 *
1a68fc8a
MP
45 * 2010-12-01 Marek Polacek <mmpolacek@gmail.com>
46 * - cleanups
6dbe3af9 47 */
726f69e2 48
6dbe3af9 49#include <errno.h>
726f69e2
KZ
50#include <stdio.h>
51#include <stdlib.h>
52#include <string.h>
6dbe3af9 53#include <unistd.h>
1a68fc8a
MP
54#include <sys/types.h>
55#include <sys/stat.h>
fe16e125 56#include <getopt.h>
cdd2a8c3
SK
57
58#include "closestream.h"
7eda085c 59#include "nls.h"
eb76ca98 60#include "c.h"
51924a4e 61#include "rpmatch.h"
6dbe3af9 62
5eae5930
FC
63/* exit codes */
64
65#define IS_ALLOWED 0 /* Receiving messages is allowed. */
66#define IS_NOT_ALLOWED 1 /* Receiving messages is not allowed. */
67#define MESG_EXIT_FAILURE 2 /* An error occurred. */
68
fe16e125
SK
69static void __attribute__ ((__noreturn__)) usage(FILE * out)
70{
2960a4a3 71 fputs(_("\nUsage:\n"), out);
041b8ab2
SK
72 /* TRANSLATORS: this program uses for y and n rpmatch(3),
73 * which means they can be translated. */
fe16e125 74 fprintf(out,
2960a4a3
KZ
75 _(" %s [options] [y | n]\n"), program_invocation_short_name);
76
77 fputs(_("\nOptions:\n"), out);
78 fputs(_(" -v, --verbose explain what is being done\n"
79 " -V, --version output version information and exit\n"
80 " -h, --help output help screen and exit\n\n"), out);
fe16e125
SK
81
82 exit(out == stderr ? MESG_EXIT_FAILURE : EXIT_SUCCESS);
83}
84
1a68fc8a 85int main(int argc, char *argv[])
6dbe3af9 86{
726f69e2
KZ
87 struct stat sb;
88 char *tty;
849c6ea3 89 int ch, verbose = FALSE;
726f69e2 90
7eda085c
KZ
91 setlocale(LC_ALL, "");
92 bindtextdomain(PACKAGE, LOCALEDIR);
93 textdomain(PACKAGE);
cdd2a8c3 94 atexit(close_stdout);
7eda085c 95
fe16e125 96 static const struct option longopts[] = {
849c6ea3 97 { "verbose", no_argument, 0, 'v' },
fe16e125
SK
98 { "version", no_argument, 0, 'V' },
99 { "help", no_argument, 0, 'h' },
100 { NULL, 0, 0, 0 }
101 };
102
849c6ea3 103 while ((ch = getopt_long(argc, argv, "vVh", longopts, NULL)) != -1)
726f69e2 104 switch (ch) {
849c6ea3
SK
105 case 'v':
106 verbose = TRUE;
107 break;
fe16e125
SK
108 case 'V':
109 printf(_("%s from %s\n"), program_invocation_short_name,
110 PACKAGE_STRING);
111 exit(EXIT_SUCCESS);
112 case 'h':
113 usage(stdout);
726f69e2 114 default:
fe16e125 115 usage(stderr);
726f69e2 116 }
1a68fc8a 117
726f69e2
KZ
118 argc -= optind;
119 argv += optind;
120
121 if ((tty = ttyname(STDERR_FILENO)) == NULL)
5eae5930 122 err(MESG_EXIT_FAILURE, _("ttyname failed"));
1a68fc8a 123
726f69e2 124 if (stat(tty, &sb) < 0)
add1b8af 125 err(MESG_EXIT_FAILURE, _("stat failed %s"), tty);
726f69e2 126
1a68fc8a 127 if (!*argv) {
726f69e2 128 if (sb.st_mode & (S_IWGRP | S_IWOTH)) {
1a68fc8a 129 puts(_("is y"));
5eae5930 130 return IS_ALLOWED;
726f69e2 131 }
1a68fc8a 132 puts(_("is n"));
5eae5930 133 return IS_NOT_ALLOWED;
726f69e2
KZ
134 }
135
041b8ab2
SK
136 switch (rpmatch(argv[0])) {
137 case 1:
726f69e2
KZ
138#ifdef USE_TTY_GROUP
139 if (chmod(tty, sb.st_mode | S_IWGRP) < 0)
726f69e2
KZ
140#else
141 if (chmod(tty, sb.st_mode | S_IWGRP | S_IWOTH) < 0)
726f69e2 142#endif
5eae5930 143 err(MESG_EXIT_FAILURE, _("change %s mode failed"), tty);
849c6ea3
SK
144 if (verbose)
145 puts(_("write access to your terminal is allowed"));
5eae5930 146 return IS_ALLOWED;
041b8ab2 147 case 0:
726f69e2 148 if (chmod(tty, sb.st_mode & ~(S_IWGRP|S_IWOTH)) < 0)
5eae5930 149 err(MESG_EXIT_FAILURE, _("change %s mode failed"), tty);
849c6ea3
SK
150 if (verbose)
151 puts(_("write access to your terminal is denied"));
5eae5930 152 return IS_NOT_ALLOWED;
041b8ab2
SK
153 case -1:
154 warnx(_("invalid argument: %s"), argv[0]);
fe16e125 155 usage(stderr);
041b8ab2
SK
156 default:
157 abort();
726f69e2 158 }
6dbe3af9 159}