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

