]> git.ipfire.org Git - thirdparty/util-linux.git/blame - term-utils/mesg.c
rpmatch: use symbolic value when evaluation return codes
[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{
1e6f6cdb 71 fputs(USAGE_HEADER, 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 75 _(" %s [options] [y | n]\n"), program_invocation_short_name);
451dbcfa
BS
76
77 fputs(USAGE_SEPARATOR, out);
78 fputs(_("Control write access of other users to your terminal.\n"), out);
79
1e6f6cdb
SK
80 fputs(USAGE_OPTIONS, out);
81 fputs(_(" -v, --verbose explain what is being done\n"), out);
82 fputs(USAGE_HELP, out);
83 fputs(USAGE_VERSION, out);
84 fprintf(out, USAGE_MAN_TAIL("mesg(1)"));
fe16e125
SK
85
86 exit(out == stderr ? MESG_EXIT_FAILURE : EXIT_SUCCESS);
87}
88
1a68fc8a 89int main(int argc, char *argv[])
6dbe3af9 90{
726f69e2
KZ
91 struct stat sb;
92 char *tty;
849c6ea3 93 int ch, verbose = FALSE;
726f69e2 94
fe16e125 95 static const struct option longopts[] = {
849c6ea3 96 { "verbose", no_argument, 0, 'v' },
fe16e125
SK
97 { "version", no_argument, 0, 'V' },
98 { "help", no_argument, 0, 'h' },
99 { NULL, 0, 0, 0 }
100 };
101
5d324c6b
SK
102 setlocale(LC_ALL, "");
103 bindtextdomain(PACKAGE, LOCALEDIR);
104 textdomain(PACKAGE);
105 atexit(close_stdout);
106
849c6ea3 107 while ((ch = getopt_long(argc, argv, "vVh", longopts, NULL)) != -1)
726f69e2 108 switch (ch) {
849c6ea3
SK
109 case 'v':
110 verbose = TRUE;
111 break;
fe16e125 112 case 'V':
1e6f6cdb 113 printf(UTIL_LINUX_VERSION);
fe16e125
SK
114 exit(EXIT_SUCCESS);
115 case 'h':
116 usage(stdout);
726f69e2 117 default:
fe16e125 118 usage(stderr);
726f69e2 119 }
1a68fc8a 120
726f69e2
KZ
121 argc -= optind;
122 argv += optind;
123
124 if ((tty = ttyname(STDERR_FILENO)) == NULL)
5eae5930 125 err(MESG_EXIT_FAILURE, _("ttyname failed"));
1a68fc8a 126
726f69e2 127 if (stat(tty, &sb) < 0)
fc14ceba 128 err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty);
726f69e2 129
1a68fc8a 130 if (!*argv) {
726f69e2 131 if (sb.st_mode & (S_IWGRP | S_IWOTH)) {
1a68fc8a 132 puts(_("is y"));
5eae5930 133 return IS_ALLOWED;
726f69e2 134 }
1a68fc8a 135 puts(_("is n"));
5eae5930 136 return IS_NOT_ALLOWED;
726f69e2
KZ
137 }
138
041b8ab2 139 switch (rpmatch(argv[0])) {
cd2a6f1c 140 case RPMATCH_YES:
726f69e2
KZ
141#ifdef USE_TTY_GROUP
142 if (chmod(tty, sb.st_mode | S_IWGRP) < 0)
726f69e2
KZ
143#else
144 if (chmod(tty, sb.st_mode | S_IWGRP | S_IWOTH) < 0)
726f69e2 145#endif
5eae5930 146 err(MESG_EXIT_FAILURE, _("change %s mode failed"), tty);
849c6ea3
SK
147 if (verbose)
148 puts(_("write access to your terminal is allowed"));
5eae5930 149 return IS_ALLOWED;
cd2a6f1c 150 case RPMATCH_NO:
726f69e2 151 if (chmod(tty, sb.st_mode & ~(S_IWGRP|S_IWOTH)) < 0)
5eae5930 152 err(MESG_EXIT_FAILURE, _("change %s mode failed"), tty);
849c6ea3
SK
153 if (verbose)
154 puts(_("write access to your terminal is denied"));
5eae5930 155 return IS_NOT_ALLOWED;
cd2a6f1c 156 case RPMATCH_INVALID:
041b8ab2 157 warnx(_("invalid argument: %s"), argv[0]);
fe16e125 158 usage(stderr);
041b8ab2
SK
159 default:
160 abort();
726f69e2 161 }
6dbe3af9 162}