Annotation of coherent/g/usr/bin/vi/elvrec.c, revision 1.1

1.1     ! root        1: /* elvrec.c */
        !             2: 
        !             3: /* This file contains the file recovery program */
        !             4: 
        !             5: /* Author:
        !             6:  *     Steve Kirkendall
        !             7:  *     14407 SW Teal Blvd. #C
        !             8:  *     Beaverton, OR 97005
        !             9:  *     [email protected]
        !            10:  */
        !            11: 
        !            12: 
        !            13: #include <stdio.h>
        !            14: #include "config.h"
        !            15: #include "vi.h"
        !            16: 
        !            17: void recover P_((char *, char *));
        !            18: void main P_((int, char **));
        !            19: 
        !            20: 
        !            21: void recover(basename, outname)
        !            22:        char    *basename;      /* the name of the file to recover */
        !            23:        char    *outname;       /* the name of the file to write to */
        !            24: {
        !            25:        char    pathname[500];  /* full pathname of the file to recover */
        !            26:        char    line[600];      /* a line from the /usr/preserve/Index file */
        !            27:        int     ch;             /* a character from the text being recovered */
        !            28:        FILE    *from;          /* the /usr/preserve file, or /usr/preserve/Index */
        !            29:        FILE    *to;            /* the user's text file */
        !            30:        char    *ptr;
        !            31: #if OSK
        !            32:        int             uid;
        !            33: #endif
        !            34: 
        !            35:        /* convert basename to a full pathname */
        !            36:        if (basename)
        !            37:        {
        !            38: #ifndef CRUNCH
        !            39: # if MSDOS || TOS
        !            40:                if (!basename[0] || basename[1] != ':')
        !            41: # else
        !            42:                if (basename[0] != SLASH)
        !            43: # endif
        !            44:                {
        !            45:                        ptr = getcwd(pathname, sizeof pathname);
        !            46:                        if (ptr != pathname)
        !            47:                        {
        !            48:                                strcpy(pathname, ptr);
        !            49:                        }
        !            50:                        ptr = pathname + strlen(pathname);
        !            51:                        *ptr++ = SLASH;
        !            52:                        strcpy(ptr, basename);
        !            53:                }
        !            54:                else
        !            55: #endif
        !            56:                {
        !            57:                        strcpy(pathname, basename);
        !            58:                }
        !            59:        }
        !            60: 
        !            61: #if OSK
        !            62:        uid = getuid();
        !            63:        if(setuid(0))
        !            64:                exit(_errmsg(errno, "Can't set uid\n"));
        !            65: #endif
        !            66:        /* scan the /usr/preserve/Index file, for the *oldest* unrecovered
        !            67:         * version of this file.
        !            68:         */
        !            69:        from = fopen(PRSVINDEX, "r");
        !            70:        while (from && fgets(line, sizeof line, from))
        !            71:        {
        !            72:                /* strip off the newline from the end of the string */
        !            73:                line[strlen(line) - 1] = '\0';
        !            74: 
        !            75:                /* parse the line into a "preserve" name and a "text" name */
        !            76:                for (ptr = line; *ptr != ' '; ptr++)
        !            77:                {
        !            78:                }
        !            79:                *ptr++ = '\0';
        !            80: 
        !            81:                /* If the "preserve" file is missing, then ignore this line
        !            82:                 * because it describes a file that has already been recovered.
        !            83:                 */
        !            84:                if (access(line, 0) < 0)
        !            85:                {
        !            86:                        continue;
        !            87:                }
        !            88: 
        !            89:                /* are we looking for a specific file? */
        !            90:                if (basename)
        !            91:                {
        !            92:                        /* quit if we found it */
        !            93:                        if (!strcmp(ptr, pathname))
        !            94:                        {
        !            95:                                break;
        !            96:                        }
        !            97:                }
        !            98:                else
        !            99:                {
        !           100:                        /* list this file as "available for recovery" */
        !           101:                        puts(ptr);
        !           102:                }
        !           103:        }
        !           104: 
        !           105:        /* file not found? */
        !           106:        if (!basename || !from || feof(from))
        !           107:        {
        !           108:                if (from != NULL) fclose(from);
        !           109:                if (basename)
        !           110:                {
        !           111:                        fprintf(stderr, "%s: no recovered file has that exact name\n", pathname);
        !           112:                }
        !           113:                return;
        !           114:        }
        !           115:        if (from != NULL) fclose(from);
        !           116: 
        !           117:        /* copy the recovered text back into the user's file... */
        !           118: 
        !           119:        /* open the /usr/preserve file for reading */
        !           120:        from = fopen(line, "r");
        !           121:        if (!from)
        !           122:        {
        !           123:                perror(line);
        !           124:                exit(2);
        !           125:        }
        !           126: 
        !           127: #if ANY_UNIX
        !           128:        /* Be careful about user-id.  We want to be running under the user's
        !           129:         * real id when we open/create the user's text file... but we want
        !           130:         * to be superuser when we delete the /usr/preserve file.  For UNIX,
        !           131:         * we accomplish this by deleting the /usr/preserve file *now*,
        !           132:         * when it is open but before we've read it.  Then we revert to the
        !           133:         * user's real id.
        !           134:         */
        !           135:        unlink(line);
        !           136:        setuid(getuid());
        !           137: #endif
        !           138: #if OSK
        !           139:        setuid(uid);
        !           140: #endif
        !           141: 
        !           142:        if (outname == NULL) return;
        !           143: 
        !           144:        /* open the user's file for writing */
        !           145:        to = fopen(outname, "w");
        !           146:        if (!to)
        !           147:        {
        !           148:                perror(ptr);
        !           149:                exit(2);
        !           150:        }
        !           151: 
        !           152:        /* copy the text */
        !           153:        while ((ch = getc(from)) != EOF)
        !           154:        {
        !           155:                putc(ch, to);
        !           156:        }
        !           157: 
        !           158: #if !ANY_UNIX
        !           159: #if OSK
        !           160:        fclose(from);
        !           161:        setuid(0);
        !           162: #endif
        !           163:        /* delete the /usr/preserve file */
        !           164:        unlink(line);
        !           165: #if OSK
        !           166:        setuid(uid);
        !           167: #endif
        !           168: #endif
        !           169: }
        !           170: 
        !           171: void
        !           172: main(argc, argv)
        !           173:        int     argc;
        !           174:        char    **argv;
        !           175: {
        !           176:        /* check arguments */
        !           177:        if (argc > 3)
        !           178:        {
        !           179:                fprintf(stderr, "usage: %s [preserved_file [recovery_file]]\n", argv[0]);
        !           180:                exit(2);
        !           181:        }
        !           182: 
        !           183:        /* recover the requested file, or list recoverable files */
        !           184:        if (argc == 3)
        !           185:        {
        !           186:                /* recover the file, but write it to a different filename */
        !           187:                recover (argv[1], argv[2]);
        !           188:        }
        !           189:        else if (argc == 2)
        !           190:        {
        !           191:                /* recover the file */
        !           192:                recover(argv[1], argv[1]);
        !           193:        }
        !           194:        else
        !           195:        {
        !           196:                /* list the recoverable files */
        !           197:                recover((char *)0, (char *)0);
        !           198:        }
        !           199: 
        !           200:        /* success! */
        !           201:        exit(0);
        !           202: }

unix.superglobalmegacorp.com

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