[comp.unix.microport] Send.c improved

karl@ddsw1.UUCP (Karl Denninger) (05/11/88)

Here's a small utility which has been floating around to send single-line
messages to another user's terminal.  This version searches for the first
writable terminal if there is more than one.

It's small and handy -- ideal qualities.

Should compile and run on either Microport or SCO Xenix (was last tested on
SCO Xenix V/386 2.2.1).

/*
 *	send.c - send a one-line message to another user
 *	Bill Wisner, billw@killer.UUCP
 *	Modified to send to the first writable terminal by karl@ddsw1
 */

#ifndef lint
static char *SccsId = "@(#)send.c	1.1	05/10/88";
#endif /* lint */

#include <stdio.h>
#include <sys/types.h>
#include <utmp.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

main(argc,argv)
int argc;
char *argv[];
{
	char *to, *message, *tty = "/dev/null", *devname, *malloc();
	int device, logins = 0;
	register int i;
	struct utmp *utent, *getutent();

	if (argc < 3) {
		(void)printf("Usage: %s user message\n",argv[0]);
		exit(1);
	}

	to = malloc(9);
	sprintf(to,"%s",argv[1]);

	do {	/* See how many times victim is logged in, if any */
		utent = getutent();
		if (strcmp(utent->ut_user,to) == 0)
			logins++;
	} while (utent != NULL);

	if (logins == 0) {
		(void)printf("%s: %s is not logged in.\n",argv[0],to);
		exit(1);
	}
/*
 * Now look at all logins, and send to the first write-enabled terminal
 * we find.  Ignore the rest.  Complain only if there is no place to put
 * the user's message.  This is better than just blindly trying the first
 * port in the hopes it is writable.	- KSD 5/10/88
 *
 */
	setutent();			/* Rewind utmp file */
	devname = malloc(20);
	message = malloc(512);		/* Please gimme memory :-) */
	sprintf(message,"\007\n;;%s:",getlogin());
	for(i=2;i<argc;i++) {
		(void)sprintf(message,"%s %s",message,argv[i]);
	}

	sprintf(message,"%s\n",message);/* Message is built, find a line */
	do {
		utent = getutent();
		if (strcmp(utent->ut_user, to) == 0) {	/* Check this line */
			sprintf(devname, "/dev/%s", utent->ut_line);
			device = open(devname,O_WRONLY);
			if (device == -1) {
				if (errno != EACCES) {
					printf("%s: Cannot open %s!\n", argv[0], devname);
					continue;
				}
			} else {
				if (write(device,message,strlen(message)) == -1) {
					close(device);
					continue;
				} else
					if (logins > 1)
						printf("To %s (%d logins).\n", utent->ut_line, logins);
					exit(0);		/* Get out, delivered */
			}
		}
	} while (utent != NULL);
	printf("%s: Cannot write to user %s\n", argv[0], to);
	exit(1);
}


----
Karl Denninger                 |  Data: +1 312 566-8912
Macro Computer Solutions, Inc. | Voice: +1 312 566-8910
...ihnp4!ddsw1!karl            | "Quality solutions for work or play"