Blame hurd/hurd.h

Packit Service 82fcde
/* Copyright (C) 1993-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef	_HURD_H
Packit Service 82fcde
Packit Service 82fcde
#define	_HURD_H	1
Packit Service 82fcde
#include <features.h>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Get types, macros, constants and function declarations
Packit Service 82fcde
   for all Mach microkernel interaction.  */
Packit Service 82fcde
#include <mach.h>
Packit Service 82fcde
#include <mach/mig_errors.h>
Packit Service 82fcde
Packit Service 82fcde
/* Get types and constants necessary for Hurd interfaces.  */
Packit Service 82fcde
#include <hurd/hurd_types.h>
Packit Service 82fcde
Packit Service 82fcde
/* Get MiG stub declarations for commonly used Hurd interfaces.  */
Packit Service 82fcde
#include <hurd/auth.h>
Packit Service 82fcde
#include <hurd/process.h>
Packit Service 82fcde
#include <hurd/fs.h>
Packit Service 82fcde
#include <hurd/io.h>
Packit Service 82fcde
Packit Service 82fcde
/* Get `struct hurd_port' and related definitions implementing lightweight
Packit Service 82fcde
   user references for ports.  These are used pervasively throughout the C
Packit Service 82fcde
   library; this is here to avoid putting it in nearly every source file.  */
