source: trunk/debathena/third/tcsh/hesiod.dpatch @ 22698

Revision 22698, 2.4 KB checked in by ghudson, 16 years ago (diff)
Snapshot some of the Debathena third-party package materials. This commit only covers the packages which use the debathenificator framework (bash, tcsh, krb5).
  • Property svn:executable set to *
Line 
1#! /bin/sh /usr/share/dpatch/dpatch-run
2## hesiod.dpatch by Anders Kaseorg <andersk@mit.edu>
3##
4## All lines beginning with `## DP:' are a description of the patch.
5## DP: Changes to Hesiod-based ~ expansion; from Athena 9.4 tcsh.
6
7@DPATCH@
8
9--- tcsh-6.14.00.orig/tc.func.c 2005-03-05 22:57:10.000000000 -0500
10+++ tcsh-6.14.00/tc.func.c      2005-06-09 12:00:31.000000000 -0400
11@@ -1569,41 +1569,43 @@
12     return Strcmp(p1->user, p2->user);
13 }
14 
15+#ifdef HESIOD
16 static Char *
17-gethomedir(us)
18-    Char   *us;
19+hes_gethomedir(us)
20+    Char *us;
21 {
22-    struct passwd *pp;
23-#ifdef HESIOD
24     char **res, **res1, *cp;
25     Char *rp;
26-#endif /* HESIOD */
27-   
28-    pp = getpwnam(short2str(us));
29-#ifdef YPBUGS
30-    fix_yp_bugs();
31-#endif /* YPBUGS */
32-    if (pp != NULL) {
33-#if 0
34-       /* Don't return if root */
35-       if (pp->pw_dir[0] == '/' && pp->pw_dir[1] == '\0')
36-           return NULL;
37-       else
38-#endif
39-           return Strsave(str2short(pp->pw_dir));
40-    }
41-#ifdef HESIOD
42+    int which;
43+
44     res = hes_resolve(short2str(us), "filsys");
45     rp = NULL;
46     if (res != NULL) {
47        if ((*res) != NULL) {
48+         int i, lowest, new;
49+
50+         /* Use the first filesys if there's an ordered list */
51+         lowest = -1;
52+         which = 0;
53+         if (res[1]) {
54+           for (i = 0; res[i]; i++) {
55+             cp = strrchr(res[i], ' ');
56+             if (!cp)
57+               return NULL;
58+             new = atoi(cp + 1);
59+             if (lowest == -1 || new < lowest) {
60+               lowest = new;
61+               which = i;
62+             }
63+           }
64+         }
65            /*
66             * Look at the first token to determine how to interpret
67             * the rest of it.
68             * Yes, strtok is evil (it's not thread-safe), but it's also
69             * easy to use.
70             */
71-           cp = strtok(*res, " ");
72+           cp = strtok(res[which], " ");
73            if (strcmp(cp, "AFS") == 0) {
74                /* next token is AFS pathname.. */
75                cp = strtok(NULL, " ");
76@@ -1630,8 +1632,33 @@
77 #endif
78        return rp;
79     }
80+    return NULL;
81+}
82 #endif /* HESIOD */
83+
84+static Char *
85+gethomedir(us)
86+    Char   *us;
87+{
88+    register struct passwd *pp;
89+   
90+#ifdef HESIOD
91+    /* Always do Hesiod filsys lookup on ~~username. */
92+    if (*us == '~')
93+      return hes_gethomedir(us + 1);
94+#endif
95+    pp = getpwnam(short2str(us));
96+#ifdef YPBUGS
97+    fix_yp_bugs();
98+#endif /* YPBUGS */
99+    if (pp != NULL)
100+       return Strsave(str2short(pp->pw_dir));
101+#ifdef HESIOD
102+    /* Fall back to Hesiod lookup on ~username if passwd lookup fails. */
103+    return hes_gethomedir(us);
104+#else /* HESIOD */
105     return NULL;
106+#endif /* HESIOD */
107 }
108 
109 Char   *
Note: See TracBrowser for help on using the repository browser.