gnu: glibc: Add patch implementing "pid/…" magic lookup on the Hurd.
This patch is missing from glibc 2.28 and is needed to support /proc/self lookup when using the Hurd's procfs, which in turn is needed for our 'guile-relocatable.patch'. See <https://lists.gnu.org/archive/html/bug-hurd/2018-12/msg00024.html>. * gnu/packages/patches/glibc-hurd-magic-pid.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/base.scm (glibc)[arguments]: Add 'apply-hurd-patch' phase. [native-inputs]: Add "hurd-magic-pid-patch" input. * gnu/packages/cross-base.scm (cross-libc)[arguments]: Duplicate 'apply-hurd-patch' phase.
This commit is contained in:
parent
8327e73396
commit
92391eaf8d
|
@ -759,6 +759,7 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/glibc-allow-kernel-2.6.32.patch \
|
%D%/packages/patches/glibc-allow-kernel-2.6.32.patch \
|
||||||
%D%/packages/patches/glibc-bootstrap-system.patch \
|
%D%/packages/patches/glibc-bootstrap-system.patch \
|
||||||
%D%/packages/patches/glibc-hidden-visibility-ldconfig.patch \
|
%D%/packages/patches/glibc-hidden-visibility-ldconfig.patch \
|
||||||
|
%D%/packages/patches/glibc-hurd-magic-pid.patch \
|
||||||
%D%/packages/patches/glibc-ldd-x86_64.patch \
|
%D%/packages/patches/glibc-ldd-x86_64.patch \
|
||||||
%D%/packages/patches/glibc-locales.patch \
|
%D%/packages/patches/glibc-locales.patch \
|
||||||
%D%/packages/patches/glibc-memchr-overflow-i686.patch \
|
%D%/packages/patches/glibc-memchr-overflow-i686.patch \
|
||||||
|
|
|
@ -681,6 +681,18 @@ store.")
|
||||||
|
|
||||||
#:tests? #f ; XXX
|
#:tests? #f ; XXX
|
||||||
#:phases (modify-phases %standard-phases
|
#:phases (modify-phases %standard-phases
|
||||||
|
,@(if (hurd-target?)
|
||||||
|
`((add-after 'unpack 'apply-hurd-patch
|
||||||
|
(lambda* (#:key inputs native-inputs
|
||||||
|
#:allow-other-keys)
|
||||||
|
;; TODO: Move this to 'patches' field.
|
||||||
|
(let ((patch (or (assoc-ref native-inputs
|
||||||
|
"hurd-magic-pid-patch")
|
||||||
|
(assoc-ref inputs
|
||||||
|
"hurd-magic-pid-patch"))))
|
||||||
|
(invoke "patch" "-p1" "--force" "--input"
|
||||||
|
patch)))))
|
||||||
|
'())
|
||||||
(add-before
|
(add-before
|
||||||
'configure 'pre-configure
|
'configure 'pre-configure
|
||||||
(lambda* (#:key inputs native-inputs outputs
|
(lambda* (#:key inputs native-inputs outputs
|
||||||
|
@ -806,7 +818,9 @@ store.")
|
||||||
|
|
||||||
,@(if (hurd-target?)
|
,@(if (hurd-target?)
|
||||||
`(("mig" ,mig)
|
`(("mig" ,mig)
|
||||||
("perl" ,perl))
|
("perl" ,perl)
|
||||||
|
("hurd-magic-pid-patch"
|
||||||
|
,(search-patch "glibc-hurd-magic-pid.patch")))
|
||||||
'())))
|
'())))
|
||||||
|
|
||||||
(native-search-paths
|
(native-search-paths
|
||||||
|
|
|
@ -454,6 +454,23 @@ XBINUTILS and the cross tool chain."
|
||||||
flags)))
|
flags)))
|
||||||
((#:phases phases)
|
((#:phases phases)
|
||||||
`(modify-phases ,phases
|
`(modify-phases ,phases
|
||||||
|
;; XXX: The hack below allows us to make sure the
|
||||||
|
;; 'apply-hurd-patch' phase gets added in the first
|
||||||
|
;; cross-libc, but does *not* get added twice subsequently
|
||||||
|
;; when cross-building another libc.
|
||||||
|
,@(if (and (hurd-triplet? target)
|
||||||
|
(not (hurd-target?)))
|
||||||
|
`((add-after 'unpack 'apply-hurd-patch
|
||||||
|
(lambda* (#:key inputs native-inputs
|
||||||
|
#:allow-other-keys)
|
||||||
|
;; TODO: Move this to 'patches' field.
|
||||||
|
(let ((patch (or (assoc-ref native-inputs
|
||||||
|
"hurd-magic-pid-patch")
|
||||||
|
(assoc-ref inputs
|
||||||
|
"hurd-magic-pid-patch"))))
|
||||||
|
(invoke "patch" "-p1" "--force" "--input"
|
||||||
|
patch)))))
|
||||||
|
'())
|
||||||
(add-before 'configure 'set-cross-kernel-headers-path
|
(add-before 'configure 'set-cross-kernel-headers-path
|
||||||
(lambda* (#:key inputs #:allow-other-keys)
|
(lambda* (#:key inputs #:allow-other-keys)
|
||||||
(let* ((kernel (assoc-ref inputs "kernel-headers"))
|
(let* ((kernel (assoc-ref inputs "kernel-headers"))
|
||||||
|
@ -477,7 +494,9 @@ XBINUTILS and the cross tool chain."
|
||||||
,@(if (hurd-triplet? target)
|
,@(if (hurd-triplet? target)
|
||||||
`(("cross-mig"
|
`(("cross-mig"
|
||||||
,@(assoc-ref (package-native-inputs xheaders)
|
,@(assoc-ref (package-native-inputs xheaders)
|
||||||
"cross-mig")))
|
"cross-mig"))
|
||||||
|
("hurd-magic-pid-patch"
|
||||||
|
,(search-patch "glibc-hurd-magic-pid.patch")))
|
||||||
'())
|
'())
|
||||||
,@(package-inputs libc) ;FIXME: static-bash
|
,@(package-inputs libc) ;FIXME: static-bash
|
||||||
,@(package-native-inputs libc)))))))
|
,@(package-native-inputs libc)))))))
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
This patch implements "magic" lookup for "pid/…", as used when looking up
|
||||||
|
/proc/self.
|
||||||
|
|
||||||
|
The patch comes from the 't/magic-pid' branch
|
||||||
|
at <https://git.savannah.gnu.org/cgit/hurd/glibc.git>. It squashes
|
||||||
|
commit 392e52286a302ca6157fbd221295e64ab6b6d8ba (by Justus Winter)
|
||||||
|
and commit 392e52286a302ca6157fbd221295e64ab6b6d8ba (a subsequent fix by
|
||||||
|
Samuel Thibault).
|
||||||
|
|
||||||
|
From: Justus Winter <4winter@informatik.uni-hamburg.de>
|
||||||
|
Subject: [PATCH] hurd: Handle `pid' magical lookup retry
|
||||||
|
|
||||||
|
* hurd/lookup-retry.c: Handle `pid' magical lookup
|
||||||
|
retry.
|
||||||
|
|
||||||
|
diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
|
||||||
|
index aee2ba8f93..6ed8de1653 100644
|
||||||
|
--- a/hurd/lookup-retry.c
|
||||||
|
+++ b/hurd/lookup-retry.c
|
||||||
|
@@ -25,6 +25,7 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <_itoa.h>
|
||||||
|
#include <eloop-threshold.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
|
||||||
|
/* Translate the error from dir_lookup into the error the user sees. */
|
||||||
|
static inline error_t
|
||||||
|
@@ -59,6 +60,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
error_t err;
|
||||||
|
char *file_name;
|
||||||
|
int nloops;
|
||||||
|
+ file_t lastdir = MACH_PORT_NULL;
|
||||||
|
|
||||||
|
error_t lookup_op (file_t startdir)
|
||||||
|
{
|
||||||
|
@@ -107,14 +109,15 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
{
|
||||||
|
case FS_RETRY_REAUTH:
|
||||||
|
if (err = reauthenticate (*result))
|
||||||
|
- return err;
|
||||||
|
+ goto out;
|
||||||
|
/* Fall through. */
|
||||||
|
|
||||||
|
case FS_RETRY_NORMAL:
|
||||||
|
if (nloops++ >= __eloop_threshold ())
|
||||||
|
{
|
||||||
|
__mach_port_deallocate (__mach_task_self (), *result);
|
||||||
|
- return ELOOP;
|
||||||
|
+ err = ELOOP;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* An empty RETRYNAME indicates we have the final port. */
|
||||||
|
@@ -174,7 +177,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
__mach_port_deallocate (__mach_task_self (), *result);
|
||||||
|
- return err;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
startdir = *result;
|
||||||
|
@@ -189,7 +192,10 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
if (*result != MACH_PORT_NULL)
|
||||||
|
__mach_port_deallocate (__mach_task_self (), *result);
|
||||||
|
if (nloops++ >= __eloop_threshold ())
|
||||||
|
- return ELOOP;
|
||||||
|
+ {
|
||||||
|
+ err = ELOOP;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
file_name = &retryname[1];
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -208,7 +214,8 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
(*end != '/' && *end != '\0'))
|
||||||
|
{
|
||||||
|
errno = save;
|
||||||
|
- return ENOENT;
|
||||||
|
+ err = ENOENT;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
if (! get_dtable_port)
|
||||||
|
err = EGRATUITOUS;
|
||||||
|
@@ -226,9 +233,12 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
}
|
||||||
|
errno = save;
|
||||||
|
if (err)
|
||||||
|
- return err;
|
||||||
|
+ goto out;
|
||||||
|
if (*end == '\0')
|
||||||
|
- return 0;
|
||||||
|
+ {
|
||||||
|
+ err = 0;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Do a normal retry on the remaining components. */
|
||||||
|
@@ -255,9 +265,12 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
if (err = __host_info (__mach_host_self (), HOST_BASIC_INFO,
|
||||||
|
(integer_t *) &hostinfo,
|
||||||
|
&hostinfocnt))
|
||||||
|
- return err;
|
||||||
|
+ goto out;
|
||||||
|
if (hostinfocnt != HOST_BASIC_INFO_COUNT)
|
||||||
|
- return EGRATUITOUS;
|
||||||
|
+ {
|
||||||
|
+ err = EGRATUITOUS;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
p = _itoa (hostinfo.cpu_subtype, &retryname[8], 10, 0);
|
||||||
|
*--p = '/';
|
||||||
|
p = _itoa (hostinfo.cpu_type, &retryname[8], 10, 0);
|
||||||
|
@@ -293,10 +306,11 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
}
|
||||||
|
|
||||||
|
case '\0':
|
||||||
|
- return opentty (result);
|
||||||
|
+ err = opentty (result);
|
||||||
|
+ goto out;
|
||||||
|
case '/':
|
||||||
|
if (err = opentty (&startdir))
|
||||||
|
- return err;
|
||||||
|
+ goto out;
|
||||||
|
strcpy (retryname, &retryname[4]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
@@ -306,14 +320,48 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
goto bad_magic;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 'p':
|
||||||
|
+ if (retryname[1] == 'i' && retryname[2] == 'd' &&
|
||||||
|
+ (retryname[3] == '/' || retryname[3] == 0))
|
||||||
|
+ {
|
||||||
|
+ char *p, buf[1024]; /* XXX */
|
||||||
|
+ size_t len;
|
||||||
|
+ p = _itoa (__getpid (), &buf[sizeof buf], 10, 0);
|
||||||
|
+ len = &buf[sizeof buf] - p;
|
||||||
|
+ memcpy (buf, p, len);
|
||||||
|
+ strcpy (buf + len, &retryname[3]);
|
||||||
|
+ strcpy (retryname, buf);
|
||||||
|
+
|
||||||
|
+ /* Do a normal retry on the remaining components. */
|
||||||
|
+ __mach_port_mod_refs (__mach_task_self (), lastdir,
|
||||||
|
+ MACH_PORT_RIGHT_SEND, 1);
|
||||||
|
+ startdir = lastdir;
|
||||||
|
+ file_name = retryname;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ goto bad_magic;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
bad_magic:
|
||||||
|
- return EGRATUITOUS;
|
||||||
|
+ err = EGRATUITOUS;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
- return EGRATUITOUS;
|
||||||
|
+ err = EGRATUITOUS;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (MACH_PORT_VALID (*result) && *result != lastdir)
|
||||||
|
+ {
|
||||||
|
+ if (MACH_PORT_VALID (lastdir))
|
||||||
|
+ __mach_port_deallocate (__mach_task_self (), lastdir);
|
||||||
|
+
|
||||||
|
+ lastdir = *result;
|
||||||
|
+ __mach_port_mod_refs (__mach_task_self (), lastdir,
|
||||||
|
+ MACH_PORT_RIGHT_SEND, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startdir != MACH_PORT_NULL)
|
||||||
|
@@ -326,6 +374,10 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
|
||||||
|
err = (*use_init_port) (dirport, &lookup_op);
|
||||||
|
} while (! err);
|
||||||
|
|
||||||
|
+out:
|
||||||
|
+ if (MACH_PORT_VALID (lastdir))
|
||||||
|
+ __mach_port_deallocate (__mach_task_self (), lastdir);
|
||||||
|
+
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
weak_alias (__hurd_file_name_lookup_retry, hurd_file_name_lookup_retry)
|
Loading…
Reference in New Issue