Packit Service 82fcde
#include <hurd/port.h>
Packit Service 82fcde
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <bits/types/error_t.h>
Packit Service 82fcde
#include <bits/types/sigset_t.h>
Packit Service 82fcde
Packit Service 82fcde
#ifndef _HURD_H_EXTERN_INLINE
Packit Service 82fcde
#define _HURD_H_EXTERN_INLINE __extern_inline
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
extern int __hurd_fail (error_t err);
Packit Service 82fcde
Packit Service 82fcde
#ifdef __USE_EXTERN_INLINES
Packit Service 82fcde
_HURD_H_EXTERN_INLINE int
Packit Service 82fcde
__hurd_fail (error_t err)
Packit Service 82fcde
{
Packit Service 82fcde
  switch (err)
Packit Service 82fcde
    {
Packit Service 82fcde
    case EMACH_SEND_INVALID_DEST:
Packit Service 82fcde
    case EMIG_SERVER_DIED:
Packit Service 82fcde
      /* The server has disappeared!  */
Packit Service 82fcde
      err = (error_t) EIEIO;
Packit Service 82fcde
      break;
Packit Service 82fcde
Packit Service 82fcde
    case KERN_NO_SPACE:
Packit Service 82fcde
      err = (error_t) ENOMEM;
Packit Service 82fcde
      break;
Packit Service 82fcde
Packit Service 82fcde
    case KERN_INVALID_ARGUMENT:
Packit Service 82fcde
      err = (error_t) EINVAL;
Packit Service 82fcde
      break;
Packit Service 82fcde
Packit Service 82fcde
    case 0:
Packit Service 82fcde
      return 0;
Packit Service 82fcde
Packit Service 82fcde
    default:
Packit Service 82fcde
      break;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  errno = err;
Packit Service 82fcde
  return -1;
Packit Service 82fcde
}
Packit Service 82fcde
#endif
Packit Service 82fcde

Packit Service 82fcde
/* Basic ports and info, initialized by startup.  */
Packit Service 82fcde
Packit Service 82fcde
extern int _hurd_exec_flags;	/* Flags word passed in exec_startup.  */
Packit Service 82fcde
extern struct hurd_port *_hurd_ports;
Packit Service 82fcde
extern unsigned int _hurd_nports;
Packit Service 82fcde
extern mode_t _hurd_umask;
Packit Service 82fcde
extern sigset_t _hurdsig_traced;
Packit Service 82fcde
Packit Service 82fcde
/* Shorthand macro for internal library code referencing _hurd_ports (see
Packit Service 82fcde
   <hurd/port.h>).  */
Packit Service 82fcde
Packit Service 82fcde
#define	__USEPORT(which, expr) \
Packit Service 82fcde
  HURD_PORT_USE (&_hurd_ports[INIT_PORT_##which], (expr))
Packit Service 82fcde
Packit Service 82fcde
/* Function version of __USEPORT: calls OPERATE with a send right.  */
Packit Service 82fcde
Packit Service 82fcde
extern error_t _hurd_ports_use (int which, error_t (*operate) (mach_port_t));
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Base address and size of the initial stack set up by the exec server.
Packit Service 82fcde
   If using cthreads, this stack is deallocated in startup.
Packit Service 82fcde
   Not locked.  */
Packit Service 82fcde
Packit Service 82fcde
extern vm_address_t _hurd_stack_base;
Packit Service 82fcde
extern vm_size_t _hurd_stack_size;
Packit Service 82fcde
Packit Service 82fcde
/* Initial file descriptor table we were passed at startup.  If we are
Packit Service 82fcde
   using a real dtable, these are turned into that and then cleared at
Packit Service 82fcde
   startup.  If not, these are never changed after startup.  Not locked.  */
Packit Service 82fcde
Packit Service 82fcde
extern mach_port_t *_hurd_init_dtable;
Packit Service 82fcde
extern mach_msg_type_number_t _hurd_init_dtablesize;
Packit Service 82fcde

Packit Service 82fcde
/* Current process IDs.  */
Packit Service 82fcde
Packit Service 82fcde
extern pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp;
Packit Service 82fcde
extern int _hurd_orphaned;
Packit Service 82fcde
Packit Service 82fcde
/* This variable is incremented every time the process IDs change.  */
Packit Service 82fcde
extern unsigned int _hurd_pids_changed_stamp;
Packit Service 82fcde
Packit Service 82fcde
/* This condition is broadcast every time the process IDs change.  */
Packit Service 82fcde
extern struct condition _hurd_pids_changed_sync;
Packit Service 82fcde

Packit Service 82fcde
/* Unix `data break', for brk and sbrk.
Packit Service 82fcde
   If brk and sbrk are not used, this info will not be initialized or used.  */
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Data break.  This is what `sbrk (0)' returns.  */
Packit Service 82fcde
Packit Service 82fcde
extern vm_address_t _hurd_brk;
Packit Service 82fcde
Packit Service 82fcde
/* End of allocated space.  This is generally `round_page (_hurd_brk)'.  */
Packit Service 82fcde
Packit Service 82fcde
extern vm_address_t _hurd_data_end;
Packit Service 82fcde
Packit Service 82fcde
/* This mutex locks _hurd_brk and _hurd_data_end.  */
Packit Service 82fcde
Packit Service 82fcde
extern struct mutex _hurd_brk_lock;
Packit Service 82fcde
Packit Service 82fcde
/* Set the data break to NEWBRK; _hurd_brk_lock must
Packit Service 82fcde
   be held, and is released on return.  */
Packit Service 82fcde
Packit Service 82fcde
extern int _hurd_set_brk (vm_address_t newbrk);
Packit Service 82fcde

Packit Service 82fcde
#include <bits/types/FILE.h>
Packit Service 82fcde
Packit Service 82fcde
/* Calls to get and set basic ports.  */
Packit Service 82fcde
Packit Service 82fcde
extern error_t _hurd_ports_get (unsigned int which, mach_port_t *result);
Packit Service 82fcde
extern error_t _hurd_ports_set (unsigned int which, mach_port_t newport);
Packit Service 82fcde
Packit Service 82fcde
extern process_t getproc (void);
Packit Service 82fcde
extern file_t getcwdir (void), getcrdir (void);
Packit Service 82fcde
extern auth_t getauth (void);
Packit Service 82fcde
extern mach_port_t getcttyid (void);
Packit Service 82fcde
extern int setproc (process_t);
Packit Service 82fcde
extern int setcwdir (file_t), setcrdir (file_t);
Packit Service 82fcde
extern int setcttyid (mach_port_t);
Packit Service 82fcde
Packit Service 82fcde
/* Does reauth with the proc server and fd io servers.  */
Packit Service 82fcde
extern int __setauth (auth_t), setauth (auth_t);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Modify a port cell by looking up a directory name.
Packit Service 82fcde
   This verifies that it is a directory and that we have search permission.  */
Packit Service 82fcde
extern int _hurd_change_directory_port_from_name (struct hurd_port *portcell,
Packit Service 82fcde
						  const char *name);
Packit Service 82fcde
/* Same thing, but using an open file descriptor.
Packit Service 82fcde
   Also verifies that it is a directory and that we have search permission.  */
Packit Service 82fcde
extern int _hurd_change_directory_port_from_fd (struct hurd_port *portcell,
Packit Service 82fcde
						int fd);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Get and set the effective UID set.  */
Packit Service 82fcde
extern int geteuids (int __n, uid_t *__uidset);
Packit Service 82fcde
extern int seteuids (int __n, const uid_t *__uidset);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Split FILE into a directory and a name within the directory.  The
Packit Service 82fcde
   directory lookup uses the current root and working directory.  If
Packit Service 82fcde
   successful, stores in *NAME a pointer into FILE where the name
Packit Service 82fcde
   within directory begins and returns a port to the directory;
Packit Service 82fcde
   otherwise sets `errno' and returns MACH_PORT_NULL.  */
Packit Service 82fcde
Packit Service 82fcde
extern file_t __file_name_split (const char *file, char **name);
Packit Service 82fcde
extern file_t file_name_split (const char *file, char **name);
Packit Service 82fcde
Packit Service 82fcde
/* Split DIRECTORY into a parent directory and a name within the directory.
Packit Service 82fcde
   This is the same as file_name_split, but ignores trailing slashes.  */
Packit Service 82fcde
Packit Service 82fcde
extern file_t __directory_name_split (const char *file, char **name);
Packit Service 82fcde
extern file_t directory_name_split (const char *file, char **name);
Packit Service 82fcde
Packit Service 82fcde
/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>).
Packit Service 82fcde
   The file lookup uses the current root and working directory.
Packit Service 82fcde
   Returns a port to the file if successful; otherwise sets `errno'
Packit Service 82fcde
   and returns MACH_PORT_NULL.  */
Packit Service 82fcde
Packit Service 82fcde
extern file_t __file_name_lookup (const char *file, int flags, mode_t mode);
Packit Service 82fcde
extern file_t file_name_lookup (const char *file, int flags, mode_t mode);
Packit Service 82fcde
Packit Service 82fcde
/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>).  The
Packit Service 82fcde
   file lookup uses the current root directory, but uses STARTDIR as the
Packit Service 82fcde
   "working directory" for file relative names.  Returns a port to the file
Packit Service 82fcde
   if successful; otherwise sets `errno' and returns MACH_PORT_NULL.  */
Packit Service 82fcde
Packit Service 82fcde
extern file_t __file_name_lookup_under (file_t startdir, const char *file,
Packit Service 82fcde
					int flags, mode_t mode);
Packit Service 82fcde
extern file_t file_name_lookup_under (file_t startdir, const char *file,
Packit Service 82fcde
				      int flags, mode_t mode);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Lookup FILE_NAME and return the node opened with FLAGS & MODE
Packit Service 82fcde
   (see hurd_file_name_lookup for details), but a simple file name (without
Packit Service 82fcde
   any directory prefixes) will be consecutively prefixed with the pathnames
Packit Service 82fcde
   in the `:' separated list PATH until one succeeds in a successful lookup.
Packit Service 82fcde
   If none succeed, then the first error that wasn't ENOENT is returned, or
Packit Service 82fcde
   ENOENT if no other errors were returned.  If PREFIXED_NAME is non-NULL,
Packit Service 82fcde
   then if the result is looked up directly, *PREFIXED_NAME is set to NULL, and
Packit Service 82fcde
   if it is looked up using a prefix from PATH, *PREFIXED_NAME is set to
Packit Service 82fcde
   malloc'd storage containing the prefixed name.  */
Packit Service 82fcde
extern file_t file_name_path_lookup (const char *file_name, const char *path,
Packit Service 82fcde
				     int flags, mode_t mode,
Packit Service 82fcde
				     char **prefixed_name);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Open a file descriptor on a port.  FLAGS are as for `open'; flags
Packit Service 82fcde
   affected by io_set_openmodes are not changed by this.  If successful,
Packit Service 82fcde
   this consumes a user reference for PORT (which will be deallocated on
Packit Service 82fcde
   close).  */
Packit Service 82fcde
Packit Service 82fcde
extern int openport (io_t port, int flags);
Packit Service 82fcde
Packit Service 82fcde
/* Open a stream on a port.  MODE is as for `fopen'.
Packit Service 82fcde
   If successful, this consumes a user reference for PORT
Packit Service 82fcde
   (which will be deallocated on fclose).  */
Packit Service 82fcde
Packit Service 82fcde
extern FILE *fopenport (io_t port, const char *mode);
Packit Service 82fcde
extern FILE *__fopenport (io_t port, const char *mode);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Deprecated: use _hurd_exec_paths instead.  */
Packit Service 82fcde
Packit Service 82fcde
extern error_t _hurd_exec (task_t task,
Packit Service 82fcde
			   file_t file,
Packit Service 82fcde
			   char *const argv[],
Packit Service 82fcde
			   char *const envp[]) __attribute_deprecated__;
Packit Service 82fcde
Packit Service 82fcde
/* Execute a file, replacing TASK's current program image.  */
Packit Service 82fcde
Packit Service 82fcde
extern error_t _hurd_exec_paths (task_t task,
Packit Service 82fcde
				 file_t file,
Packit Service 82fcde
				 const char *path,
Packit Service 82fcde
				 const char *abspath,
Packit Service 82fcde
				 char *const argv[],
Packit Service 82fcde
				 char *const envp[]);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Inform the proc server we have exited with STATUS, and kill the
Packit Service 82fcde
   task thoroughly.  This function never returns, no matter what.  */
Packit Service 82fcde
Packit Service 82fcde
extern void _hurd_exit (int status) __attribute__ ((noreturn));
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Initialize the library data structures from the
Packit Service 82fcde
   ints and ports passed to us by the exec server.
Packit Service 82fcde
   Then vm_deallocate PORTARRAY and INTARRAY.  */
Packit Service 82fcde
Packit Service 82fcde
extern void _hurd_init (int flags, char **argv,
Packit Service 82fcde
			mach_port_t *portarray, size_t portarraysize,
Packit Service 82fcde
			int *intarray, size_t intarraysize);
Packit Service 82fcde
Packit Service 82fcde
/* Do startup handshaking with the proc server, and initialize library data
Packit Service 82fcde
   structures that require proc server interaction.  This includes
Packit Service 82fcde
   initializing signals; see _hurdsig_init in <hurd/signal.h>.  */
Packit Service 82fcde
Packit Service 82fcde
extern void _hurd_proc_init (char **argv,
Packit Service 82fcde
			     const int *intarray, size_t intarraysize);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Return the socket server for sockaddr domain DOMAIN.  If DEAD is
Packit Service 82fcde
   nonzero, remove the old cached port and always do a fresh lookup.
Packit Service 82fcde
Packit Service 82fcde
   It is assumed that a socket server will stay alive during a complex socket
Packit Service 82fcde
   operation involving several RPCs.  But a socket server may die during
Packit Service 82fcde
   long idle periods between socket operations.  Callers should first pass
Packit Service 82fcde
   zero for DEAD; if the first socket RPC tried on the returned port fails
Packit Service 82fcde
   with MACH_SEND_INVALID_DEST or MIG_SERVER_DIED (indicating the server
Packit Service 82fcde
   went away), the caller should call _hurd_socket_server again with DEAD
Packit Service 82fcde
   nonzero and retry the RPC on the new socket server port.  */
Packit Service 82fcde
Packit Service 82fcde
extern socket_t _hurd_socket_server (int domain, int dead);
Packit Service 82fcde
Packit Service 82fcde
/* Send a `sig_post' RPC to process number PID.  If PID is zero,
Packit Service 82fcde
   send the message to all processes in the current process's process group.
Packit Service 82fcde
   If PID is < -1, send SIG to all processes in process group - PID.
Packit Service 82fcde
   SIG and REFPORT are passed along in the request message.  */
Packit Service 82fcde
Packit Service 82fcde
extern error_t _hurd_sig_post (pid_t pid, int sig, mach_port_t refport);
Packit Service 82fcde
extern error_t hurd_sig_post (pid_t pid, int sig, mach_port_t refport);
Packit Service 82fcde
Packit Service 82fcde
/* Fetch the host privileged port and device master port from the proc
Packit Service 82fcde
   server.  They are fetched only once and then cached in the
Packit Service 82fcde
   variables below.  A special program that gets them from somewhere
Packit Service 82fcde
   other than the proc server (such as a bootstrap filesystem) can set
Packit Service 82fcde
   these variables to install the ports.  */
Packit Service 82fcde
Packit Service 82fcde
extern kern_return_t __get_privileged_ports (mach_port_t *host_priv_ptr,
Packit Service 82fcde
					     device_t *device_master_ptr);
Packit Service 82fcde
extern kern_return_t get_privileged_ports (mach_port_t *host_priv_ptr,
Packit Service 82fcde
					   device_t *device_master_ptr);
Packit Service 82fcde
extern mach_port_t _hurd_host_priv, _hurd_device_master;
Packit Service 82fcde
Packit Service 82fcde
/* Return the PID of the task whose control port is TASK.
Packit Service 82fcde
   On error, sets `errno' and returns -1.  */
Packit Service 82fcde
Packit Service 82fcde
extern pid_t __task2pid (task_t task), task2pid (task_t task);
Packit Service 82fcde
Packit Service 82fcde
/* Return the task control port of process PID.
Packit Service 82fcde
   On error, sets `errno' and returns MACH_PORT_NULL.  */
Packit Service 82fcde
Packit Service 82fcde
extern task_t __pid2task (pid_t pid), pid2task (pid_t pid);
Packit Service 82fcde
Packit Service 82fcde
/* Return the current thread's thread port.  This is a cheap operation (no
Packit Service 82fcde
   system call), but it relies on Hurd signal state being set up.  */
Packit Service 82fcde
extern thread_t hurd_thread_self (void);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Cancel pending operations on THREAD.  If it is doing an interruptible RPC,
Packit Service 82fcde
   that RPC will now return EINTR; otherwise, the "cancelled" flag will be
Packit Service 82fcde
   set, causing the next `hurd_check_cancel' call to return nonzero or the
Packit Service 82fcde
   next interruptible RPC to return EINTR (whichever is called first).  */
Packit Service 82fcde
extern error_t hurd_thread_cancel (thread_t thread);
Packit Service 82fcde
Packit Service 82fcde
/* Test and clear the calling thread's "cancelled" flag.  */
Packit Service 82fcde
extern int hurd_check_cancel (void);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Return the io server port for file descriptor FD.
Packit Service 82fcde
   This adds a Mach user reference to the returned port.
Packit Service 82fcde
   On error, sets `errno' and returns MACH_PORT_NULL.  */
Packit Service 82fcde
Packit Service 82fcde
extern io_t __getdport (int fd), getdport (int fd);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
#include <stdarg.h>
Packit Service 82fcde
Packit Service 82fcde
/* Write formatted output to PORT, a Mach port supporting the i/o protocol,
Packit Service 82fcde
   according to the format string FORMAT, using the argument list in ARG.  */
Packit Service 82fcde
int vpprintf (io_t port, const char *format, va_list arg);
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
#endif	/* hurd.h */