Annotation of coherent/e/bin/ckermit/ckustr.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <sysexits.h>
        !             3: 
        !             4: /* string extraction/restoration routines */
        !             5: 
        !             6: /*
        !             7:   STR_FILE must be defined as a quoted string on the cc command line,
        !             8:   for example:
        !             9: 
        !            10:        -DSTR_FILE=\\\"/usr/local/lib/kermit5.sr\\\"
        !            11: 
        !            12:   This is the file where the strings go, and where C-Kermit looks for them
        !            13:   at runtime.
        !            14: */
        !            15: #ifdef STR_FILE
        !            16: char   *StringFile = STR_FILE;
        !            17: #else
        !            18: char   *StringFile = "/usr/local/lib/kermit5.sr";
        !            19: #endif /* STR_FILE */
        !            20: 
        !            21: #ifdef STR_CTIMED
        !            22: char   *Ctimed = STR_CTIMED;
        !            23: #else
        !            24: char   *Ctimed = "/usr/lib/ctimed";
        !            25: #endif
        !            26: 
        !            27: extern int errno;
        !            28: static int strfile = -1, ourpid = 0;
        !            29: 
        !            30: #define BUFLEN 256
        !            31: 
        !            32: errprep(offset, buf)
        !            33: unsigned short offset;
        !            34: char *buf;
        !            35: {
        !            36: register int pid = getpid();
        !            37: 
        !            38:        if (pid != ourpid) {
        !            39:                ourpid = pid;
        !            40:                if (strfile >= 0) {
        !            41:                        close(strfile);
        !            42:                        strfile = -1;
        !            43:                }
        !            44:        }
        !            45:        if (strfile < 0) {
        !            46:                char *p, *getenv();
        !            47:                if (p = getenv("KSTR"))
        !            48:                  if (strlen(p))
        !            49:                    StringFile = p;
        !            50:                strfile = open(StringFile, 0);
        !            51:                if (strfile < 0) {
        !            52: oops:
        !            53:                        fprintf(stderr, "Cannot find %s\r\n", StringFile);
        !            54:                        exit(EX_OSFILE);
        !            55:                }
        !            56:        }
        !            57:        if (lseek(strfile, (long) offset, 0) < 0
        !            58:                        || read(strfile, buf, BUFLEN) <= 0)
        !            59:                goto oops;
        !            60: }
        !            61: 
        !            62: /* extracted string front end for printf() */
        !            63: /*VARARGS1*/
        !            64: strprerror(fmt, a, b, c, d, e, f, g, h, i, j, k, l)
        !            65:        int fmt;
        !            66: {
        !            67:        char buf[BUFLEN];
        !            68: 
        !            69:        errprep(fmt, buf);
        !            70:        printf(buf, a, b, c, d, e, f, g, h, i ,j, k, l);
        !            71: }
        !            72: 
        !            73: /* extracted string front end for sprintf() */
        !            74: /*VARARGS1*/
        !            75: strsrerror(fmt, obuf, a, b, c, d, e, f, g, h, i, j, k, l)
        !            76:        int fmt;
        !            77:        char *obuf;
        !            78: {
        !            79:        char buf[BUFLEN];
        !            80: 
        !            81:        errprep(fmt, buf);
        !            82:        sprintf(obuf, buf, a, b, c, d, e, f, g, h, i, j, k, l);
        !            83: }
        !            84: 
        !            85: /* extracted string front end for fprintf() */
        !            86: /*VARARGS1*/
        !            87: strfrerror(fmt, fd, a, b, c, d, e, f, g, h, i, j, k, l)
        !            88:        int fmt, fd;
        !            89: {
        !            90:        char buf[BUFLEN];
        !            91: 
        !            92:        errprep(fmt, buf);
        !            93:        fprintf(fd, buf, a, b, c, d, e, f, g, h, i, j, k, l);
        !            94: }
        !            95: 
        !            96: /* extracted string front end for perror() */
        !            97: strperror(fmt)
        !            98:        int fmt;
        !            99: {
        !           100:        char buf[BUFLEN];
        !           101:        register int saverr = errno;
        !           102: 
        !           103:        errprep(fmt, buf);
        !           104:        errno = saverr;
        !           105:        perror(buf);
        !           106: }
        !           107: 
        !           108: perror(str)
        !           109:        char    *str;
        !           110:        {
        !           111: 
        !           112:        printf("%s: errno %d\n", str, errno);
        !           113:        }
        !           114: 
        !           115: #include       <sys/types.h>
        !           116: #include       <sys/time.h>
        !           117: 
        !           118: #define        SEND_FD W[1]
        !           119: #define        RECV_FD R[0]
        !           120: 
        !           121: #define        CTIME   1
        !           122: #define        ASCTIME 2
        !           123: #define        TZSET   3
        !           124: #define        LOCALTIME 4
        !           125: #define        GMTIME  5
        !           126: #define        OFFTIME 6
        !           127: 
        !           128:        static  int     R[2], W[2], inited;
        !           129:        static  char    result[26];
        !           130:        static  struct  tm      tmtmp;
        !           131: 
        !           132: char   *
        !           133: ctime(t)
        !           134:        time_t  *t;
        !           135:        {
        !           136:        u_char  fnc = CTIME;
        !           137: 
        !           138:        sewer();
        !           139:        write(SEND_FD, fnc, sizeof fnc);
        !           140:        write(SEND_FD, t, sizeof (*t));
        !           141:        getb(RECV_FD, result, 26);
        !           142:        return(result);
        !           143:        }
        !           144: 
        !           145: char   *
        !           146: asctime(tp)
        !           147:        struct  tm      *tp;
        !           148:        {
        !           149:        u_char  fnc = ASCTIME;
        !           150: 
        !           151:        sewer();
        !           152:        write(SEND_FD, &fnc, sizeof fnc);
        !           153:        write(SEND_FD, tp, sizeof (*tp));
        !           154:        getb(RECV_FD, result, 26);
        !           155:        return(result);
        !           156:        }
        !           157: 
        !           158: void
        !           159: tzset()
        !           160:        {
        !           161:        u_char  fnc = TZSET;
        !           162: 
        !           163:        sewer();
        !           164:        write(SEND_FD, &fnc, sizeof fnc);
        !           165:        }
        !           166: 
        !           167: struct tm *
        !           168: localtime(tp)
        !           169:        time_t  *tp;
        !           170:        {
        !           171:        u_char  fnc = LOCALTIME;
        !           172: 
        !           173:        sewer();
        !           174:        write(SEND_FD, &fnc, sizeof fnc);
        !           175:        write(SEND_FD, tp, sizeof (*tp));
        !           176:        getb(RECV_FD, &tmtmp, sizeof tmtmp);
        !           177:        getb(RECV_FD, result, 24);
        !           178:        tmtmp.tm_zone = result;
        !           179:        return(&tmtmp);
        !           180:        }
        !           181: 
        !           182: struct tm *
        !           183: gmtime(tp)
        !           184:        time_t  *tp;
        !           185:        {
        !           186:        u_char  fnc = GMTIME;
        !           187: 
        !           188:        sewer();
        !           189:        write(SEND_FD, &fnc, sizeof fnc);
        !           190:        write(SEND_FD, tp, sizeof (*tp));
        !           191:        getb(RECV_FD, &tmtmp, sizeof tmtmp);
        !           192:        getb(RECV_FD, result, 24);
        !           193:        tmtmp.tm_zone = result;
        !           194:        return(&tmtmp);
        !           195:        }
        !           196: 
        !           197: struct tm *
        !           198: offtime(clock, offset)
        !           199:        time_t  *clock;
        !           200:        long    offset;
        !           201:        {
        !           202:        u_char  fnc = OFFTIME;
        !           203: 
        !           204:        sewer();
        !           205:        write(SEND_FD, &fnc, sizeof fnc);
        !           206:        write(SEND_FD, clock, sizeof (*clock));
        !           207:        write(SEND_FD, &offset, sizeof offset);
        !           208:        getb(RECV_FD, &tmtmp, sizeof tmtmp);
        !           209:        tmtmp.tm_zone = "";
        !           210:        return(&tmtmp);
        !           211:        }
        !           212: 
        !           213: getb(f, p, n)
        !           214:        register int f, n;
        !           215:        register char *p;
        !           216:        {
        !           217:        int     i;
        !           218: 
        !           219:        while   (n)
        !           220:                {
        !           221:                i = read(f, p, n);
        !           222:                if      (i <= 0)
        !           223:                        return;
        !           224:                p += i;
        !           225:                n -= i;
        !           226:                }
        !           227:        }
        !           228: 
        !           229: sewer()
        !           230:        {
        !           231:        register int    pid, ourpid = getpid();
        !           232: 
        !           233:        if      (inited == ourpid)
        !           234:                return;
        !           235:        if      (inited)
        !           236:                {
        !           237:                close(SEND_FD);
        !           238:                close(RECV_FD);
        !           239:                }
        !           240:        pipe(W);
        !           241:        pipe(R);
        !           242:        pid = vfork();
        !           243:        if      (pid == 0)
        !           244:                {                       /* child */
        !           245:                alarm(0);               /* cancel alarms */
        !           246:                dup2(W[0], 0);          /* parent write side to our stdin */
        !           247:                dup2(R[1], 1);          /* parent read side to our stdout */
        !           248:                close(SEND_FD);         /* copies made, close the... */
        !           249:                close(RECV_FD);         /* originals now */
        !           250:                execl(Ctimed, "ctimed", 0);
        !           251:                _exit(EX_OSFILE);
        !           252:                }
        !           253:        if      (pid == -1)
        !           254:                abort();                /* nothing else really to do */
        !           255:        close(W[0]);                    /* close read side of SEND channel */
        !           256:        close(R[1]);                    /* close write side of RECV channel */
        !           257:        inited = ourpid;                /* don't do this again in this proc */
        !           258:        }
        !           259: 
        !           260: XXctime()
        !           261:        {
        !           262: 
        !           263:        if      (SEND_FD)
        !           264:                close(SEND_FD);
        !           265:        if      (RECV_FD)
        !           266:                close(RECV_FD);
        !           267:        SEND_FD = RECV_FD = 0;
        !           268:        inited = 0;
        !           269:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.