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

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

unix.superglobalmegacorp.com

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