source: trunk/third/nmh/sbr/pwd.c @ 12455

Revision 12455, 2.1 KB checked in by danw, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12454, which included commits to RCS files with non-trunk default branches.
Line 
1
2/*
3 * pwd.c -- return the current working directory
4 *
5 * $Id: pwd.c,v 1.1.1.1 1999-02-07 18:14:09 danw Exp $
6 */
7
8#include <h/mh.h>
9
10static char curwd[PATH_MAX];
11
12
13char *
14pwd(void)
15{
16    register char *cp;
17
18    if (!getcwd (curwd, PATH_MAX)) {
19        admonish (NULL, "unable to determine working directory");
20        if (!mypath || !*mypath
21                || (strcpy (curwd, mypath), chdir (curwd)) == -1) {
22            strcpy (curwd, "/");
23            chdir (curwd);
24        }
25        return curwd;
26    }
27
28    if ((cp = curwd + strlen (curwd) - 1) > curwd && *cp == '/')
29        *cp = '\0';
30
31    return curwd;
32}
33
34
35#if 0
36
37/*
38 * Currently commented out.  Everyone seems
39 * to have a native version these days.
40 */
41
42/*
43 * getwd() - get the current working directory
44 */
45
46int
47getwd(char *cwd)
48{
49    int found;
50    char tmp1[BUFSIZ], tmp2[BUFSIZ];
51    struct stat st1, st2, root;
52    register struct direct *dp;
53    register DIR *dd;
54
55    strcpy (cwd, "/");
56    stat ("/", &root);
57
58    for (;;) {
59        if ((dd = opendir ("..")) == NULL)
60            return -1;
61        if (stat (".", &st2) == -1 || stat ("..", &st1) == -1)
62            goto out;
63        if (st2.st_ino == root.st_ino && st2.st_dev == root.st_dev) {
64            closedir (dd);
65            return chdir (cwd);
66        }
67
68        if (st2.st_ino == st1.st_ino && st2.st_dev == st1.st_dev) {
69            closedir (dd);
70            chdir ("/");
71            if ((dd = opendir (".")) == NULL)
72                return -1;
73            if (stat (".", &st1) < 0)
74                goto out;
75            if (st2.st_dev != st1.st_dev)
76                while (dp = readdir (dd)) {
77                    if (stat (dp->d_name, &st1) == -1)
78                        goto out;
79                    if (st2.st_dev == st1.st_dev) {
80                        snprintf (tmp1, sizeof(tmp1), "%s%s", dp->d_name, cwd);
81                        strcpy (cwd + 1, tmp1);
82                        closedir (dd);
83                        return (chdir (cwd));
84                    }
85                }
86            else {
87                closedir (dd);
88                return (chdir (cwd));
89            }
90        }
91
92        found = 0;
93        while (dp = readdir (dd)) {
94            snprintf (tmp2, sizeof(tmp2), "../%s", dp->d_name);
95            if (stat (tmp2, &st1) != -1
96                    && st1.st_ino == st2.st_ino
97                    && st1.st_dev == st2.st_dev) {
98                closedir (dd);
99                found++;
100                chdir ("..");
101                snprintf (tmp1, sizeof(tmp1), "%s%s", dp->d_name, cwd);
102                strcpy (cwd + 1, tmp1);
103                break;
104            }
105        }
106        if (!found)
107            goto out;
108    }
109
110out: ;
111    closedir (dd);
112    return -1;
113}
114
115#endif
Note: See TracBrowser for help on using the repository browser.