Annotation of 43BSDReno/contrib/isode-beta/others/idist/support.c, revision 1.1.1.1

1.1       root        1: /* support.c - remote distribution -- support routines */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/others/idist/RCS/support.c,v 7.0 89/11/23 21:58:44 mrose Rel $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/others/idist/RCS/support.c,v 7.0 89/11/23 21:58:44 mrose Rel $
                      9:  *
                     10:  * Support routines required by both client and server.
                     11:  *
                     12:  * Julian Onions <[email protected]>
                     13:  * Nottingham University Computer Science.
                     14:  *
                     15:  * 
                     16:  * $Log:       support.c,v $
                     17:  * Revision 7.0  89/11/23  21:58:44  mrose
                     18:  * Release 6.0
                     19:  * 
                     20:  */
                     21: 
                     22: #include <stdio.h>
                     23: #include "Idist-ops.h"         /* operation definitions */
                     24: #include "Idist-types.h"       /* type definitions */
                     25: #include "defs.h"
                     26: 
                     27: struct type_Idist_FileSpec *
                     28:        makefs (type, opts, mode, size, mtime, uname, group, name, lname)
                     29: unsigned short type, mode;
                     30: off_t  size;
                     31: time_t mtime;
                     32: int    opts;
                     33: char   *uname, *group, *name, *lname;
                     34: {
                     35:        struct type_Idist_FileSpec *fs;
                     36:        struct type_Idist_FileType *makeftype ();
                     37:        struct type_Idist_FileTime *makefmtime ();
                     38:        struct type_Idist_Options *makeopts ();
                     39: 
                     40:        if ((fs = (struct type_Idist_FileSpec *) malloc (sizeof *fs)) == NULL)
                     41:                adios ("memory", "out of");
                     42:        fs -> filetype = makeftype (type);
                     43:        fs -> fileopts = makeopts (opts);
                     44:        fs -> filemode = mode;
                     45:        fs -> filesize = size;
                     46:        fs -> filemtime = makefmtime (mtime);
                     47:        fs -> fileowner = str2qb (uname, strlen(uname), 1);
                     48:        fs -> filegroup = str2qb (group, strlen(group), 1);
                     49:        fs -> filename = str2qb (name, strlen(name), 1);
                     50:        fs -> linkname = str2qb (lname, strlen (lname), 1);
                     51:        return fs;
                     52: }
                     53: 
                     54: struct type_Idist_Options *makeopts (opts)
                     55: int    opts;
                     56: {
                     57:        struct type_Idist_Options *rdo;
                     58: 
                     59:        rdo = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_BITS);
                     60:        if (rdo == NULL)
                     61:                adios ("memory", "out of");
                     62: #define dobit(X,Y) if (opts & (X)) (void) bit_on (rdo, (Y))
                     63:        dobit (VERIFY, bit_Idist_Options_verify);
                     64:        dobit (WHOLE, bit_Idist_Options_whole);
                     65:        dobit (YOUNGER, bit_Idist_Options_younger);
                     66:        dobit (COMPARE, bit_Idist_Options_compare);
                     67:        dobit (FOLLOW, bit_Idist_Options_follow);
                     68:        dobit (IGNLNKS, bit_Idist_Options_ignlinks);
                     69: #ifdef UW
                     70:        dobit (NOINSTALL, bit_Idist_Options_noinstall);
                     71: #endif
                     72: #undef dobit
                     73:        return rdo;
                     74: }
                     75:        
                     76: struct type_Idist_FileType *makeftype (type)
                     77: unsigned short type;
                     78: {
                     79:        struct type_Idist_FileType *ft;
                     80: 
                     81:        if ((ft = (struct type_Idist_FileType *) malloc (sizeof *ft)) == NULL)
                     82:                adios ("memory", "out of");
                     83:        switch (type) {
                     84:            case S_IFDIR:
                     85:                ft -> parm = int_Idist_FileType_directory;
                     86:                break;
                     87:            case S_IFLNK:
                     88:                ft -> parm = int_Idist_FileType_symlink;
                     89:                break;
                     90:            case S_IFREG:
                     91:                ft -> parm = int_Idist_FileType_regular;
                     92:                break;
                     93:            case 0:
                     94:                ft -> parm = int_Idist_FileType_hardlink;
                     95:                break;
                     96:            default:
                     97:                adios (NULLCP, "Illegal file type (%d)", type);
                     98:                break;
                     99:        }
                    100:        return ft;
                    101: }
                    102: 
                    103: struct type_Idist_FileTime *makefmtime (mtime)
                    104: long   mtime;
                    105: {
                    106:        struct type_Idist_FileTime *fm;
                    107: 
                    108:        if ((fm = (struct type_Idist_FileTime *) malloc (sizeof *fm)) == NULL)
                    109:                adios ("memory", "out of");
                    110:                                /* Convert to time since Jan 1 1900 */
                    111:        fm -> parm = mtime + 2208988800L; 
                    112:        return fm;
                    113: }
                    114: 
                    115: long   convtime (fm)
                    116: struct type_Idist_FileTime *fm;
                    117: {
                    118:        return fm -> parm - 2208988800L;
                    119: }
                    120: 
                    121: /*
                    122:  * Expand file names beginning with `~' into the
                    123:  * user's home directory path name. Return a pointer in buf to the
                    124:  * part corresponding to `file'.
                    125:  */
                    126: char *
                    127: exptilde(buf, file)
                    128:        char buf[];
                    129:        register char *file;
                    130: {
                    131:        register char *s1, *s2, *s3;
                    132:        extern char homedir[];
                    133: 
                    134:        if (*file != '~') {
                    135:                (void) strcpy(buf, file);
                    136:                return(buf);
                    137:        }
                    138:        if (*++file == '\0') {
                    139:                s2 = homedir;
                    140:                s3 = NULL;
                    141:        } else if (*file == '/') {
                    142:                s2 = homedir;
                    143:                s3 = file;
                    144:        } else {
                    145:                s3 = file;
                    146:                while (*s3 && *s3 != '/')
                    147:                        s3++;
                    148:                if (*s3 == '/')
                    149:                        *s3 = '\0';
                    150:                else
                    151:                        s3 = NULL;
                    152:                if (pw == NULL || strcmp(pw->pw_name, file) != 0) {
                    153:                        if ((pw = getpwnam(file)) == NULL) {
                    154:                                if (s3 != NULL)
                    155:                                        *s3 = '/';
                    156:                                return(NULL);
                    157:                        }
                    158:                }
                    159:                if (s3 != NULL)
                    160:                        *s3 = '/';
                    161:                s2 = pw->pw_dir;
                    162:        }
                    163:        for (s1 = buf; *s1++ = *s2++; )
                    164:                ;
                    165:        s2 = --s1;
                    166:        if (s3 != NULL) {
                    167:                s2++;
                    168:                while (*s1++ = *s3++)
                    169:                        ;
                    170:        }
                    171:        return(s2);
                    172: }

unix.superglobalmegacorp.com

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