|
|
1.1 ! root 1: /* ! 2: * Permit or deny messages (e.g. write, msg, etc.) ! 3: * to be sent to the user's terminal. ! 4: * As these commands are setuid, execute permission ! 5: * may be used to control use of the terminal without ! 6: * allowing indiscriminate use by other users of the ! 7: * terminal. ! 8: * ! 9: * NOTE: the terminal is assumed to be stderr. ! 10: */ ! 11: ! 12: #include <stdio.h> ! 13: #include <sys/stat.h> ! 14: ! 15: main(argc, argv) ! 16: char *argv[]; ! 17: { ! 18: struct stat sb; ! 19: char type = 'c'; ! 20: char *tty; ! 21: char *ttyname(); ! 22: ! 23: if (argc == 2) { ! 24: if (argv[1][1]=='\0' && (*argv[1]=='y' || *argv[1]=='n')) ! 25: type = *argv[1]; ! 26: else if (strcmp(argv[1], "no")==0 || strcmp(argv[1], "yes")==0) ! 27: type = *argv[1]; ! 28: else ! 29: usage(); ! 30: } else if (argc != 1) ! 31: usage(); ! 32: tty = ttyname(fileno(stderr)); ! 33: if (tty==NULL || stat(tty, &sb)<0) { ! 34: fprintf(stderr, "Standard error not a tty\n"); ! 35: exit(2); ! 36: } ! 37: if (argc > 1) { ! 38: if (type == 'n') ! 39: sb.st_mode &= ~S_IEXEC; ! 40: else if (type == 'y') ! 41: sb.st_mode |= S_IEXEC; ! 42: chmod(tty, sb.st_mode); ! 43: } else ! 44: printf("%s\n", sb.st_mode&S_IEXEC ? "yes" : "no"); ! 45: exit (sb.st_mode&S_IEXEC ? 0 : 1); ! 46: } ! 47: ! 48: usage() ! 49: { ! 50: fprintf(stderr, "Usage: mesg [n] [y]\n"); ! 51: exit(2); ! 52: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.