Hi, I'm using write(1) on machines where people are logged in for days, weeks, months, running a tmux, as well as their write-sessions. It's annoying to not know the date when somebody talked to you. What do you think about the attached patch (write.1 modification would follow)? It just adds a flag '-t', which prepends the messages being sent with a date (i.e., you and your communication partner have to agree on using that flag to have it useful to yourself). Regards, Julian
Index: write.c
===================================================================
RCS file: /cvsroot/src/usr.bin/write/write.c,v
retrieving revision 1.27
diff -u -r1.27 write.c
--- write.c 6 Sep 2011 18:46:35 -0000 1.27
+++ write.c 17 May 2012 13:02:13 -0000
@@ -65,6 +65,8 @@
#include "utmpentry.h"
#include "term_chk.h"
+static int senddate = 0;
+
__dead static void done(int);
static void do_write(int, const char *, const uid_t);
static void wr_fputs(char *);
@@ -76,7 +78,7 @@
{
time_t atime;
uid_t myuid, uid;
- int msgsok, ttyfd;
+ int msgsok, ttyfd, ch;
char *mytty;
gid_t saved_egid = getegid();
@@ -88,27 +90,39 @@
mytty = check_sender(&atime, myuid, saved_egid);
/* check args */
+ while ((ch = getopt(argc, argv, "t")) != -1)
+ switch (ch) {
+ case 't':
+ senddate = 1;
+ break;
+ default:
+ (void)fprintf(stderr, "usage: write [-t] user [tty]\n");
+ exit(1);
+ }
+ argc -= optind;
+ argv += optind;
+
switch (argc) {
- case 2:
- ttyfd = search_utmp(argv[1], mytty, myuid, saved_egid);
+ case 1:
+ ttyfd = search_utmp(argv[0], mytty, myuid, saved_egid);
break;
- case 3:
- if (!strncmp(argv[2], _PATH_DEV, strlen(_PATH_DEV)))
- argv[2] += strlen(_PATH_DEV);
- if (uid_from_user(argv[1], &uid) == -1)
- errx(1, "%s: unknown user", argv[1]);
- if (utmp_chk(argv[1], argv[2]))
+ case 2:
+ if (!strncmp(argv[1], _PATH_DEV, strlen(_PATH_DEV)))
+ argv[1] += strlen(_PATH_DEV);
+ if (uid_from_user(argv[0], &uid) == -1)
+ errx(1, "%s: unknown user", argv[0]);
+ if (utmp_chk(argv[0], argv[1]))
errx(1, "%s is not logged in on %s",
- argv[1], argv[2]);
- ttyfd = term_chk(uid, argv[2], &msgsok, &atime, 0, saved_egid);
+ argv[0], argv[1]);
+ ttyfd = term_chk(uid, argv[1], &msgsok, &atime, 0, saved_egid);
if (ttyfd == -1)
- err(1, "%s%s", _PATH_DEV, argv[2]);
+ err(1, "%s%s", _PATH_DEV, argv[1]);
if (myuid && !msgsok)
errx(1, "%s has messages disabled on %s",
- argv[1], argv[2]);
+ argv[0], argv[1]);
break;
default:
- (void)fprintf(stderr, "usage: write user [tty]\n");
+ (void)fprintf(stderr, "usage: write [-t] user [tty]\n");
exit(1);
}
if (setgid(getgid()) == -1)
@@ -272,9 +286,18 @@
wr_fputs(char *s)
{
unsigned char c;
+ char *nows;
+ time_t now;
#define PUTC(c) if (putchar(c) == EOF) goto err;
+ if (senddate) {
+ now = time(NULL);
+ nows = ctime(&now);
+ nows[19] = '\0';
+ (void)printf("%s: ", nows + 4);
+ }
+
for (; *s != '\0'; ++s) {
c = toascii(*s);
if (c == '\n') {
Attachment:
signature.asc
Description: PGP signature