# 2.11BSD#431 - /usr/src/local/mtools/subdir.c

##### Functions

    subdir            X

       1: #include <stdio.h>
       2: #include "msdos.h"
       3:
       4: extern int dir_entries;
       5: static int descend();
       6:
       7: /*
       8:  * Descends the directory tree.  Returns 1 on error.  Attempts to optimize by
       9:  * remembering the last path it parsed
      10:  */
      11:
      12: int
      13: subdir(drive, pathname)
      14: char drive;
      15: char *pathname;
      16: {
      17:     char *s, *tmp, tbuf[MAX_PATH], *path, *strcpy();
      18:     static char last_drive, lastpath[MAX_PATH];
      19:     int code;
      20:     void reset_chain();
      21:
      22:     strcpy(tbuf, pathname);
      23:                     /* if paths are same, do nothing */
      24:     if (!strcmp(tbuf, lastpath) && last_drive == drive)
      25:         return(0);
      26:                     /* start at root */
      27:     reset_chain(OLD);
      28:     strcpy(lastpath, tbuf);
      29:     last_drive = drive;
      30:                     /* separate the parts */
      31:     tmp = &tbuf[1];
      32:     for (s = tmp; *s; ++s) {
      33:         if (*s == '/') {
      34:             path = tmp;
      35:             *s = '\0';
      36:             if (descend(path))
      37:                 return(1);
      38:             tmp = s + 1;
      39:         }
      40:     }
      41:     code = descend(tmp);
      42:     return(code);
      43: }
      44:
      45: /*
      46:  * Find the directory and load a new dir_chain[].  A null directory
      47:  * is ok.  Returns a 1 on error.
      48:  */
      49:
      50: static int
      51: descend(path)
      52: char *path;
      53: {
      54:     int entry;
      55:     unsigned int start;
      56:     char *newname, *unix_name();
      57:     struct directory *dir, *dir_read();
      58:     void reset_chain();
      59:                     /* nothing required */
      60:     if (*path == '\0')
      61:         return(0);
      62:
      63:     for (entry = 0; entry < dir_entries; entry++) {
      64:         dir = dir_read(entry);
      65:                     /* if empty */
      66:         if (dir->name[0] == 0x0)
      67:             break;
      68:                     /* if erased */
      69:         if (dir->name[0] == 0xe5)
      70:             continue;
      71:                     /* skip if not a directory */
      72:         if (!(dir->attr & 0x10))
      73:             continue;
      74:
      75:         newname = unix_name(dir->name, dir->ext);
      76:
      77:         /*
      78: 		 * Be careful not to match '.' and '..' with wildcards
      79: 		 */
      80:         if (*newname == '.' && *path != '.')
      81:             continue;
      82:
      83:         if (match(newname, path)) {
      84:             start = dir->start[1] * 0x100 + dir->start[0];
      85:
      86:                     /* if '..' points to root */
      87:             if (!start && !strcmp(path, "..")) {
      88:                 reset_chain(OLD);
      89:                 return(0);
      90:             }
      91:                     /* fill in the directory chain */
      92:             if (fill_chain(start))
      93:                 return(1);
      94:
      95:             return(0);
      96:         }
      97:     }
      98:
      99:     /*
     100: 	 * If path is '.' or '..', but they weren't found, then you must be
     101: 	 * at root.
     102: 	 */
     103:     if (!strcmp(path, ".") || !strcmp(path, "..")) {
     104:         reset_chain(OLD);
     105:         return(0);
     106:     }
     107:     fprintf(stderr, "Path component \"%s\" is not a directory\n", path);
     108:     return(1);
     109: }

#### Defined functions

descend defined in line 50; used 3 times

- in line 5, 36-41(2)

subdir defined in line 12; used 13 times

- in /usr/src/local/mtools/mattrib.c line 103
- in /usr/src/local/mtools/mcd.c line 58, 70
- in /usr/src/local/mtools/mdel.c line 74
- in /usr/src/local/mtools/mdir.c line 124, 139
- in /usr/src/local/mtools/mmd.c line 85
- in /usr/src/local/mtools/mrd.c line 68
- in /usr/src/local/mtools/mread.c line 111
- in /usr/src/local/mtools/mren.c line 57
- in /usr/src/local/mtools/mtype.c line 74
- in /usr/src/local/mtools/mwrite.c line 97, 107

Last modified: 1992-06-24 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 511 |