|
|
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.