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 the GPL v2 or later, see the file LICENSE in this tarball.
8 */
9
10#include "libbb.h"
11
12#ifdef USE_TTY_GROUP
13#define S_IWGRP_OR_S_IWOTH	S_IWGRP
14#else
15#define S_IWGRP_OR_S_IWOTH	(S_IWGRP | S_IWOTH)
16#endif
17
18int mesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
19int mesg_main(int argc UNUSED_PARAM, char **argv)
20{
21	struct stat sb;
22	const char *tty;
23	char c = 0;
24
25	argv++;
26
27	if (!argv[0]
28	 || (!argv[1] && ((c = argv[0][0]) == 'y' || c == 'n'))
29	) {
30		tty = xmalloc_ttyname(STDERR_FILENO);
31		if (tty == NULL) {
32			tty = "ttyname";
33		} else if (stat(tty, &sb) == 0) {
34			mode_t m;
35			if (c == 0) {
36				puts((sb.st_mode & (S_IWGRP|S_IWOTH)) ? "is y" : "is n");
37				return EXIT_SUCCESS;
38			}
39			m = (c == 'y') ? sb.st_mode | S_IWGRP_OR_S_IWOTH
40			               : sb.st_mode & ~(S_IWGRP|S_IWOTH);
41			if (chmod(tty, m) == 0) {
42				return EXIT_SUCCESS;
43			}
44		}
45		bb_simple_perror_msg_and_die(tty);
46	}
47	bb_show_usage();
48}
49