BSD 1 development
authorHoward Katseff <hpk@ucbvax.Berkeley.EDU>
Sun, 27 Nov 1977 02:14:03 +0000 (18:14 -0800)
committerHoward Katseff <hpk@ucbvax.Berkeley.EDU>
Sun, 27 Nov 1977 02:14:03 +0000 (18:14 -0800)
Work on file s6/sess.c

Synthesized-from: 1bsd

s6/sess.c [new file with mode: 0644]

diff --git a/s6/sess.c b/s6/sess.c
new file mode 100644 (file)
index 0000000..4073a6c
--- /dev/null
+++ b/s6/sess.c
@@ -0,0 +1,176 @@
+/*
+ * sess - determines clock time used so far this session by this user
+ *       or for tty or user supplied as an argument
+ *
+ * Author: Howard Katseff
+ *
+ * Note that 'sess ~' gives time since system last started.
+ */
+
+struct {long l1;};
+struct {char c1, c2, c3, c4;};
+char buf[32];
+
+main(argc, argv)
+char **argv; {
+       int f, i;
+       char t[2], *p;
+       long lx;
+       int intrp();
+
+       t[1] = 0;
+       f = open("/usr/adm/wtmp", 0);
+       if (f < 0) {
+               printf("Can't open /usr/adm/wtmp\n");
+               exit();
+               }
+       fstat(f, buf);
+
+       lx.c2 = 0;
+       lx.c1 = buf[9];
+       lx.c3 = buf[10] & 0360;
+       lx.c4 = buf[11];
+
+       blseek(f, lx, 0);
+
+       if (argc <= 1) {
+               t[0] = ttyn(2);
+               p = t;
+               }
+       else p = argv[1];
+
+       if ((signal(2,1) && 01) == 0) signal(2, &intrp);
+
+       for (;;) {
+               if (bread(f, buf+16, -16) < 16) exit();
+               lx =- 16;
+               if (equal(p, buf)) {
+                       if (*(p+1) != '\0') {
+                               t[0] = buf[8];
+                               p = t;
+                               blseek(f, lx+16, 0);
+                               while(bread(f, buf, 16) > 0)
+                                       if (equal(p, buf)) goto l1;
+                               blseek(f, lx, 0);
+                               bread(f, buf, 16);
+                          l1:; }
+                       time(&lx);
+                       lx =+ 231231630 - (buf+10)->l1;
+                       printf("Elapsed time:");
+                       if (lx < 231318030)
+                               printf(" %5.5s", 11+ctime(&lx));
+                       else
+                               printf(" %ld + %5.5s",(lx-231231630)/86400,
+                                       11+ctime(&lx));
+                       if (buf[0] == '\0' && *p != '~')
+                               printf(" since logout\n");
+                       else putchar('\n');
+                       exit();
+                       }
+               }
+       }
+
+
+equal(c1, c2)
+char *c1, *c2; {
+       int i;
+
+       if (*(c1+1) == '\0') {
+               if (*c1 == *(c2+8)) return(1);
+               else return(0);
+               }
+
+       for (i=0; i<8; i++) {
+               if (*c1 == '\0') return(*c2 == ' ');
+               if (*c1++ != *c2++) return(0);
+               }
+
+       return(1);
+       }
+
+intrp() {
+       register char *q;
+
+       signal(2,1);
+
+       q = ctime(buf+10);
+       printf("interrupted at  %10.10s  %5.5s \n",
+               q, 11+q);
+
+       exit();
+       }
+/*
+ * NAME:  bread(), brseek(), blseek()
+ *
+ * DESCRIPTION:
+ *      This is a buffered read package which simulates  read(), seek() and
+ *      lseek().
+ *       Bread may be called with a negative nbytes which causes it to
+ *      read backwards .  In this case, buffer should point to the first
+ *      byte following the buffer.  If only a partial read is possible
+ *      (due to beginning of file), only the last bytes of the buffer
+ *      will be filled.
+ */
+
+int    i, j, k;
+int    nl, nr;
+char   *next;
+char   b[512];
+
+bread(file, buff, nbytes)
+char *buff; {
+       register nb;
+
+       if (nbytes > 0) {
+               for (nb=nbytes; nb>0; nb--) {
+                       if (nr == 0) {
+                               nr = read(file, next=b, 512);
+                               nl = 0;
+                               if (nr < 0) return(-1);
+                               if (nr == 0) return(nbytes-nb);
+                               }
+                       *buff++ = *next++;
+                       nr--;
+                       nl++;
+                       }
+               }
+       else {
+               nbytes = -nbytes;
+               for (nb=nbytes; nb>0; nb--) {
+                       if (nl == 0) {
+                               seek(file, -(512 + nr), 1);
+                               nl = read(file, b, 512);
+                               if (nl < 0) {
+                                       for (k=511; k>0; k--) {
+                                               seek(file, 1, 1);
+                                               nl = read(file, b, k);
+                                               if (nl >= 0) break;
+                                               }
+                                       if (nl < 0) return(nbytes-nb);
+                                       }
+                               if (nl == 0) return(nbytes-nb);
+                               next = b + nl;
+                               nr = 0;
+                               }
+                       *--buff = *--next;
+                       nr++;
+                       nl--;
+                       }
+               }
+       return(nbytes);
+       }
+
+
+brseek(file, offset, flag) {
+       nl = 0;
+       nr = 0;
+       return(seek(file,offset,flag));
+       }
+
+
+blseek(file, offset, flag) 
+long offset; {
+       nl = 0;
+       nr = 0;
+       return(lseek(file,offset,flag));
+       }