gnu: glibc: Fix ldd path on powerpc*.
[jackhill/guix/guix.git] / gnu / packages / patches / glibc-hurd-magic-pid.patch
1 This patch implements "magic" lookup for "pid/…", as used when looking up
2 /proc/self.
3
4 The patch comes from the 't/magic-pid' branch
5 at <https://git.savannah.gnu.org/cgit/hurd/glibc.git>. It squashes
6 commit 392e52286a302ca6157fbd221295e64ab6b6d8ba (by Justus Winter)
7 and commit 392e52286a302ca6157fbd221295e64ab6b6d8ba (a subsequent fix by
8 Samuel Thibault).
9
10 From: Justus Winter <4winter@informatik.uni-hamburg.de>
11 Subject: [PATCH] hurd: Handle `pid' magical lookup retry
12
13 * hurd/lookup-retry.c: Handle `pid' magical lookup
14 retry.
15
16 diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
17 index aee2ba8f93..6ed8de1653 100644
18 --- a/hurd/lookup-retry.c
19 +++ b/hurd/lookup-retry.c
20 @@ -25,6 +25,7 @@
21 #include <string.h>
22 #include <_itoa.h>
23 #include <eloop-threshold.h>
24 +#include <unistd.h>
25
26 /* Translate the error from dir_lookup into the error the user sees. */
27 static inline error_t
28 @@ -59,6 +60,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
29 error_t err;
30 char *file_name;
31 int nloops;
32 + file_t lastdir = MACH_PORT_NULL;
33
34 error_t lookup_op (file_t startdir)
35 {
36 @@ -107,14 +109,15 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
37 {
38 case FS_RETRY_REAUTH:
39 if (err = reauthenticate (*result))
40 - return err;
41 + goto out;
42 /* Fall through. */
43
44 case FS_RETRY_NORMAL:
45 if (nloops++ >= __eloop_threshold ())
46 {
47 __mach_port_deallocate (__mach_task_self (), *result);
48 - return ELOOP;
49 + err = ELOOP;
50 + goto out;
51 }
52
53 /* An empty RETRYNAME indicates we have the final port. */
54 @@ -174,7 +177,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
55
56 if (err)
57 __mach_port_deallocate (__mach_task_self (), *result);
58 - return err;
59 + goto out;
60 }
61
62 startdir = *result;
63 @@ -189,7 +192,10 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
64 if (*result != MACH_PORT_NULL)
65 __mach_port_deallocate (__mach_task_self (), *result);
66 if (nloops++ >= __eloop_threshold ())
67 - return ELOOP;
68 + {
69 + err = ELOOP;
70 + goto out;
71 + }
72 file_name = &retryname[1];
73 break;
74
75 @@ -208,7 +214,8 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
76 (*end != '/' && *end != '\0'))
77 {
78 errno = save;
79 - return ENOENT;
80 + err = ENOENT;
81 + goto out;
82 }
83 if (! get_dtable_port)
84 err = EGRATUITOUS;
85 @@ -226,9 +233,12 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
86 }
87 errno = save;
88 if (err)
89 - return err;
90 + goto out;
91 if (*end == '\0')
92 - return 0;
93 + {
94 + err = 0;
95 + goto out;
96 + }
97 else
98 {
99 /* Do a normal retry on the remaining components. */
100 @@ -255,9 +265,12 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
101 if (err = __host_info (__mach_host_self (), HOST_BASIC_INFO,
102 (integer_t *) &hostinfo,
103 &hostinfocnt))
104 - return err;
105 + goto out;
106 if (hostinfocnt != HOST_BASIC_INFO_COUNT)
107 - return EGRATUITOUS;
108 + {
109 + err = EGRATUITOUS;
110 + goto out;
111 + }
112 p = _itoa (hostinfo.cpu_subtype, &retryname[8], 10, 0);
113 *--p = '/';
114 p = _itoa (hostinfo.cpu_type, &retryname[8], 10, 0);
115 @@ -293,10 +306,11 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
116 }
117
118 case '\0':
119 - return opentty (result);
120 + err = opentty (result);
121 + goto out;
122 case '/':
123 if (err = opentty (&startdir))
124 - return err;
125 + goto out;
126 strcpy (retryname, &retryname[4]);
127 break;
128 default:
129 @@ -306,14 +320,48 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
130 goto bad_magic;
131 break;
132
133 + case 'p':
134 + if (retryname[1] == 'i' && retryname[2] == 'd' &&
135 + (retryname[3] == '/' || retryname[3] == 0))
136 + {
137 + char *p, buf[1024]; /* XXX */
138 + size_t len;
139 + p = _itoa (__getpid (), &buf[sizeof buf], 10, 0);
140 + len = &buf[sizeof buf] - p;
141 + memcpy (buf, p, len);
142 + strcpy (buf + len, &retryname[3]);
143 + strcpy (retryname, buf);
144 +
145 + /* Do a normal retry on the remaining components. */
146 + __mach_port_mod_refs (__mach_task_self (), lastdir,
147 + MACH_PORT_RIGHT_SEND, 1);
148 + startdir = lastdir;
149 + file_name = retryname;
150 + }
151 + else
152 + goto bad_magic;
153 + break;
154 +
155 default:
156 bad_magic:
157 - return EGRATUITOUS;
158 + err = EGRATUITOUS;
159 + goto out;
160 }
161 break;
162
163 default:
164 - return EGRATUITOUS;
165 + err = EGRATUITOUS;
166 + goto out;
167 + }
168 +
169 + if (MACH_PORT_VALID (*result) && *result != lastdir)
170 + {
171 + if (MACH_PORT_VALID (lastdir))
172 + __mach_port_deallocate (__mach_task_self (), lastdir);
173 +
174 + lastdir = *result;
175 + __mach_port_mod_refs (__mach_task_self (), lastdir,
176 + MACH_PORT_RIGHT_SEND, 1);
177 }
178
179 if (startdir != MACH_PORT_NULL)
180 @@ -326,6 +374,10 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
181 err = (*use_init_port) (dirport, &lookup_op);
182 } while (! err);
183
184 +out:
185 + if (MACH_PORT_VALID (lastdir))
186 + __mach_port_deallocate (__mach_task_self (), lastdir);
187 +
188 return err;
189 }
190 weak_alias (__hurd_file_name_lookup_retry, hurd_file_name_lookup_retry)