Annotation of 42BSD/ingres/source/support/timefix.c, revision 1.1

1.1     ! root        1: # include      <sccs.h>
        !             2: 
        !             3: SCCSID(@(#)timefix.c   7.1     2/5/81)
        !             4: 
        !             5: /*
        !             6: ** TIMEFIX -- patch binary program to correct for timezone changes.
        !             7: **
        !             8: **     Timefix is compiled with the ctime(III) variables:
        !             9: **             daylight,
        !            10: **             timezone,
        !            11: **             tzname[]
        !            12: **
        !            13: **     Each file specified is examined to see if it contains
        !            14: **     all of these variables. If it does then the current values
        !            15: **     of those variables for that file are given. If the "-u" flag
        !            16: **     is specified then the values are not overwritten.
        !            17: **
        !            18: **     The other flags can be used to override the values of the
        !            19: **     variables; specifically:
        !            20: **             -sxxx  --> timezone     (xxx converted from ascii to binary)
        !            21: **             -dx    --> daylight     (x converted from ascii to binary)
        !            22: **             -tXXXYYY -> tzname[0] = "XXX" and tzname[1] = "YYY"
        !            23: */
        !            24: 
        !            25: struct header
        !            26: {
        !            27:        int     magic;
        !            28:        int     tsize;
        !            29:        int     dsize;
        !            30:        int     bss;
        !            31:        int     ssize;
        !            32:        int     start_ad;
        !            33:        int     unused;
        !            34:        int     reloc_flag;
        !            35: };
        !            36: 
        !            37: struct sym
        !            38: {
        !            39:        char    symname[8];
        !            40:        int     type;
        !            41:        int     value;
        !            42: };
        !            43: 
        !            44: 
        !            45: /* these values are defined in the unix ctime() routine */
        !            46: extern int     daylight;
        !            47: extern int     timezone;
        !            48: extern char    *tzname[];
        !            49: 
        !            50: int    Noupdate;
        !            51: 
        !            52: main(argc, argv)
        !            53: int    argc;
        !            54: char   *argv[];
        !            55: {
        !            56: 
        !            57:        if (argc < 2)
        !            58:        {
        !            59:                printf("usage: timefix filename ...\n");
        !            60:                exit (1);
        !            61:        }
        !            62: 
        !            63:        argc--;
        !            64:        argv++;
        !            65: 
        !            66:        if (checkflags(&argc, argv))
        !            67:                exit (1);
        !            68: 
        !            69:        pr_values("your installation", timezone, tzname[0], tzname[1], daylight);
        !            70: 
        !            71:        while (argc--)
        !            72:                newtime(*argv++);
        !            73: }
        !            74: /*
        !            75: **  NEWTIME
        !            76: */
        !            77: 
        !            78: newtime(filename)
        !            79: char   *filename;
        !            80: {
        !            81:        struct sym      timez, name_st, name_dy, dayflag;
        !            82:        struct header   head;
        !            83:        register int    i, fdes;
        !            84:        int             adr, secs;
        !            85:        char            std[4], dyl[4];
        !            86: 
        !            87:        if ((fdes = openheader(&head, filename)) < 0)
        !            88:                return (-1);
        !            89: 
        !            90:        bmove("_timezon", timez.symname, 8);
        !            91:        bmove("_tzname\0", name_st.symname, 8);
        !            92:        bmove("_dayligh", dayflag.symname, 8);
        !            93: 
        !            94:        /* pick up addresses from symbol table */
        !            95:        i = findsymbol(&head, fdes, &timez);
        !            96:        i |= findsymbol(&head, fdes, &name_st);
        !            97:        i |= findsymbol(&head, fdes, &dayflag);
        !            98: 
        !            99:        if (i)
        !           100:        {
        !           101:                printf("File %s does not need to be corrected\n", filename);
        !           102:                close(fdes);
        !           103:                return (-2);
        !           104:        }
        !           105: 
        !           106:        /* form entries for pointer to "PST" and "PDT" */
        !           107:        i = getvalue(&head, fdes, &name_st, &adr, 2);
        !           108:        name_st.value += 2;
        !           109:        i |= getvalue(&head, fdes, &name_st, &name_dy.value, 2);
        !           110:        name_dy.type = name_st.type;
        !           111:        name_st.value = adr;
        !           112: 
        !           113:        if (i)
        !           114:        {
        !           115:                printf("can't find pointers to timezone names in %s\n", filename);
        !           116:                close(fdes);
        !           117:                return (-3);
        !           118:        }
        !           119: 
        !           120:        /* now print out current values */
        !           121:        i = getvalue(&head, fdes, &timez, &secs, 2);
        !           122:        i |= getvalue(&head, fdes, &name_st, std, 4);
        !           123:        i |= getvalue(&head, fdes, &name_dy, dyl, 4);
        !           124:        i |= getvalue(&head, fdes, &dayflag, &adr, 2);
        !           125: 
        !           126:        if (i)
        !           127:        {
        !           128:                printf("one or more symbols cannot be read from %s\n", filename);
        !           129:                close(fdes);
        !           130:                return (-4);
        !           131:        }
        !           132: 
        !           133:        pr_values(filename, secs, std, dyl, adr);
        !           134: 
        !           135:        if (!Noupdate)
        !           136:        {
        !           137:                if (putvalue(&head, fdes, &timez, &timezone, 2)
        !           138:                        || putvalue(&head, fdes, &name_st, tzname[0], 4)
        !           139:                        || putvalue(&head, fdes, &name_dy, tzname[1], 4)
        !           140:                        || putvalue(&head, fdes, &dayflag, &daylight, 2))
        !           141:                {
        !           142:                        printf("cannot update %s with new values\n", filename);
        !           143:                        close(fdes);
        !           144:                        return (-2);
        !           145:                }
        !           146:                else
        !           147:                        printf("File %s updated.\n", filename);
        !           148:        }
        !           149: 
        !           150: 
        !           151:        close(fdes);
        !           152: 
        !           153:        return (0);
        !           154: }
        !           155: /*
        !           156: **     Open the indicated file and read & verify header
        !           157: */
        !           158: 
        !           159: openheader(hd, filename)
        !           160: struct header  *hd;
        !           161: char           *filename;
        !           162: {
        !           163:        register int    fd, i;
        !           164: 
        !           165:        if ((fd = open(filename, 2)) < 0)
        !           166:        {
        !           167:                printf("can't open file %s\n", filename);
        !           168:                return (-1);
        !           169:        }
        !           170: 
        !           171:        if ((i = read(fd, hd, sizeof (*hd))) != sizeof (*hd))
        !           172:        {
        !           173:                printf("can't read in header\n");
        !           174:                close(fd);
        !           175:                return  (-2);
        !           176:        }
        !           177: 
        !           178:        switch (hd->magic)
        !           179:        {
        !           180: 
        !           181:          case 0407:
        !           182:          case 0410:
        !           183:          case 0411:
        !           184:                if (hd->ssize)
        !           185:                        break;
        !           186:                printf("File %s does not have a symbol table.\n", filename);
        !           187:                return (-4);
        !           188: 
        !           189:          default:
        !           190:                printf("%s not an object file\n", filename);
        !           191:                return (-3);
        !           192:        }
        !           193: 
        !           194:        return (fd);
        !           195: }
        !           196: /*
        !           197: **     Seek to beginning of symbol table
        !           198: */
        !           199: 
        !           200: startsymbol(hd, fdx)
        !           201: struct header  *hd;
        !           202: int            fdx;
        !           203: {
        !           204:        register int            i, fd;
        !           205:        register struct header  *h;
        !           206:        long                    offset;
        !           207:        long                    itol();
        !           208: 
        !           209:        h = hd;
        !           210:        fd = fdx;
        !           211: 
        !           212:        /* seek past header */
        !           213:        i = lseek(fd, 16L, 0);
        !           214: 
        !           215:        /* seek to start of symbol table */
        !           216:        offset = itol(h->tsize);
        !           217:        offset = offset + itol(h->dsize);
        !           218:        if (h->reloc_flag == 0)
        !           219:                offset += offset;
        !           220: 
        !           221:        i |= lseek(fd, offset, 1);
        !           222: 
        !           223:        if (i < 0)
        !           224:        {
        !           225:                printf("can't seek to symbol table\n");
        !           226:                return (-1);
        !           227:        }
        !           228: 
        !           229:        return (0);
        !           230: }
        !           231: /*
        !           232: **     Locate symbol in symbol table and return sucess-failure
        !           233: */
        !           234: 
        !           235: findsymbol(hd, fd, s)
        !           236: struct header  *hd;
        !           237: int            fd;
        !           238: struct sym     *s;
        !           239: {
        !           240:        register int    i, j;
        !           241:        struct sym      next;
        !           242: 
        !           243:        if (startsymbol(hd, fd))
        !           244:                return (-1);
        !           245: 
        !           246:        for (i = hd->ssize; i--; )
        !           247:        {
        !           248:                j = read(fd, &next, sizeof (next));
        !           249: 
        !           250:                if (j != sizeof (next))
        !           251:                {
        !           252:                        if (j)
        !           253:                                printf("symbol table error %d,%d,%d\n", hd->ssize, i, j);
        !           254:                        return (-1);
        !           255:                }
        !           256: 
        !           257:                if (bequal(next.symname, s->symname, sizeof (next.symname)))
        !           258:                {
        !           259:                        s->type = next.type;
        !           260:                        s->value = next.value;
        !           261:                        return (0);
        !           262:                }
        !           263:        }
        !           264: 
        !           265:        return (1);
        !           266: }
        !           267: /*
        !           268: **  GETVALUE
        !           269: */
        !           270: 
        !           271: getvalue(hd, fd, s, cp, len)
        !           272: struct header  *hd;
        !           273: int            fd;
        !           274: struct sym     *s;
        !           275: char           *cp;
        !           276: int            len;
        !           277: {
        !           278:        register int    i;
        !           279:        long            getaddr(), addr;
        !           280: 
        !           281:        addr = getaddr(hd, s);
        !           282:        if (addr == -1)
        !           283:                return (-1);
        !           284: 
        !           285:        if (lseek(fd, addr, 0) < 0)
        !           286:                return (-1);
        !           287: 
        !           288:        if ((i = read(fd, cp, len)) != len)
        !           289:                return (-1);
        !           290: 
        !           291:        return (0);
        !           292: }
        !           293: /*
        !           294: **  PUTVALUE
        !           295: */
        !           296: 
        !           297: 
        !           298: putvalue(hd, fd, s, loc, len)
        !           299: struct header  *hd;
        !           300: int            fd;
        !           301: struct sym     *s;
        !           302: char           *loc;
        !           303: int            len;
        !           304: {
        !           305:        long            adr, getaddr();
        !           306: 
        !           307:        adr = getaddr(hd, s);
        !           308:        if (adr == -1)
        !           309:                return (-1);
        !           310: 
        !           311:        if (lseek(fd, adr, 0) < 0)
        !           312:                return (-1);
        !           313: 
        !           314:        if (write(fd, loc, len) != len)
        !           315:                return (-2);
        !           316: 
        !           317:        return (0);
        !           318: }
        !           319: /*
        !           320: **  PR_VALUES
        !           321: */
        !           322: 
        !           323: pr_values(str, secs, std, dyl, flag)
        !           324: char   *str;
        !           325: int    secs;
        !           326: char   *std;
        !           327: char   *dyl;
        !           328: int    flag;
        !           329: {
        !           330:        printf("\nCurrent values for %s are:\n\t# seconds past greenwich:  %d\n", str, secs);
        !           331:        printf("\ttimezones:  %.4s and %.4s\n\tdaylight saving flag:  %d\n", std, dyl, flag);
        !           332: }
        !           333: /*
        !           334: **  CHECKFLAGS
        !           335: */
        !           336: 
        !           337: checkflags(argc, argv)
        !           338: int    *argc;
        !           339: char   *argv[];
        !           340: {
        !           341:        register char   *cp, **nargv;
        !           342:        register int    cnt;
        !           343:        int             ret;
        !           344: 
        !           345:        ret = 0;
        !           346:        cnt = *argc;
        !           347:        nargv = argv;
        !           348:        while (cnt--)
        !           349:        {
        !           350:                cp = *argv++;
        !           351:                if (*cp == '-')
        !           352:                {
        !           353:                        (*argc)--;
        !           354:                        cp++;
        !           355:                        switch (*cp++)
        !           356:                        {
        !           357: 
        !           358:                          case 's':
        !           359:                                timezone = atoi(cp);
        !           360:                                break;
        !           361: 
        !           362:                          case 't':
        !           363:                                bmove(cp, tzname[0], 3);
        !           364:                                bmove(cp+3, tzname[1], 3);
        !           365:                                break;
        !           366: 
        !           367:                          case 'd':
        !           368:                                daylight = atoi(cp);
        !           369:                                break;
        !           370: 
        !           371:                          case 'u':
        !           372:                                Noupdate++;
        !           373:                                break;
        !           374: 
        !           375:                          default:
        !           376:                                printf("bad flag %s\n", cp - 2);
        !           377:                                ret = -1;
        !           378:                        }
        !           379:                }
        !           380:                else
        !           381:                        *nargv++ = cp;
        !           382:        }
        !           383: 
        !           384:        return (ret);
        !           385: }
        !           386: 
        !           387: 
        !           388: bmove(src, dst, len)
        !           389: char   *src;
        !           390: char   *dst;
        !           391: int    len;
        !           392: {
        !           393:        register int    i;
        !           394:        register char   *s, *d;
        !           395: 
        !           396:        s = src;
        !           397:        d = dst;
        !           398:        i = len;
        !           399: 
        !           400:        while (i--)
        !           401:                *d++ = *s++;
        !           402: }
        !           403: 
        !           404: 
        !           405: bequal(s1, s2, len)
        !           406: char   *s1;
        !           407: char   *s2;
        !           408: int    len;
        !           409: {
        !           410:        register int    i;
        !           411:        register char   *s, *d;
        !           412: 
        !           413:        s = s1;
        !           414:        d = s2;
        !           415:        i = len;
        !           416: 
        !           417:        while (i--)
        !           418:                if (*s++ != *d++)
        !           419:                        return (0);
        !           420: 
        !           421:        return (1);
        !           422: }
        !           423: /*
        !           424: **  GETADDR
        !           425: */
        !           426: 
        !           427: long
        !           428: getaddr(hd, s)
        !           429: struct header  *hd;
        !           430: struct sym     *s;
        !           431: {
        !           432:        long    addr;
        !           433:        int     i;
        !           434:        long    l;
        !           435:        long    itol();
        !           436: 
        !           437:        addr = s->value + 16;   /* offset past header */
        !           438: 
        !           439:        switch (s->type)
        !           440:        {
        !           441: 
        !           442:          /* extern text segment */
        !           443:          case 042:
        !           444:                return (addr);
        !           445: 
        !           446:          /* data segment extern */
        !           447:          case 043:
        !           448:                switch (hd->magic)
        !           449:                {
        !           450: 
        !           451:                  case 0407:
        !           452:                        return (addr);
        !           453: 
        !           454:                  case 0410:
        !           455:                        /* subtract space between text and data */
        !           456:                        l = itol(hd->tsize) + 017777;
        !           457:                        l &= ~017777;
        !           458: 
        !           459:                        return (addr - (l - itol(hd->tsize)));
        !           460: 
        !           461:                  case 0411:
        !           462:                        return (addr + itol(hd->tsize));
        !           463: 
        !           464:                }
        !           465:          default:
        !           466:                printf("Invalid symbol type %o\n", s->type);
        !           467:                return (-1);
        !           468:        }
        !           469: }
        !           470: 
        !           471: 
        !           472: long itol(value)
        !           473: int    value;
        !           474: {
        !           475:        long    ret;
        !           476:        int     *ip;
        !           477: 
        !           478:        ret = value;
        !           479:        ip = &ret;
        !           480:        *ip = 0;
        !           481: 
        !           482:        return (ret);
        !           483: }

unix.superglobalmegacorp.com

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