Annotation of coherent/e/bin/pax/pathname.c, revision 1.1.1.1

1.1       root        1: /* $Source: /src386/usr/bin/pax/pathname.c,v $
                      2:  *
                      3:  * $Revision: 1.1 $
                      4:  *
                      5:  * pathname.c - directory/pathname support functions 
                      6:  *
                      7:  * DESCRIPTION
                      8:  *
                      9:  *     These functions provide directory/pathname support for PAX
                     10:  *
                     11:  * AUTHOR
                     12:  *
                     13:  *     Mark H. Colburn, NAPS International ([email protected])
                     14:  *
                     15:  * Sponsored by The USENIX Association for public distribution. 
                     16:  *
                     17:  * Copyright (c) 1989 Mark H. Colburn.
                     18:  * All rights reserved.
                     19:  *
                     20:  * Redistribution and use in source and binary forms are permitted
                     21:  * provided that the above copyright notice is duplicated in all such 
                     22:  * forms and that any documentation, advertising materials, and other 
                     23:  * materials related to such distribution and use acknowledge that the 
                     24:  * software was developed * by Mark H. Colburn and sponsored by The 
                     25:  * USENIX Association. 
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     28:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     29:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     30:  *
                     31:  * $Log:       pathname.c,v $
                     32:  * Revision 1.1  92/08/28  08:02:47  bin
                     33:  * Initial revision
                     34:  * 
                     35:  * Revision 1.1  89/02/14  16:48:23  jep
                     36:  * Initial revision
                     37:  * 
                     38:  * Revision 1.1  88/12/23  18:02:21  mark
                     39:  * Initial revision
                     40:  * 
                     41:  */
                     42: 
                     43: #ifndef lint
                     44: static char *ident = "$Id: pathname.c,v 1.1 92/08/28 08:02:47 bin Exp Locker: bin $";
                     45: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
                     46: #endif /* ! lint */
                     47: 
                     48: 
                     49: /* Headers */
                     50: 
                     51: #include "pax.h"
                     52: 
                     53: 
                     54: /* dirneed  - checks for the existance of directories and possibly create
                     55:  *
                     56:  * DESCRIPTION
                     57:  *
                     58:  *     Dirneed checks to see if a directory of the name pointed to by name
                     59:  *     exists.  If the directory does exist, then dirneed returns 0.  If
                     60:  *     the directory does not exist and the f_dir_create flag is set,
                     61:  *     then dirneed will create the needed directory, recursively creating
                     62:  *     any needed intermediate directory.
                     63:  *
                     64:  *     If f_dir_create is not set, then no directories will be created
                     65:  *     and a value of -1 will be returned if the directory does not
                     66:  *     exist.
                     67:  *
                     68:  * PARAMETERS
                     69:  *
                     70:  *     name            - name of the directory to create
                     71:  *
                     72:  * RETURNS
                     73:  *
                     74:  *     Returns a 0 if the creation of the directory succeeded or if the
                     75:  *     directory already existed.  If the f_dir_create flag was not set
                     76:  *     and the named directory does not exist, or the directory creation 
                     77:  *     failed, a -1 will be returned to the calling routine.
                     78:  */
                     79: 
                     80: #if __STDC__
                     81: 
                     82: int dirneed(char *name)
                     83: 
                     84: #else
                     85: 
                     86: int dirneed(name)
                     87: char           *name;
                     88: 
                     89: #endif
                     90: {
                     91:     char           *cp;
                     92:     char           *last;
                     93:     int             ok;
                     94:     static Stat     sb;
                     95: 
                     96:     last = (char *)NULL;
                     97:     for (cp = name; *cp;) {
                     98:        if (*cp++ == '/') {
                     99:            last = cp;
                    100:        }
                    101:     }
                    102:     if (last == (char *)NULL) {
                    103:        return (STAT(".", &sb));
                    104:     }
                    105:     *--last = '\0';
                    106:     ok = STAT(*name ? name : ".", &sb) == 0
                    107:        ? ((sb.sb_mode & S_IFMT) == S_IFDIR)
                    108:        : (f_dir_create && dirneed(name) == 0 && dirmake(name, &sb) == 0);
                    109:     *last = '/';
                    110:     return (ok ? 0 : -1);
                    111: }
                    112: 
                    113: 
                    114: /* nameopt - optimize a pathname
                    115:  *
                    116:  * DESCRIPTION
                    117:  *
                    118:  *     Confused by "<symlink>/.." twistiness. Returns the number of final 
                    119:  *     pathname elements (zero for "/" or ".") or -1 if unsuccessful. 
                    120:  *
                    121:  * PARAMETERS
                    122:  *
                    123:  *     char    *begin  - name of the path to optimize
                    124:  *
                    125:  * RETURNS
                    126:  *
                    127:  *     Returns 0 if successful, non-zero otherwise.
                    128:  *
                    129:  */
                    130: 
                    131: #if __STDC__
                    132: 
                    133: int nameopt(char *begin)
                    134: 
                    135: #else
                    136: 
                    137: int nameopt(begin)
                    138: char           *begin;
                    139: 
                    140: #endif
                    141: {
                    142:     char           *name;
                    143:     char           *item;
                    144:     int             idx;
                    145:     int             absolute;
                    146:     char           *element[PATHELEM];
                    147: 
                    148:     absolute = (*(name = begin) == '/');
                    149:     idx = 0;
                    150:     for (;;) {
                    151:        if (idx == PATHELEM) {
                    152:            warn(begin, "Too many elements");
                    153:            return (-1);
                    154:        }
                    155:        while (*name == '/') {
                    156:            ++name;
                    157:        }
                    158:        if (*name == '\0') {
                    159:            break;
                    160:        }
                    161:        element[idx] = item = name;
                    162:        while (*name && *name != '/') {
                    163:            ++name;
                    164:        }
                    165:        if (*name) {
                    166:            *name++ = '\0';
                    167:        }
                    168:        if (strcmp(item, "..") == 0) {
                    169:            if (idx == 0) {
                    170:                if (!absolute) {
                    171:                    ++idx;
                    172:                }
                    173:            } else if (strcmp(element[idx - 1], "..") == 0) {
                    174:                ++idx;
                    175:            } else {
                    176:                --idx;
                    177:            }
                    178:        } else if (strcmp(item, ".") != 0) {
                    179:            ++idx;
                    180:        }
                    181:     }
                    182:     if (idx == 0) {
                    183:        element[idx++] = absolute ? "" : "."; 
                    184:     }
                    185:     element[idx] = (char *)NULL;
                    186:     name = begin;
                    187:     if (absolute) {
                    188:        *name++ = '/';
                    189:     }
                    190:     for (idx = 0; item = element[idx]; ++idx, *name++ = '/') {
                    191:        while (*item) {
                    192:            *name++ = *item++;
                    193:        }
                    194:     }
                    195:     *--name = '\0';
                    196:     return (idx);
                    197: }
                    198: 
                    199: 
                    200: /* dirmake - make a directory  
                    201:  *
                    202:  * DESCRIPTION
                    203:  *
                    204:  *     Dirmake makes a directory with the appropritate permissions.
                    205:  *
                    206:  * PARAMETERS
                    207:  *
                    208:  *     char    *name   - Name of directory make
                    209:  *     Stat    *asb    - Stat structure of directory to make
                    210:  *
                    211:  * RETURNS
                    212:  *
                    213:  *     Returns zero if successful, -1 otherwise. 
                    214:  *
                    215:  */
                    216: 
                    217: #if __STDC__
                    218: 
                    219: int dirmake(char *name, Stat *asb)
                    220: 
                    221: #else
                    222: 
                    223: int dirmake(name, asb)
                    224: char           *name;
                    225: Stat           *asb;
                    226: 
                    227: #endif
                    228: {
                    229:     if (mkdir(name, (int) (asb->sb_mode & S_IPOPN)) < 0) {
                    230:        return (-1);
                    231:     }
                    232:     if (asb->sb_mode & S_IPEXE) {
                    233:        chmod(name, (int) (asb->sb_mode & S_IPERM));
                    234:     }
                    235:     if (f_owner) {
                    236:        chown(name, (int) asb->sb_uid, (int) asb->sb_gid);
                    237:     }
                    238:     return (0);
                    239: }

unix.superglobalmegacorp.com

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