|
|
1.1 ! root 1: # include "stdio.h" ! 2: # include "assert.h" ! 3: # include "ctype.h" ! 4: # include "sys/param.h" ! 5: # include "sys/stat.h" ! 6: # include "sys/dir.h" ! 7: extern char pwdir[]; ! 8: ! 9: /* pwd command, modified to write in argument */ ! 10: ! 11: char dot[] = "."; ! 12: char dotdot[] = ".."; ! 13: char name[512]; ! 14: char output[512]; ! 15: int file; ! 16: int off = -1; ! 17: struct stat d, dd; ! 18: struct direct dir; ! 19: ! 20: char * ! 21: getpwd () ! 22: { ! 23: int rdev, rino; ! 24: ! 25: strcpy(output, "/"); ! 26: stat("/", &d); ! 27: rdev = d.st_dev; ! 28: rino = d.st_ino; ! 29: for (;;) { ! 30: stat(dot, &d); ! 31: if (d.st_ino==rino && d.st_dev==rdev) ! 32: { ! 33: prname(); ! 34: break; ! 35: } ! 36: if ((file = open(dotdot,0)) < 0) { ! 37: fprintf(stderr,"pwd: cannot open ..\n"); ! 38: exit(1); ! 39: } ! 40: fstat(file, &dd); ! 41: chdir(dotdot); ! 42: if(d.st_dev == dd.st_dev) { ! 43: if(d.st_ino == dd.st_ino) ! 44: { ! 45: prname(); ! 46: break; ! 47: } ! 48: do ! 49: if (read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) { ! 50: fprintf(stderr,"read error in ..\n"); ! 51: exit(1); ! 52: } ! 53: while (dir.d_ino != d.st_ino); ! 54: } ! 55: else do { ! 56: if(read(file, (char *)&dir, sizeof(dir)) < sizeof(dir)) { ! 57: fprintf(stderr,"read error in ..\n"); ! 58: exit(1); ! 59: } ! 60: stat(dir.d_name, &dd); ! 61: } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); ! 62: close(file); ! 63: cat(); ! 64: } ! 65: chdir (output); ! 66: return(output); ! 67: } ! 68: ! 69: prname() ! 70: { ! 71: if (off<0) ! 72: off = 0; ! 73: name[off]='\0'; ! 74: strcat (output, name); ! 75: return ; ! 76: } ! 77: ! 78: cat() ! 79: { ! 80: register i, j; ! 81: ! 82: i = -1; ! 83: while (dir.d_name[++i] != 0); ! 84: if ((off+i+2) > 511) ! 85: { ! 86: fprintf(stderr, "Directory string exceeds 512 characters in length\n"); ! 87: exit(1); ! 88: } ! 89: for(j=off+1; j>=0; --j) ! 90: name[j+i+1] = name[j]; ! 91: off=i+off+1; ! 92: name[i] = '/'; ! 93: for(--i; i>=0; --i) ! 94: name[i] = dir.d_name[i]; ! 95: } ! 96: copyto( sdest, source) ! 97: char *sdest; ! 98: char *source; ! 99: { ! 100: char *s, target[100]; ! 101: FILE *f1, *f2; ! 102: int k; ! 103: struct stat stbuf; ! 104: for(s=sdest; *s; s++); ! 105: while (!isspace(*s) && s>sdest) ! 106: s--; ! 107: if (!isspace(*s)) ! 108: { ! 109: fprintf(stderr, "No destination '%s'\n", sdest); ! 110: return; ! 111: } ! 112: if (*++s == '/') ! 113: sprintf(target, "%s", s); ! 114: else ! 115: sprintf(target, "%s/%s", pwdir, s); ! 116: k = stat (target, &stbuf); ! 117: if (k==0 && (stbuf.st_mode & S_IFDIR)!=0) ! 118: { ! 119: strcat (target, "/"); ! 120: strcat (target, source); ! 121: } ! 122: f2 = fopen(target, "a"); ! 123: if (f2==NULL) ! 124: { ! 125: fprintf(stderr, "Can not open %s\n",target); ! 126: return; ! 127: } ! 128: f1 = fopen(source, "r"); ! 129: while ( (k= getc(f1)) != EOF) ! 130: putc(k, f2); ! 131: fclose(f1); ! 132: fclose(f2); ! 133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.