|
|
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.