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.
		
			
				
	
	
		
			190 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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)
 |