Annotation of researchv10no/dk/cmd/pupu/push.c, revision 1.1.1.1

1.1       root        1: 
                      2:        static char     SCCSID[] = "@(#)push.c  2.1 DKHOST 85/01/15";
                      3: 
                      4: #include       <errno.h>
                      5: #include       <varargs.h>
                      6: #include       "string.h"
                      7: #include       "pupu.h"
                      8: #include       "ndir.h"
                      9: 
                     10:        Efn     confirmed, remoteerror, alldone;
                     11: 
                     12:        Sexp    justconf[] = {
                     13:                'c',    confirmed,
                     14:                'e',    remoteerror,
                     15:                'X',    alldone,
                     16:                0,      0
                     17:        };
                     18: 
                     19:        Eexp    justquit[];
                     20: 
                     21:        EcharP  alreadydumped();
                     22: 
                     23: push(fd, names, directory, errfcn, options)
                     24:        PfnP    errfcn;
                     25:        PcharP  *names, directory, options;
                     26: {
                     27:        begin(fd, errfcn, "local", "");
                     28: 
                     29:        if(setjmp(giveup))
                     30:                return(lasterror);
                     31: 
                     32:        sendinit(options);
                     33: 
                     34:        msginit('D');
                     35:        msgfmt("%s", directory);
                     36:        msgconf(justconf);
                     37: 
                     38:        while(*names)
                     39:                sendfile(*names++);
                     40: 
                     41:        msginit('X');
                     42:        msgsend();
                     43:        msgwait(justquit);
                     44: 
                     45:        signal(SIGALRM, alarmwas);
                     46:        return(lasterror);
                     47: }
                     48: 
                     49: putfile(longname, shortname)
                     50:        RcharP  longname, shortname;
                     51: {
                     52:        Rint    ifd;
                     53:        AcharP  lp;
                     54:        Astat   statbuf;
                     55: 
                     56:        if((ifd = openn(shortname, 0)) < 0){
                     57:                warn("Can't open", longname, EX_NOINPUT);
                     58:                return;
                     59:        }
                     60: 
                     61:        fstat(ifd, &statbuf);
                     62: 
                     63:        if(statbuf.st_nlink > 1
                     64:          && (statbuf.st_mode & S_IFMT) != S_IFDIR
                     65:            && (lp = alreadydumped(longname, &statbuf)))
                     66:                dumplink(longname, lp);
                     67:        else
                     68:                switch(statbuf.st_mode & S_IFMT){
                     69:                case S_IFREG:
                     70:                        dumpfile('r', ifd, &statbuf, longname);
                     71:                        break;
                     72: 
                     73:                case S_IFDIR:
                     74:                        dumpdir(ifd, longname, shortname);
                     75:                        dumpfile('d', -1, &statbuf, longname);
                     76:                        break;
                     77: 
                     78:                case S_IFCHR:
                     79:                        dumpfile('c', -1, &statbuf, longname);
                     80:                        break;
                     81:                
                     82:                case S_IFBLK:
                     83:                        dumpfile('b', -1, &statbuf, longname);
                     84:                        break;
                     85: 
                     86:                case S_IFIFO:
                     87:                        dumpfile('p', -1, &statbuf, longname);
                     88:                }
                     89: 
                     90:        closen(ifd);
                     91: }
                     92: 
                     93: dumpdir(ifd, lname, sname)
                     94:        PcharP  lname, sname;
                     95: {
                     96:        DIR             *df;
                     97:        struct direct   *de;
                     98:        Along           mark;
                     99:        Achar           member[NAMELEN];
                    100: 
                    101:        if(chdir(sname) < 0){
                    102:                warn("Can't chdir to", lname, EX_NOINPUT);
                    103:                return;
                    104:        }
                    105: 
                    106:        df = fdopendir(ifd);
                    107: 
                    108:        while(de = readdir(df)){
                    109: 
                    110:                if(strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
                    111:                        continue;
                    112: 
                    113:                if(df->dd_fd > TOPFD){
                    114:                        mark = telldir(df);
                    115:                        openfiles[df->dd_fd] = 0;
                    116:                        closedir(df);
                    117:                }else
                    118:                        mark = -1;
                    119: 
                    120:                sprintf(member, "%s/%s", lname, de->d_name);
                    121: 
                    122:                putfile(member, strrchr(member, '/')+1);
                    123: 
                    124:                if(mark >= 0){
                    125:                        df = opendir(".");
                    126:                        openfiles[df->dd_fd] = 1;
                    127:                        seekdir(df, mark);
                    128:                }
                    129:        }
                    130: 
                    131:        openfiles[df->dd_fd] = 0;
                    132:        closedir(df);
                    133: 
                    134:        chdir("..");
                    135: }
                    136: 
                    137: dumpfile(type, ifd, st, name)
                    138:        Pchar   type;
                    139:        RstatP  st;
                    140:        PcharP  name;
                    141: {
                    142:        Rint    len;
                    143: 
                    144:        msginit('F');
                    145: 
                    146:        msgfmt("%c", type);
                    147:        msgfmt("%s", name);
                    148:        msgfmt("%o", st->st_mode & 07777);
                    149:        msgfmt("%d", st->st_uid);
                    150:        msgfmt("%d", st->st_gid);
                    151:        msgfmt("%ld", st->st_mtime);
                    152: 
                    153:        if(type == 'r')
                    154:                msgfmt("%ld", st->st_size);
                    155:        else if(type == 'c' || type == 'b'){
                    156:                msgfmt("%d", major(st->st_rdev));
                    157:                msgfmt("%d", minor(st->st_rdev));
                    158:        }
                    159: 
                    160:        msgsend();
                    161: 
                    162:        if(type == 'r'){
                    163:                currentfile = name;
                    164:                timeoutmsg = "File transmission timed out";
                    165: 
                    166:                while((len = read(ifd, buf, sizeof(buf))) > 0){
                    167:                        alarm(WTIMEOUT);
                    168: 
                    169:                        if(write(cfd, buf, len) != len)
                    170:                                err("Channel write error", NIL, EX_IOERR);
                    171:                }
                    172: 
                    173:                if(len < 0)
                    174:                        err("Error reading", name, EX_IOERR);
                    175: 
                    176:                dkeof(cfd);
                    177: 
                    178:                alarm(0);
                    179:        }
                    180: 
                    181:        msgwait(justconf);
                    182: }
                    183: 
                    184:        PcharP
                    185: alreadydumped(name, st)
                    186:        PcharP  name;
                    187:        RstatP  st;
                    188: {
                    189:        RlinkP  plp, clp;
                    190:        Schar   linkname[NAMELEN];
                    191: 
                    192:        for(plp = &linkhead; clp = plp->next; plp = clp)
                    193:                if(clp->ino == st->st_ino && clp->dev == st->st_dev){
                    194:                        strcpy(linkname, clp->name);
                    195: 
                    196:                        if(--clp->count <= 0){
                    197:                                plp->next = clp->next;
                    198:                                free(clp);
                    199:                        }
                    200: 
                    201:                        return(linkname);
                    202:                }
                    203: 
                    204:        clp = (TlinkP) malloc(sizeof(*clp) + strlen(name));
                    205: 
                    206:        if(clp){
                    207:                strcpy(clp->name, name);
                    208: 
                    209:                clp->count = st->st_nlink - 1;
                    210:                clp->ino = st->st_ino;
                    211:                clp->dev = st->st_dev;
                    212: 
                    213:                clp->next = linkhead.next;
                    214:                linkhead.next = clp;
                    215:        }
                    216: 
                    217:        return(NIL);
                    218: }
                    219: 
                    220: dumplink(new, prev)
                    221:        PcharP  new, prev;
                    222: {
                    223:        msginit('L');
                    224: 
                    225:        msgfmt("%s", new);
                    226:        msgfmt("%s", prev);
                    227: 
                    228:        msgconf(justconf);
                    229: }

unix.superglobalmegacorp.com

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