mesg.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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"
  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. //applet:IF_MESG(APPLET(mesg, BB_DIR_USR_BIN, BB_SUID_DROP))
  28. //kbuild:lib-$(CONFIG_MESG) += mesg.o
  29. //usage:#define mesg_trivial_usage
  30. //usage: "[y|n]"
  31. //usage:#define mesg_full_usage "\n\n"
  32. //usage: "Control write access to your terminal\n"
  33. //usage: " y Allow write access to your terminal\n"
  34. //usage: " n Disallow write access to your terminal"
  35. #include "libbb.h"
  36. #if ENABLE_FEATURE_MESG_ENABLE_ONLY_GROUP
  37. #define S_IWGRP_OR_S_IWOTH S_IWGRP
  38. #else
  39. #define S_IWGRP_OR_S_IWOTH (S_IWGRP | S_IWOTH)
  40. #endif
  41. int mesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  42. int mesg_main(int argc UNUSED_PARAM, char **argv)
  43. {
  44. struct stat sb;
  45. mode_t m;
  46. char c = 0;
  47. argv++;
  48. if (argv[0]
  49. && (argv[1] || ((c = argv[0][0]) != 'y' && c != 'n'))
  50. ) {
  51. bb_show_usage();
  52. }
  53. if (!isatty(STDIN_FILENO))
  54. bb_error_msg_and_die("not a tty");
  55. xfstat(STDIN_FILENO, &sb, "stderr");
  56. if (c == 0) {
  57. puts((sb.st_mode & (S_IWGRP|S_IWOTH)) ? "is y" : "is n");
  58. return EXIT_SUCCESS;
  59. }
  60. m = (c == 'y') ? sb.st_mode | S_IWGRP_OR_S_IWOTH
  61. : sb.st_mode & ~(S_IWGRP|S_IWOTH);
  62. if (fchmod(STDIN_FILENO, m) != 0)
  63. bb_perror_nomsg_and_die();
  64. return EXIT_SUCCESS;
  65. }