busybox/util-linux/mesg.c
<<
>>
Prefs
   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 GPLv2 or later, see file LICENSE in this source tree.
   8 */
   9//config:config MESG
  10//config:       bool "mesg (1.4 kb)"
  11//config:       default y
  12//config:       help
  13//config:       Mesg controls access to your terminal by others. It is typically
  14//config:       used to allow or disallow other users to write to your terminal
  15//config:
  16//config:config FEATURE_MESG_ENABLE_ONLY_GROUP
  17//config:       bool "Enable writing to tty only by group, not by everybody"
  18//config:       default y
  19//config:       depends on MESG
  20//config:       help
  21//config:       Usually, ttys are owned by group "tty", and "write" tool is
  22//config:       setgid to this group. This way, "mesg y" only needs to enable
  23//config:       "write by owning group" bit in tty mode.
  24//config:
  25//config:       If you set this option to N, "mesg y" will enable writing
  26//config:       by anybody at all. This is not recommended.
  27
  28//applet:IF_MESG(APPLET_NOFORK(mesg, mesg, BB_DIR_USR_BIN, BB_SUID_DROP, mesg))
  29
  30//kbuild:lib-$(CONFIG_MESG) += mesg.o
  31
  32//usage:#define mesg_trivial_usage
  33//usage:       "[y|n]"
  34//usage:#define mesg_full_usage "\n\n"
  35//usage:       "Control write access to your terminal\n"
  36//usage:       "        y       Allow write access to your terminal\n"
  37//usage:       "        n       Disallow write access to your terminal"
  38
  39#include "libbb.h"
  40
  41#if ENABLE_FEATURE_MESG_ENABLE_ONLY_GROUP
  42#define S_IWGRP_OR_S_IWOTH  S_IWGRP
  43#else
  44#define S_IWGRP_OR_S_IWOTH  (S_IWGRP | S_IWOTH)
  45#endif
  46
  47int mesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  48int mesg_main(int argc UNUSED_PARAM, char **argv)
  49{
  50        struct stat sb;
  51        mode_t m;
  52        char c = 0;
  53
  54        argv++;
  55
  56        if (argv[0]
  57         && (argv[1] || ((c = argv[0][0]) != 'y' && c != 'n'))
  58        ) {
  59                bb_show_usage();
  60        }
  61
  62        /* We are a NOFORK applet.
  63         * (Not that it's very useful, but code is trivially NOFORK-safe).
  64         * Play nice. Do not leak anything.
  65         */
  66
  67        if (!isatty(STDIN_FILENO))
  68                bb_simple_error_msg_and_die("not a tty");
  69
  70        xfstat(STDIN_FILENO, &sb, "stdin");
  71        if (c == 0) {
  72                puts((sb.st_mode & (S_IWGRP|S_IWOTH)) ? "is y" : "is n");
  73                return EXIT_SUCCESS;
  74        }
  75        m = (c == 'y') ? sb.st_mode | S_IWGRP_OR_S_IWOTH
  76                       : sb.st_mode & ~(S_IWGRP|S_IWOTH);
  77        if (fchmod(STDIN_FILENO, m) != 0)
  78                bb_perror_nomsg_and_die();
  79        return EXIT_SUCCESS;
  80}
  81