Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!usc!ucsd!pacbell.com!att!att!cbnewsm!cbnewsl!bonnie!rbr From: rbr@bonnie.ATT.COM (4197,ATTT) Newsgroups: comp.unix.shell Subject: Re: How to put something on Status line Keywords: csh,status,VT100 Message-ID: <1990Nov1.180501.3226@cbnewsl.att.com> Date: 1 Nov 90 18:05:01 GMT References: <152961@felix.UUCP> Sender: @cbnewsl.att.com Reply-To: rbr@bonnie.ATT.COM (Bob Rager) Distribution: na Organization: AT&T Bell Laboratories Lines: 239 Bob Rager -------------------- CUT HERE --------------------- /* cc -O -s -o ${HOME}/bin/time_line timeline.c -lcurses */ /* Name: time_line ** ** INVOCATION: time_line [-d] [-m] ** ** DESCRIPTION: ** ** "time_line" is a program to print the current date and time ** on the 25'th line - status line - of terminals that have that ** capability. If "time_line" is called and the terminal does not ** have a status line capability, the program exits gracefully. ** Otherwise, the status line is cleared and the date (mm/dd) time ** (hh:mm) is printed on the status line. The time is updated every ** minute. Also the MAILPATH environment variable is accessed on each ** cycle to determine if you have mail. The first time mail is detected ** the message "MAIL" is appended to the date and time. The next cycle ** the message "mail" is appended. When you process the mail, the message ** disappears on the next cycle. ** ** The program illustrates the use of curses control of the cursor to ** print on the 25'th line; and to replace the cursor for the user. ** ** Note that the program forks a child process after supressing interupt ** and lets the parent process die. This is the way to do the UNIX ** equivalent of an MSDOS TSR. The child stays in the system as an ** orphaned process but supressing SIGINT and SIGQUIT keeps the system ** from eventually killing the process. SIGHUP (hangup) kills the process ** but allows the process to clean up before leaving. */ #include #include #include #include #include #include /* Global variables */ char to_status_line[80]; char from_status_line[80]; char dis_status_line[80]; char clr_eol[100]; char rev_out[20]; char rev_end[20]; int eslok, columns ; int quiet = 0; int mail = 1; int debug = 0; short uid, pid, lpid; void clr_status_line(); /* Global Functions */ outc(c) char c; { putchar(c);} main(argc, argv) int argc; char *argv[]; { int c, i; struct tm *tm, *localtime(); time_t now, tenmin; char msg[BUFSIZ], *p, *host, *strchr(); char *mfile, *getenv(); struct stat new_st, old_st; void (*status_fmt)(); void prt_status_line(), ctrm_status(); extern char *optarg; extern int optind; FILE *fp = NULL; signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); signal(SIGHUP,clr_status_line); signal(SIGTERM,clr_status_line); status_fmt = prt_status_line; while((c = getopt(argc, argv, "cdm")) != EOF) { switch(c) { case 'd': debug = 1 ; signal(SIGINT, clr_status_line); signal(SIGQUIT, SIG_DFL); break; case 'm': mail = 0 ; break; default: exit(1); break; } } initterm(); /* This will allow starting from .profile */ /* immediately fork and let the parent die */ if(!debug) { switch(fork()) { case -1: /* fork failed */ perror("fork"); exit(1); case 0: /* child */ break; default: /* parent dies */ exit(0); break; } } uid= getuid(); pid= getpid(); mfile = getenv("MAIL"); if( debug ) printf("%s\n", mfile); close(0); close(1); fcntl(2, F_DUPFD, 1); if(stat(mfile, &old_st) < 0) { old_st.st_mtime = 0; old_st.st_atime = 0; } while( 1 ){ time(&now); tm = localtime(&now); sprintf(msg, "%d/%d %d:%02d ", tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min); tenmin = now - (10*60); if( mail ){ if(stat(mfile, &new_st) >= 0) { if((new_st.st_size > 0) && (new_st.st_mtime > new_st.st_atime)) { if(new_st.st_mtime > old_st.st_mtime) { putc('\007', stdout); strcat(msg, " MAIL"); } else { strcat(msg, " mail"); } } old_st = new_st; } } (*status_fmt)(msg); sleep(60 - (now%60)); } } void prt_status_line(msg) char *msg; { int adj = 0; tputs(tparm(to_status_line, 0), 1, outc); tputs(clr_eol, 1, outc); tputs(from_status_line, 1, outc); fflush(stdout); tputs(tparm(to_status_line, 0), 1, outc); tputs(msg, 1, outc); tputs(from_status_line, 1, outc); fflush(stdout); } void clr_status_line() { printf("%s%s%s%s", tparm(to_status_line, 0), clr_eol, from_status_line, dis_status_line); fflush(stdout); exit(0); } initterm() { char *term, cp[256], *r, *tgetstr(); char tbuf[2*1024]; if ((term=getenv("TERM")) == NULL) { if (!quiet) fprintf(stderr, "sysline: No TERM variable in enviroment\n"); exit(1); } if (tgetent(tbuf, term) <= 0) { if (!quiet) fprintf(stderr, "sysline: Unknown terminal type: %s\n", term); exit(1); } if (tgetflag("hs") <= 0) { if (!quiet) fprintf(stderr, "sysline: No status capability for %s\n", term); exit(1); } if(r = tgetstr("i1", cp)) { tputs(r, 1, outc); } if(r = tgetstr("is", cp)) { tputs(r, 1, outc); } if(r = tgetstr("i3", cp)) { tputs(r, 1, outc); } fflush(stdout); /* the "-1" below is to avoid cursor wraparound problems */ if((columns=tgetnum("ws")) <= 0) { /* special width of status line */ columns = tgetnum("co"); } columns -= 1; if(r = tgetstr("ts", cp)) { strcpy(to_status_line, r); } if(r = tgetstr("fs", cp)) { strcpy(from_status_line, r); } if(r = tgetstr("ds", cp)) { strcpy(dis_status_line, r); } eslok = tgetflag("es"); if(eslok) { if(r = tgetstr("ce", cp)) { strcpy(clr_eol, r); } if(r = tgetstr("so", cp)) { strcpy(rev_out, r); } if(r = tgetstr("se", cp)) { strcpy(rev_end, r); } } else { int i; for(i=0;i < columns ; i++) clr_eol[i] = ' '; strcpy(rev_out,""); strcpy(rev_end,""); } } ------------------------ END OF C SOURCE ----------------------