Annotation of researchv10no/cmd/uucp/cpmv.c, revision 1.1

1.1     ! root        1: 
        !             2: /*     /sccs/src/cmd/uucp/s.cpmv.c
        !             3:        cpmv.c  1.4     8/30/84 17:37:15
        !             4: */
        !             5: #include "uucp.h"
        !             6: VERSION(@(#) c cpmv.c 1.4);
        !             7: 
        !             8: /*
        !             9:  * copy f1 to f2 locally
        !            10:  *     f1      -> source file name
        !            11:  *     f2      -> destination file name
        !            12:  * return:
        !            13:  *     0       -> ok
        !            14:  *     FAIL    -> failed
        !            15:  */
        !            16: 
        !            17: xcp(f1, f2)
        !            18: char *f1, *f2;
        !            19: {
        !            20:        register FILE *fp1, *fp2;
        !            21:        register int n;
        !            22:        char buf[BUFSIZ];
        !            23:        char full[MAXFULLNAME];
        !            24: 
        !            25:        if ((fp1 = fopen(f1, "r")) == NULL)
        !            26:                return(FAIL);
        !            27:        (void) strcpy(full, f2);
        !            28:        if (DIRECTORY(f2)) {
        !            29:            (void) strcat(full, "/");
        !            30:            (void) strcat(full, BASENAME(f1, '/'));
        !            31:            (void) strcpy(f2, full);
        !            32:        }
        !            33: 
        !            34:        DEBUG(4, "full %s\n", full);
        !            35:        if ((fp2 = fopen(full, "w")) == NULL) {
        !            36:            (void) fclose(fp1);
        !            37:            return(FAIL);
        !            38:        }
        !            39:        (void) chmod(full, 0666);
        !            40: 
        !            41:        /* copy -- check errors later */
        !            42:        while ( (n = fread(buf, sizeof (char), sizeof buf, fp1)) != 0)
        !            43:            (void) fwrite(buf, sizeof (char), n, fp2);
        !            44: 
        !            45:        /* check for any errors */
        !            46:        n = ferror(fp1) | ferror(fp2);
        !            47:        n |= fclose(fp1) | fclose(fp2);
        !            48: 
        !            49:        if (n)
        !            50:            return(FAIL);
        !            51:        return(0);
        !            52: }
        !            53: 
        !            54: 
        !            55: /*
        !            56:  * move f1 to f2 locally
        !            57:  * returns:
        !            58:  *     0       -> ok
        !            59:  *     FAIL    -> failed
        !            60:  */
        !            61: 
        !            62: xmv(f1, f2)
        !            63: register char *f1, *f2;
        !            64: {
        !            65:        register int ret;
        !            66:        int oerrno = 0;
        !            67: 
        !            68:        (void) unlink(f2);   /* i'm convinced this is the right thing to do */
        !            69:        if ( (ret = link(f1, f2)) < 0) {
        !            70:                oerrno = errno;
        !            71:            /* copy file */
        !            72:            ret = xcp(f1, f2);
        !            73:        }
        !            74: 
        !            75:        if (ret == 0)
        !            76:            (void) unlink(f1);
        !            77: /*
        !            78:  * ugh
        !            79:  */
        !            80:        if (ret < 0) {
        !            81:                char buf[BUFSIZ];
        !            82:                char f2base[BUFSIZ];
        !            83:                struct stat s1, s2;
        !            84:                char *p;
        !            85:                char *strrchr();
        !            86: 
        !            87:                s1.st_mode = 0;
        !            88:                s2.st_mode = 0;
        !            89:                if (stat(f1, &s1) < 0)
        !            90:                        s1.st_mode = -1;
        !            91:                strcpy(f2base, f2);
        !            92:                if ((p = strrchr(f2base, '/')) != 0)
        !            93:                        *p = 0;
        !            94:                if (stat(f2base, &s2) < 0)
        !            95:                        s2.st_mode = -1;
        !            96:                sprintf(buf, "bad xmv: %s (%o) -> %s (%o); ln errno %d",
        !            97:                        f1, s1.st_mode, f2base, s2.st_mode, oerrno);
        !            98:                logent(buf, "DEBUG");
        !            99:        }
        !           100:        return(ret);
        !           101: }
        !           102: 
        !           103: 
        !           104: /* toCorrupt - move file to CORRUPTDIR
        !           105:  * return - none
        !           106:  */
        !           107: 
        !           108: void
        !           109: toCorrupt(file)
        !           110: char *file;
        !           111: {
        !           112:        char corrupt[MAXFULLNAME];
        !           113: 
        !           114:        (void) sprintf(corrupt, "%s/%s", CORRUPTDIR, BASENAME(file, '/'));
        !           115:        (void) link(file, corrupt);
        !           116:        ASSERT(unlink(file) == 0, Ct_UNLINK, file, errno);
        !           117:        return;
        !           118: }
        !           119: 
        !           120: /*
        !           121:  * append f1 to f2
        !           122:  *     f1      -> source FILE pointer
        !           123:  *     f2      -> destination FILE pointer
        !           124:  * return:
        !           125:  *     SUCCESS -> ok
        !           126:  *     FAIL    -> failed
        !           127:  */
        !           128: xfappend(fp1, fp2)
        !           129: register FILE  *fp1, *fp2;
        !           130: {
        !           131:        register int nc;
        !           132:        char    buf[BUFSIZ];
        !           133: 
        !           134:        while ((nc = fread(buf, sizeof (char), BUFSIZ, fp1)) > 0)
        !           135:                (void) fwrite(buf, sizeof (char), nc, fp2);
        !           136: 
        !           137:        return(ferror(fp1) || ferror(fp2) ? FAIL : SUCCESS);
        !           138: }
        !           139: 
        !           140: 
        !           141: /*
        !           142:  * copy f1 to f2 locally under uid of uid argument
        !           143:  *     f1      -> source file name
        !           144:  *     f2      -> destination file name
        !           145:  *     Uid and Euid are global
        !           146:  * return:
        !           147:  *     0       -> ok
        !           148:  *     FAIL    -> failed
        !           149:  * NOTES:
        !           150:  *  for V7 systems, flip-flop between real and effective uid is
        !           151:  *  not allowed, so fork must be done.  This code will not
        !           152:  *  work correctly when realuid is root on System 5 because of
        !           153:  *  a bug in setuid.
        !           154:  */
        !           155: 
        !           156: #ifndef uidxcp
        !           157: 
        !           158: uidxcp(f1, f2)
        !           159: char *f1, *f2;
        !           160: {
        !           161:        int status;
        !           162:        char full[MAXFULLNAME];
        !           163:        register pid, rpid;
        !           164: 
        !           165:        (void) strcpy(full, f2);
        !           166:        if (DIRECTORY(f2)) {
        !           167:            (void) strcat(full, "/");
        !           168:            (void) strcat(full, BASENAME(f1, '/'));
        !           169:        }
        !           170: 
        !           171:        /* create full owned by uucp */
        !           172:        (void) close(creat(full, 0666));
        !           173:        (void) chmod(full, 0666);
        !           174: 
        !           175:        /* do file copy as read uid */
        !           176: #ifndef V7
        !           177:        (void) setuid(Uid);
        !           178:        status = xcp(f1, full);
        !           179:        (void) setuid(Euid);
        !           180:        return(status);
        !           181: 
        !           182: #else
        !           183: 
        !           184:        if ((pid = vfork()) == 0) {
        !           185:            setuid(Uid);
        !           186:            _exit (xcp(f1, full));
        !           187:        }
        !           188:        status = 1;
        !           189:        while ((rpid = wait(&status)) != pid && rpid != -1)
        !           190:                ;
        !           191:        return (rpid == -1 ? 1 : status);
        !           192: #endif
        !           193: }
        !           194: 
        !           195: #endif

unix.superglobalmegacorp.com

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