hush: add leak detector helper; fix/add tests for it
[oweals/busybox.git] / init / mesg.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * mesg implementation for busybox
4  *
5  * Copyright (c) 2002 Manuel Novoa III  <mjn3@codepoet.org>
6  *
7  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
8  */
9
10 #include "libbb.h"
11
12 #ifdef USE_TTY_GROUP
13 #define S_IWGRP_OR_S_IWOTH      S_IWGRP
14 #else
15 #define S_IWGRP_OR_S_IWOTH      (S_IWGRP | S_IWOTH)
16 #endif
17
18 int mesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
19 int mesg_main(int argc, char **argv)
20 {
21         struct stat sb;
22         const char *tty;
23         char c = 0;
24
25         if (--argc == 0
26          || (argc == 1 && ((c = **++argv) == 'y' || c == 'n'))
27         ) {
28                 tty = xmalloc_ttyname(STDERR_FILENO);
29                 if (tty == NULL) {
30                         tty = "ttyname";
31                 } else if (stat(tty, &sb) == 0) {
32                         mode_t m;
33                         if (argc == 0) {
34                                 puts((sb.st_mode & (S_IWGRP|S_IWOTH)) ? "is y" : "is n");
35                                 return EXIT_SUCCESS;
36                         }
37                         m = (c == 'y') ? sb.st_mode | S_IWGRP_OR_S_IWOTH
38                                        : sb.st_mode & ~(S_IWGRP|S_IWOTH);
39                         if (chmod(tty, m) == 0) {
40                                 return EXIT_SUCCESS;
41                         }
42                 }
43                 bb_simple_perror_msg_and_die(tty);
44         }
45         bb_show_usage();
46 }