tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Proposal: Add option to add dates to write(1)



Hi,

my previous version was wrong, sorry, it didn't compile. A compiling one is
attached.

> > > 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).
> > as obviously nobody wanted this solution (and maintaining my own write is
> > useless), I've done something different. Maybe it's of use for somebody...
> > 
> > Compile with
> >   cc -o prependate prependate.c
> 
> prependate() { s=$(date +"${1:-%X %x: }"); sed -e "s,^,$s," ; } 
this won't work, the date stays always the same and output isn't flushed.
The following function would do the work:

prependate()
{
  while true; do
    read line
    s=$(date +"${1:-%X %x: }")
    echo "$line" | awk "{ sub(\"^\", \"$s\"); print; fflush }"
  done
}

Anyway, with comments, error handling, proper indenting, etc., you won't end
up with thaat much less lines than in C.

Regards, Julian
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*
 * Wait for input via fgets(2), and if entered, prepend the given string with a 
 * user-specified format string.
 */
int
main(int argc, char *argv[])
{
        struct tm *now;
        time_t nowt;
        char line[BUFSIZ], fline[128], oline[BUFSIZ];
        char *format;

        if (argc == 2) {
                if (strcmp(argv[1],"-h") == 0) {
                        printf("usage: prependate <format_string>\n");
                        exit(EXIT_FAILURE);
                } else {
                        if (asprintf(&format, "%s", argv[1]) <= 0)
                                err(EXIT_FAILURE, "asprintf");
                }
        } else {
                if (asprintf(&format, "%%x %%X: ") <= 0)
                        err(EXIT_FAILURE, "asprintf");
        }

        oline[sizeof oline - 1] = '\0';
        while (fgets(line, sizeof line - sizeof fline, stdin) != NULL) {
                nowt = time(NULL);
                now = localtime(&nowt);
                if (strftime(fline, sizeof fline, format, now) <= 0)
                        err(EXIT_FAILURE, "strftime");
                if (snprintf(oline, sizeof oline - 1, "%s%s", fline, line) <= 0)
                        err(EXIT_FAILURE, "snprintf");
                fputs(oline, stdout);
                fflush(stdout);
        }

        return EXIT_SUCCESS;
}

Attachment: signature.asc
Description: PGP signature



Home | Main Index | Thread Index | Old Index