(linenum→info "unix/slp.c:2238")

glibc/2.7/hurd/hurd.h

    1: /* Copyright (C) 1993,94,95,96,97,98,99,2001,2002,2007
    2:    Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #ifndef _HURD_H
   21: 
   22: #define _HURD_H 1
   23: #include <features.h>
   24: 
   25: 
   26: /* Get types, macros, constants and function declarations
   27:    for all Mach microkernel interaction.  */
   28: #include <mach.h>
   29: #include <mach/mig_errors.h>
   30: 
   31: /* Get types and constants necessary for Hurd interfaces.  */
   32: #include <hurd/hurd_types.h>
   33: 
   34: /* Get MiG stub declarations for commonly used Hurd interfaces.  */
   35: #include <hurd/auth.h>
   36: #include <hurd/process.h>
   37: #include <hurd/fs.h>
   38: #include <hurd/io.h>
   39: 
   40: /* Get `struct hurd_port' and related definitions implementing lightweight
   41:    user references for ports.  These are used pervasively throughout the C
   42:    library; this is here to avoid putting it in nearly every source file.  */
   43: #include <hurd/port.h>
   44: 
   45: #include <errno.h>
   46: 
   47: #ifndef _HURD_H_EXTERN_INLINE
   48: #define _HURD_H_EXTERN_INLINE __extern_inline
   49: #endif
   50: 
   51: _HURD_H_EXTERN_INLINE int
   52: __hurd_fail (error_t err)
   53: {
   54:   switch (err)
   55:     {
   56:     case EMACH_SEND_INVALID_DEST:
   57:     case EMIG_SERVER_DIED:
   58:       /* The server has disappeared!  */
   59:       err = EIEIO;
   60:       break;
   61: 
   62:     case KERN_NO_SPACE:
   63:       err = ENOMEM;
   64:       break;
   65: 
   66:     case KERN_INVALID_ARGUMENT:
   67:       err = EINVAL;
   68:       break;
   69: 
   70:     case 0:
   71:       return 0;
   72: 
   73:     default:
   74:       break;
   75:     }
   76: 
   77:   errno = err;
   78:   return -1;
   79: }
   80: ^L
   81: /* Basic ports and info, initialized by startup.  */
   82: 
   83: extern int _hurd_exec_flags;    /* Flags word passed in exec_startup.  */
   84: extern struct hurd_port *_hurd_ports;
   85: extern unsigned int _hurd_nports;
   86: extern mode_t _hurd_umask;
   87: extern sigset_t _hurdsig_traced;
   88: 
   89: /* Shorthand macro for internal library code referencing _hurd_ports (see
   90:    <hurd/port.h>).  */
   91: 
   92: #define __USEPORT(which, expr) \
   93:   HURD_PORT_USE (&_hurd_ports[INIT_PORT_##which], (expr))
   94: 
   95: /* Function version of __USEPORT: calls OPERATE with a send right.  */
   96: 
   97: extern error_t _hurd_ports_use (int which, error_t (*operate) (mach_port_t));
   98: 
   99: 
  100: /* Base address and size of the initial stack set up by the exec server.
  101:    If using cthreads, this stack is deallocated in startup.
  102:    Not locked.  */
  103: 
  104: extern vm_address_t _hurd_stack_base;
  105: extern vm_size_t _hurd_stack_size;
  106: 
  107: /* Initial file descriptor table we were passed at startup.  If we are
  108:    using a real dtable, these are turned into that and then cleared at
  109:    startup.  If not, these are never changed after startup.  Not locked.  */
  110: 
  111: extern mach_port_t *_hurd_init_dtable;
  112: extern mach_msg_type_number_t _hurd_init_dtablesize;
  113: ^L
  114: /* Current process IDs.  */
  115: 
  116: extern pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp;
  117: extern int _hurd_orphaned;
  118: 
  119: /* This variable is incremented every time the process IDs change.  */
  120: extern unsigned int _hurd_pids_changed_stamp;
  121: 
  122: /* This condition is broadcast every time the process IDs change.  */
  123: extern struct condition _hurd_pids_changed_sync;
  124: ^L
  125: /* Unix `data break', for brk and sbrk.
  126:    If brk and sbrk are not used, this info will not be initialized or used.  */
  127: 
  128: 
  129: /* Data break.  This is what `sbrk (0)' returns.  */
  130: 
  131: extern vm_address_t _hurd_brk;
  132: 
  133: /* End of allocated space.  This is generally `round_page (_hurd_brk)'.  */
  134: 
  135: extern vm_address_t _hurd_data_end;
  136: 
  137: /* This mutex locks _hurd_brk and _hurd_data_end.  */
  138: 
  139: extern struct mutex _hurd_brk_lock;
  140: 
  141: /* Set the data break to NEWBRK; _hurd_brk_lock must
  142:    be held, and is released on return.  */
  143: 
  144: extern int _hurd_set_brk (vm_address_t newbrk);
  145: ^L
  146: #define __need_FILE
  147: #include <stdio.h>
  148: 
  149: /* Calls to get and set basic ports.  */
  150: 
  151: extern error_t _hurd_ports_get (unsigned int which, mach_port_t *result);
  152: extern error_t _hurd_ports_set (unsigned int which, mach_port_t newport);
  153: 
  154: extern process_t getproc (void);
  155: extern file_t getcwdir (void), getcrdir (void);
  156: extern auth_t getauth (void);
  157: extern mach_port_t getcttyid (void);
  158: extern int setproc (process_t);
  159: extern int setcwdir (file_t), setcrdir (file_t);
  160: extern int setcttyid (mach_port_t);
  161: 
  162: /* Does reauth with the proc server and fd io servers.  */
  163: extern int __setauth (auth_t), setauth (auth_t);
  164: 
  165: 
  166: /* Modify a port cell by looking up a directory name.
  167:    This verifies that it is a directory and that we have search permission.  */
  168: extern int _hurd_change_directory_port_from_name (struct hurd_port *portcell,
  169:                                                   const char *name);
  170: /* Same thing, but using an open file descriptor.
  171:    Also verifies that it is a directory and that we have search permission.  */
  172: extern int _hurd_change_directory_port_from_fd (struct hurd_port *portcell,
  173:                                                 int fd);
  174: 
  175: 
  176: 
  177: /* Get and set the effective UID set.  */
  178: extern int geteuids (int __n, uid_t *__uidset);
  179: extern int seteuids (int __n, const uid_t *__uidset);
  180: 
  181: 
  182: /* Split FILE into a directory and a name within the directory.  The
  183:    directory lookup uses the current root and working directory.  If
  184:    successful, stores in *NAME a pointer into FILE where the name
  185:    within directory begins and returns a port to the directory;
  186:    otherwise sets `errno' and returns MACH_PORT_NULL.  */
  187: 
  188: extern file_t __file_name_split (const char *file, char **name);
  189: extern file_t file_name_split (const char *file, char **name);
  190: 
  191: /* Split DIRECTORY into a parent directory and a name within the directory.
  192:    This is the same as file_name_split, but ignores trailing slashes.  */
  193: 
  194: extern file_t __directory_name_split (const char *file, char **name);
  195: extern file_t directory_name_split (const char *file, char **name);
  196: 
  197: /* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>).
  198:    The file lookup uses the current root and working directory.
  199:    Returns a port to the file if successful; otherwise sets `errno'
  200:    and returns MACH_PORT_NULL.  */
  201: 
  202: extern file_t __file_name_lookup (const char *file, int flags, mode_t mode);
  203: extern file_t file_name_lookup (const char *file, int flags, mode_t mode);
  204: 
  205: /* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>).  The
  206:    file lookup uses the current root directory, but uses STARTDIR as the
  207:    "working directory" for file relative names.  Returns a port to the file
  208:    if successful; otherwise sets `errno' and returns MACH_PORT_NULL.  */
  209: 
  210: extern file_t __file_name_lookup_under (file_t startdir, const char *file,
  211:                                         int flags, mode_t mode);
  212: extern file_t file_name_lookup_under (file_t startdir, const char *file,
  213:                                       int flags, mode_t mode);
  214: 
  215: 
  216: /* Lookup FILE_NAME and return the node opened with FLAGS & MODE
  217:    (see hurd_file_name_lookup for details), but a simple file name (without
  218:    any directory prefixes) will be consecutively prefixed with the pathnames
  219:    in the `:' separated list PATH until one succeeds in a successful lookup.
  220:    If none succeed, then the first error that wasn't ENOENT is returned, or
  221:    ENOENT if no other errors were returned.  If PREFIXED_NAME is non-NULL,
  222:    then if the result is looked up directly, *PREFIXED_NAME is set to NULL, and
  223:    if it is looked up using a prefix from PATH, *PREFIXED_NAME is set to
  224:    malloc'd storage containing the prefixed name.  */
  225: extern file_t file_name_path_lookup (const char *file_name, const char *path,
  226:                                      int flags, mode_t mode,
  227:                                      char **prefixed_name);
  228: 
  229: 
  230: 
  231: /* Open a file descriptor on a port.  FLAGS are as for `open'; flags
  232:    affected by io_set_openmodes are not changed by this.  If successful,
  233:    this consumes a user reference for PORT (which will be deallocated on
  234:    close).  */
  235: 
  236: extern int openport (io_t port, int flags);
  237: 
  238: /* Open a stream on a port.  MODE is as for `fopen'.
  239:    If successful, this consumes a user reference for PORT
  240:    (which will be deallocated on fclose).  */
  241: 
  242: extern FILE *fopenport (io_t port, const char *mode);
  243: extern FILE *__fopenport (io_t port, const char *mode);
  244: 
  245: 
  246: /* Execute a file, replacing TASK's current program image.  */
  247: 
  248: extern error_t _hurd_exec (task_t task,
  249:                            file_t file,
  250:                            char *const argv[],
  251:                            char *const envp[]);
  252: 
  253: 
  254: /* Inform the proc server we have exited with STATUS, and kill the
  255:    task thoroughly.  This function never returns, no matter what.  */
  256: 
  257: extern void _hurd_exit (int status) __attribute__ ((noreturn));
  258: 
  259: 
  260: /* Initialize the library data structures from the
  261:    ints and ports passed to us by the exec server.
  262:    Then vm_deallocate PORTARRAY and INTARRAY.  */
  263: 
  264: extern void _hurd_init (int flags, char **argv,
  265:                         mach_port_t *portarray, size_t portarraysize,
  266:                         int *intarray, size_t intarraysize);
  267: 
  268: /* Do startup handshaking with the proc server, and initialize library data
  269:    structures that require proc server interaction.  This includes
  270:    initializing signals; see _hurdsig_init in <hurd/signal.h>.  */
  271: 
  272: extern void _hurd_proc_init (char **argv,
  273:                              const int *intarray, size_t intarraysize);
  274: 
  275: 
  276: /* Return the socket server for sockaddr domain DOMAIN.  If DEAD is
  277:    nonzero, remove the old cached port and always do a fresh lookup.
  278: 
  279:    It is assumed that a socket server will stay alive during a complex socket
  280:    operation involving several RPCs.  But a socket server may die during
  281:    long idle periods between socket operations.  Callers should first pass
  282:    zero for DEAD; if the first socket RPC tried on the returned port fails
  283:    with MACH_SEND_INVALID_DEST or MIG_SERVER_DIED (indicating the server
  284:    went away), the caller should call _hurd_socket_server again with DEAD
  285:    nonzero and retry the RPC on the new socket server port.  */
  286: 
  287: extern socket_t _hurd_socket_server (int domain, int dead);
  288: 
  289: /* Send a `sig_post' RPC to process number PID.  If PID is zero,
  290:    send the message to all processes in the current process's process group.
  291:    If PID is < -1, send SIG to all processes in process group - PID.
  292:    SIG and REFPORT are passed along in the request message.  */
  293: 
  294: extern error_t _hurd_sig_post (pid_t pid, int sig, mach_port_t refport);
  295: extern error_t hurd_sig_post (pid_t pid, int sig, mach_port_t refport);
  296: 
  297: /* Fetch the host privileged port and device master port from the proc
  298:    server.  They are fetched only once and then cached in the
  299:    variables below.  A special program that gets them from somewhere
  300:    other than the proc server (such as a bootstrap filesystem) can set
  301:    these variables to install the ports.  */
  302: 
  303: extern kern_return_t __get_privileged_ports (mach_port_t *host_priv_ptr,
  304:                                              device_t *device_master_ptr);
  305: extern kern_return_t get_privileged_ports (mach_port_t *host_priv_ptr,
  306:                                            device_t *device_master_ptr);
  307: extern mach_port_t _hurd_host_priv, _hurd_device_master;
  308: 
  309: /* Return the PID of the task whose control port is TASK.
  310:    On error, sets `errno' and returns -1.  */
  311: 
  312: extern pid_t __task2pid (task_t task), task2pid (task_t task);
  313: 
  314: /* Return the task control port of process PID.
  315:    On error, sets `errno' and returns MACH_PORT_NULL.  */
  316: 
  317: extern task_t __pid2task (pid_t pid), pid2task (pid_t pid);
  318: 
  319: /* Return the current thread's thread port.  This is a cheap operation (no
  320:    system call), but it relies on Hurd signal state being set up.  */
  321: extern thread_t hurd_thread_self (void);
  322: 
  323: 
  324: /* Cancel pending operations on THREAD.  If it is doing an interruptible RPC,
  325:    that RPC will now return EINTR; otherwise, the "cancelled" flag will be
  326:    set, causing the next `hurd_check_cancel' call to return nonzero or the
  327:    next interruptible RPC to return EINTR (whichever is called first).  */
  328: extern error_t hurd_thread_cancel (thread_t thread);
  329: 
  330: /* Test and clear the calling thread's "cancelled" flag.  */
  331: extern int hurd_check_cancel (void);
  332: 
  333: 
  334: /* Return the io server port for file descriptor FD.
  335:    This adds a Mach user reference to the returned port.
  336:    On error, sets `errno' and returns MACH_PORT_NULL.  */
  337: 
  338: extern io_t __getdport (int fd), getdport (int fd);
  339: 
  340: 
  341: #include <stdarg.h>
  342: 
  343: /* Write formatted output to PORT, a Mach port supporting the i/o protocol,
  344:    according to the format string FORMAT, using the argument list in ARG.  */
  345: int vpprintf (io_t port, const char *format, va_list arg);
  346: 
  347: 
  348: #endif  /* hurd.h */
Syntax (Markdown)