Annotation of researchv10no/dk/cmd/pull.c, revision 1.1

1.1     ! root        1: /*%cc -o pull % -ldk
        !             2:  */
        !             3: #include <sys/types.h>
        !             4: #include <sys/stat.h>
        !             5: #include <stdio.h>
        !             6: #include <errno.h>
        !             7: 
        !             8: extern int errno;
        !             9: 
        !            10: char SERVER[]="/usr/lib/Rpush";
        !            11: int server;
        !            12: 
        !            13: #define MAXCHARS 8192
        !            14: char args[MAXCHARS];
        !            15: 
        !            16: char *bldargs(argv)
        !            17:        register char *argv[];
        !            18: {
        !            19:        register char *s, *t;
        !            20:        extern char *strcpy();
        !            21:        s=strcpy(args, SERVER);
        !            22:        s+=strlen(s);
        !            23:        *s++=' ';
        !            24:        while(t= *argv++){      /* assignment = */
        !            25:                while(*s = *t++)
        !            26:                        if(s++ >= &args[MAXCHARS-1]){
        !            27:                                error("arg list too long", "");
        !            28:                                exit(1);
        !            29:                        }
        !            30:                *s++=' ';
        !            31:        }
        !            32:        s[-1]='\0';
        !            33:        return(args);
        !            34: }
        !            35: 
        !            36: char *
        !            37: basename(s)
        !            38:        register char *s;
        !            39: {
        !            40:        extern char *strrchr();
        !            41:        register char *t;
        !            42:        t=strrchr(s, '/');
        !            43:        return(t? t+1 : s);
        !            44: }
        !            45: 
        !            46: char *
        !            47: str(s, n)
        !            48:        register char *s;
        !            49: {
        !            50:        static char strbuf[129];
        !            51:        (void)strncpy(strbuf, s, n);
        !            52:        strbuf[n]=0;
        !            53:        return(strbuf);
        !            54: }
        !            55: 
        !            56: int errors=0;
        !            57: int vflag;
        !            58: 
        !            59: main(argc, argv)
        !            60:        char *argv[];
        !            61: {
        !            62:        register n;
        !            63:        char *targetdir;
        !            64:        char buf[512];
        !            65: 
        !            66:        if(argc>1 && strcmp(argv[1], "-v")==0){
        !            67:                vflag=1;
        !            68:                argv++;
        !            69:                --argc;
        !            70:        }
        !            71:        if(basename(argv[0])[0]=='R'){
        !            72:                if(argc!=2){
        !            73:                        error("arg count", ""); /* It's ok; other guy will decrypt it */
        !            74:                        exit(1);
        !            75:                }
        !            76:                targetdir=argv[1];
        !            77:        }else{
        !            78:                if(argc<4){
        !            79:                        error("Usage: pull machine <remotefiles|dirs> localdir", "");
        !            80:                        exit(1);
        !            81:                }
        !            82:                targetdir=argv[argc-1];
        !            83:                server=0;       /* Standard input */
        !            84:                server=tdkexec(argv[1], bldargs(&argv[1]));
        !            85:                if(server<0){
        !            86:                        extern char *dkerror;
        !            87:                        fprintf(stderr, "pull: can't execute %s (%s)\n", SERVER,
        !            88:                                dkerror);
        !            89:                        exit(1);
        !            90:                }
        !            91:        }
        !            92:        if(mkdir(targetdir, 0777)==0){
        !            93:                error("can't make directory", argv[1]);
        !            94:                exit(1);
        !            95:        }
        !            96:        while((n=read(server, buf, sizeof buf))>0){
        !            97:                switch(buf[0]){
        !            98:                case 'D':
        !            99:                        if(mkdir(str(buf+4, n-4), o3(buf+1))==0)
        !           100:                                error("can't make directory", str(buf+1, n-1));
        !           101:                        break;
        !           102:                case 'E':
        !           103:                        error("(remote)", str(buf+1, n-1));
        !           104:                        break;
        !           105:                case 'F':
        !           106:                        createfile(str(buf+4, n-4), o3(buf+1));
        !           107:                        continue;       /* createfile() will read null message */
        !           108:                default:
        !           109:                        buf[1]='\0';
        !           110:                        error("unknown message", buf);
        !           111:                        break;
        !           112:                }
        !           113:                if(read(server, buf, sizeof buf)!=0){
        !           114:                        error("synchronization error", "");
        !           115:                        do; while(read(server, buf, sizeof buf)>0);
        !           116:                }
        !           117:        }
        !           118:        return(errors);
        !           119: }
        !           120: 
        !           121: createfile(s, m)
        !           122:        register char *s;
        !           123: {
        !           124:        char buf[1024];
        !           125:        register f;
        !           126:        register cc;
        !           127:        if(server>1 && vflag)
        !           128:                printf("pull: receive %s\n", s);
        !           129:        if((f=creat(s, m))<0)
        !           130:                error("can't create", s);
        !           131:        else{
        !           132:                if(read(server, buf, sizeof buf)>0){
        !           133:                        error("synchronization", "error");
        !           134:                        close(f);
        !           135:                        return;
        !           136:                }
        !           137:                while((cc=read(server, buf, sizeof buf))>0)
        !           138:                        if(write(f, buf, cc)!=cc){
        !           139:                                error("write error", s);
        !           140:                                if(errno==ENOSPC){
        !           141:                                        error("file system is full; aborting", "");
        !           142:                                        exit(1);
        !           143:                                }
        !           144:                                close(f);
        !           145:                                return;
        !           146:                        }
        !           147:                close(f);
        !           148:        }
        !           149: }
        !           150: 
        !           151: error(s, t)
        !           152:        char *s, *t;
        !           153: {
        !           154:        char ebuf[128];
        !           155:        errors=1;
        !           156:        sprintf(ebuf, "%s%s %s\n", server>0? "pull: " : "" ,s, t);
        !           157:        write(2, ebuf, strlen(ebuf));
        !           158: }
        !           159: 
        !           160: mkdir(s, m)
        !           161:        register char *s;
        !           162: {
        !           163:        struct stat statbuf;
        !           164:        register pid;
        !           165:        int status;
        !           166:        if(stat(s, &statbuf)<0){
        !           167:                if((pid=fork())==0){
        !           168:                        execl("/bin/mkdir", "mkdir", s, 0);
        !           169:                        exit(1);
        !           170:                }
        !           171:                (void)wait(&status);
        !           172:                chmod(s, m);
        !           173:                return(!status);
        !           174:        }
        !           175:        return((statbuf.st_mode&S_IFMT)==S_IFDIR);
        !           176: }
        !           177: 
        !           178: o3(s)
        !           179:        register char *s;
        !           180: {
        !           181:        return(((s[0]-'0')*0100)+((s[1]-'0')*010)+(s[2]-'0'));
        !           182: }

unix.superglobalmegacorp.com

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