|
|
1.1 root 1: /* Copyright (C) 1982, 1988, 1989 Walter Tichy
2: * All rights reserved.
3: *
4: * Redistribution and use in source and binary forms are permitted
5: * provided that the above copyright notice and this paragraph are
6: * duplicated in all such forms and that any documentation,
7: * advertising materials, and other materials related to such
8: * distribution and use acknowledge that the software was developed
9: * by Walter Tichy.
10: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
11: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
12: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13: *
14: * Report all problems and direct all questions to:
15: * [email protected]
16: *
17:
18:
19:
20:
21:
22:
23:
24: */
25:
26: /*******************************************************************
27: * curdir: get current directory
28: *******************************************************************
29: * returns full pathname of working (current) directory.
30: * This is an adaptation of pwd, and works for grafted directories.
31: * Unlike pwd, returns to current directory after it is finished.
32: * Uses stdio buffering for directory reads.
33: */
34:
35: static char rcsid[]=
36: "$Header: /usr/src/local/bin/rcs/src/RCS/curdir.c,v 3.3 89/05/01 15:11:49 narten Exp $";
37:
38: /*******************************************************************
39: * $Log: curdir.c,v $
40: * Revision 3.3 89/05/01 15:11:49 narten
41: * changed copyright header to reflect current distribution rules
42: *
43: * Revision 3.2 87/10/18 10:21:49 narten
44: * Updating version numbers. Changes relative to 1.1 are actually
45: * relative to 3.2
46: *
47: * Revision 1.1 84/01/23 14:50:01 kcs
48: * Initial revision
49: *
50: * Revision 3.2 82/12/24 15:41:51 wft
51: * Changed curdir() such that it returns a pointer to the pathname of
52: * the current working directory, just as Berkeley's getcwd().
53: *
54: * Revision 3.1 82/10/18 21:16:21 wft
55: * curdir() now uses stdio buffering for directory reads,
56: * returns to working directory after done, and closes the directories.
57: * A testprogram was also added.
58: *
59: *******************************************************************/
60:
61:
62: #include "rcsbase.h"
63: #include <sys/param.h>
64: #include <sys/stat.h>
65: #include <sys/dir.h>
66: #define dot "."
67: #define dotdot ".."
68:
69:
70: static char cwd[NCPPN];
71:
72: char * curdir()
73: /* Function: places the pathname of the current directory into cwd
74: * and returns a pointer to it. Returns NULL on failure.
75: */
76: {
77: FILE *file;
78: struct stat d, dd;
79: struct direct dir;
80:
81: int rdev, rino;
82: int off;
83: register i,j;
84:
85: cwd[off= 0] = '/';
86: cwd[1] = '\0';
87: stat("/", &d);
88: rdev = d.st_dev;
89: rino = d.st_ino;
90: for (;;) {
91: if (stat(dot, &d)<0) return NULL;
92: if (d.st_ino==rino && d.st_dev==rdev) {
93: if (cwd[off] == '/') cwd[off] = '\0';
94: chdir(cwd); /*change back to current directory*/
95: return cwd;
96: }
97: if ((file = fopen(dotdot,"r")) == NULL) return NULL;
98: if (fstat(fileno(file), &dd)<0) goto fail;
99: chdir(dotdot);
100: if(d.st_dev == dd.st_dev) {
101: if(d.st_ino == dd.st_ino) {
102: if (cwd[off] == '/') cwd[off] = '\0';
103: chdir(cwd); /*change back to current directory*/
104: fclose(file);
105: return cwd;
106: }
107: do {
108: if (fread((char *)&dir, sizeof(dir), 1, file) !=1)
109: goto fail;
110: } while (dir.d_ino != d.st_ino);
111: }
112: else do {
113: if(fread((char *)&dir, sizeof(dir), 1, file) != 1) {
114: goto fail;
115: }
116: stat(dir.d_name, &dd);
117: } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
118: fclose(file);
119:
120: /* concatenate file name */
121: i = -1;
122: while (dir.d_name[++i] != 0);
123: for(j=off+1; j>0; --j)
124: cwd[j+i+1] = cwd[j];
125: off=i+off+1;
126: cwd[i+1] = '/';
127: for(--i; i>=0; --i)
128: cwd[i+1] = dir.d_name[i];
129: } /* end for */
130:
131: fail: fclose(file);
132: return NULL;
133: }
134:
135:
136: #ifdef TEST
137: main ()
138: {
139: printf ("pwd = %s\n", curdir());
140: }
141: #endif TEST
142:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.