Annotation of coherent/b/STREAMS/coh.386/sys6.c, revision 1.1

1.1     ! root        1: /* $Header: /src386/STREAMS/coh.386/RCS/sys6.c,v 2.1 93/08/09 13:36:55 bin Exp Locker: bin $ */
        !             2: /*
        !             3:  * POSIX.1-oriented system calls for Coherent.
        !             4:  *
        !             5:  * Conventions: as elsewhere, system call handlers have the same name as the
        !             6:  * user would use but prefixed by a 'u'. Internal data interfaces have the
        !             7:  * same name as a user function if they have the same signature, which is a
        !             8:  * good thing for testing, and can save on redundant prototypes. Wherever
        !             9:  * possible, we use such function-call interfaces rather than get involved in
        !            10:  * the disgusting mess that is the U area or process-table mechanisms.
        !            11:  */
        !            12: /*
        !            13:  * $Log:       sys6.c,v $
        !            14:  * Revision 2.1  93/08/09  13:36:55  bin
        !            15:  * Kernel 82 changes
        !            16:  * 
        !            17:  * Revision 2.2  93/07/26  14:55:33  nigel
        !            18:  * Nigel's R80
        !            19:  * 
        !            20:  */
        !            21: 
        !            22: #include <common/ccompat.h>
        !            23: #include <sys/signal.h>
        !            24: #include <unistd.h>
        !            25: 
        !            26: 
        !            27: /*
        !            28:  *-STATUS:
        !            29:  *     POSIX.1
        !            30:  *
        !            31:  *-NAME:
        !            32:  *     sigaction ()    Detailed signal management
        !            33:  *
        !            34:  *-SYNOPSIS:
        !            35:  *     #include <signal.h>
        !            36:  *
        !            37:  *     int sigaction (int sig, const struct sigaction * act,
        !            38:  *                    struct sigaction * oact);
        !            39:  *
        !            40:  *-DESCRIPTION:
        !            41:  *     sigaction () allows the calling process to examine and/or specify the
        !            42:  *     action to be taken on delivery of a specific signal.
        !            43:  *
        !            44:  *     "sig" specifies the signal and can be assigned any of the signals
        !            45:  *     specified in signal(5) except SIGKILL and SIGSTOP.
        !            46:  *
        !            47:  *     If the argument "arg" is not NULL, it points to a structure specifying
        !            48:  *     the new action to be taken when delivering "sig". If the argument
        !            49:  *     "oact" is not NULL, it points to a structure where the action
        !            50:  *     previously associated with "sig" is to be stored on return from
        !            51:  *     sigaction ().
        !            52:  *
        !            53:  *     The "sigaction" structure includes the following members:
        !            54:  *             void         (* sa_handler) ();
        !            55:  *             sigset_t        sa_mask;
        !            56:  *             int             sa_flags;
        !            57:  *
        !            58:  *     "sa_handler" specifies the disposition of the signal and may take any
        !            59:  *     of the values specified in signal (5).
        !            60:  *
        !            61:  *     "sa_mask" specifies a set of signals to be blocked while the signal
        !            62:  *     handler is active. On entry to the signal handler, that set of signals
        !            63:  *     is added to the set of signals already being blocked when the signal
        !            64:  *     is delivered. In addition, the signal that caused the handler to be
        !            65:  *     executed will also be blocked, unless the SA_NODEFER flag has been
        !            66:  *     specified. SIGSTOP and SIGKILL cannot be blocked (the system silently
        !            67:  *     enforces this restriction).
        !            68:  *
        !            69:  *     "sa_flags" specifies a set of flags used to modify the behaviour of
        !            70:  *     the signal. It is formed by a logical OR of any of the following
        !            71:  *     values (only SA_CLDSTOP is available to System V, Release 3
        !            72:  *     applications):
        !            73:  *
        !            74:  *     SA_NOCLDSTOP    If set and "sig" equals SIGCHLD, "sig" will not be
        !            75:  *                     sent to the calling process when its child processes
        !            76:  *                     stop or continue.
        !            77:  *
        !            78:  *     SA_NOCLDWAIT    If set and "sig" equals SIGCHLD, the system will not
        !            79:  *                     create zombie processes when children of the calling
        !            80:  *                     process exit. If the calling process subsequently
        !            81:  *                     issues a wait (), it blocks until all of the calling
        !            82:  *                     process's child processes terminate, and then returns
        !            83:  *                     a value of -1 with "errno" set to ECHILD.
        !            84:  *
        !            85:  *     SA_ONSTACK      If set and the signal is caught and an alternate
        !            86:  *                     signal stack has been declared with sigaltstack (),
        !            87:  *                     the signal is delivered to the calling process on that
        !            88:  *                     stack. Otherwise, the signal is delivered on the
        !            89:  *                     same stack as the main program.
        !            90:  *
        !            91:  *     SA_RESETHAND    If set and the signal is caught, the disposition of
        !            92:  *                     the signal is reset to SIG_DFL, and the signal will
        !            93:  *                     not be blocked on entry to the signal handler (SIGILL,
        !            94:  *                     SIGTRAP, and SIGPWR cannot be automatically reset when
        !            95:  *                     delivered; the system silently enforces this
        !            96:  *                     restriction).
        !            97:  *
        !            98:  *     SA_NODEFER      If set and the signal is caught, the signal will not
        !            99:  *                     be automatically blocked by the kernel while it is
        !           100:  *                     being caught.
        !           101:  *
        !           102:  *     SA_RESTART      If set and the signal is caught, a system call that
        !           103:  *                     is interrupted by the execution of this signal's
        !           104:  *                     handler is transparently restarted by the system.
        !           105:  *                     Otherwise, the system call returns an EINTR error.
        !           106:  *
        !           107:  *     SA_SIGINFO      If cleared and the signal is caught, "sig" is passed
        !           108:  *                     as the only argument to the signal-catching function.
        !           109:  *                     If set and the signal is caught, pending signals of
        !           110:  *                     type "sig" are reliably queued to the calling process
        !           111:  *                     and two additional arguments are passed to the signal-
        !           112:  *                     catching function. If the second argument is not equal
        !           113:  *                     to NULL, it points to a "siginfo_t" structure
        !           114:  *                     containing the reason why the signal was generated;
        !           115:  *                     the third argument points to a "ucontext_t" structure
        !           116:  *                     containing the receiving process's context when the
        !           117:  *                     signal was delivered.
        !           118:  *
        !           119:  *     sigaction () fails if any of the following is true:
        !           120:  *
        !           121:  *     EINVAL          The value of the "sig" argument is not a valid signal
        !           122:  *                     number or is equal to SIGKILL or SIGSTOP.
        !           123:  *
        !           124:  *     EFAULT          "act" or "oact" points outside the process's allocated
        !           125:  *                     address space.
        !           126:  *
        !           127:  *-DIAGNOSTICS:
        !           128:  *     On success, sigaction () returns zero. On failure, it returns -1 and
        !           129:  *     sets "errno" to indicate the error.
        !           130:  */
        !           131: 
        !           132: #if    __USE_PROTO__
        !           133: int usigaction (int sig, __CONST__ struct sigaction * act,
        !           134:                struct sigaction * oact)
        !           135: #else
        !           136: int
        !           137: usigaction (sig, act, oact)
        !           138: int                    sig;
        !           139: __CONST__ struct sigaction
        !           140:                      * act;
        !           141: struct sigaction      *        oact;
        !           142: #endif
        !           143: {
        !           144:        struct sigaction temp;
        !           145:        /*
        !           146:         * Once we validate the user pointers, we *must* take a local copy of
        !           147:         * either the previous signal setting or the data pointed to by "act"
        !           148:         * so that the caller is free to use the same pointer for both input
        !           149:         * and output arguments. Naturally, we must totally validate the new
        !           150:         * data before storing anything back to the user, irrespective of how
        !           151:         * convenient it might be to let a lower layer deal with this.
        !           152:         */
        !           153:        return -1;
        !           154: }
        !           155: 
        !           156: 
        !           157: /*
        !           158:  *-STATUS:
        !           159:  *     POSIX.1
        !           160:  *
        !           161:  *-NAME:
        !           162:  *     sigpending ()   Examine signals that are blocked and pending
        !           163:  *
        !           164:  *-SYNOPSIS:
        !           165:  *     #include <signal.h>
        !           166:  *
        !           167:  *     int sigpending (sigset_t * set);
        !           168:  *
        !           169:  *-DESCRIPTION:
        !           170:  *     The sigpending () function retrieves those signals that have been sent
        !           171:  *     to the calling process but are being blocked from delivery by the
        !           172:  *     calling process's signal mask. The signals are stored in the space
        !           173:  *     pointed to by the argument "set".
        !           174:  *
        !           175:  *     sigpending () fails if any of the following are true:
        !           176:  *
        !           177:  *     EFAULT          The "set" argument points outside the process's
        !           178:  *                     allocated address space.
        !           179:  *
        !           180:  *-DIAGNOSTICS:
        !           181:  *     On success, sigpending () returns zero. On failure, it returns -1 and
        !           182:  *     sets "errno" to indicate the error.
        !           183:  */
        !           184: 
        !           185: #if    __USE_PROTO__
        !           186: int usigpending (o_sigset_t * set)
        !           187: #else
        !           188: int
        !           189: usigpending (set)
        !           190: o_sigset_t    *        set;
        !           191: #endif
        !           192: {
        !           193:        return -1;
        !           194: }
        !           195: 
        !           196: 
        !           197: /*
        !           198:  *-STATUS:
        !           199:  *     POSIX.1
        !           200:  *
        !           201:  *-NAME:
        !           202:  *     sigprocmask ()  Change or examine signal mask
        !           203:  *
        !           204:  *-SYNOPSIS:
        !           205:  *     #include <signal.h>
        !           206:  *
        !           207:  *     int sigprocmask (int how, const sigset_t * set, sigset_t * oset);
        !           208:  *
        !           209:  *-DESCRIPTION:
        !           210:  *     The sigprocmask () function is used to examine and/or change the
        !           211:  *     calling process's signal mask. If the value of "how" is SIG_BLOCK, the
        !           212:  *     set pointed to by the argument "set" is added to the current signal
        !           213:  *     mask. If "how" is SIG_UNBLOCK, the set pointed to by the argument
        !           214:  *     "set" is removed from the current signal mask. If "how" is
        !           215:  *     SIG_SETMASK, the current signal mask is replaced by the set pointed
        !           216:  *     to by the argument "set". If the argument "oset" is not NULL, the
        !           217:  *     previous mask is stored in the space pointed to by "oset". If the
        !           218:  *     value of the argument "set" is NULL, the value "how" is not
        !           219:  *     significant and the process's signal mask is unchanged; thus, the call
        !           220:  *     can be used to enquire about currently blocked signals.
        !           221:  *
        !           222:  *     If there are any pending unblocked signals after the call to
        !           223:  *     sigprocmask (), at least one of those signals will be delivered before
        !           224:  *     the call to sigprocmask () returns.
        !           225:  *
        !           226:  *     It is not possible to block those signals that cannot be ignored [see
        !           227:  *     sigaction ()]; this restriction is silently imposed by the system.
        !           228:  *
        !           229:  *     If sigprocmask () fails, the process's signal mask is not changed.
        !           230:  *
        !           231:  *     sigprocmask () fails if any of the following are true:
        !           232:  *
        !           233:  *     EINVAL          The value of the "how" argument is not equal to one of
        !           234:  *                     the defined values.
        !           235:  * 
        !           236:  *     EFAULT          The value of "set" or "oset" points outside the
        !           237:  *                     process's allocated address space.
        !           238:  *
        !           239:  *-DIAGNOSTICS:
        !           240:  *     On success, sigprocmask () returns zero. On failure, it returns -1 and
        !           241:  *     sets "errno" to indicate the error.
        !           242:  */
        !           243: 
        !           244: #if    __USE_PROTO__
        !           245: int usigprocmask (int how, __CONST__ o_sigset_t * set, o_sigset_t * oset)
        !           246: #else
        !           247: int
        !           248: usigprocmask (how, set, oset)
        !           249: int            how;
        !           250: __CONST__ o_sigset_t
        !           251:              * set;
        !           252: o_sigset_t    *        oset;
        !           253: #endif
        !           254: {
        !           255:        o_sigset_t      tmp;
        !           256:        /*
        !           257:         * Once we validate the user pointers, we *must* either take a local
        !           258:         * copy of the previous signal mask or the data pointed at by "set" so
        !           259:         * that the user is free to use the same pointer for both input and
        !           260:         * output arguments.
        !           261:         */
        !           262:        return -1;
        !           263: }
        !           264: 
        !           265: 
        !           266: /*
        !           267:  *-STATUS:
        !           268:  *     POSIX.1
        !           269:  *
        !           270:  *-NAME:
        !           271:  *     fpathconf ()
        !           272:  *     pathconf ()     get configurable pathname variables
        !           273:  *
        !           274:  *-SYNOPSIS:
        !           275:  *     #include <unistd.h>
        !           276:  *
        !           277:  *     long fpathconf (int fildes, int name);
        !           278:  *     long pathconf (const char * path, int name);
        !           279:  *
        !           280:  *-DESCRIPTION:
        !           281:  *     The functions fpathconf () and pathconf () return the current value of
        !           282:  *     a configurable limit or option associated with a file or directory.
        !           283:  *     The "path" argument points to the pathname of a file or directory;
        !           284:  *     "fildes" is an open file descriptor; and "name" is the symbolic
        !           285:  *     constant (defined in <unistd.h>) representing the configurable system
        !           286:  *     limit or option to be returned.
        !           287:  *
        !           288:  *     The values returned by pathconf () or fpathconf () depend on the type
        !           289:  *     of file specified by "path" or "fildes". The following table contains
        !           290:  *     the symbolic constants supported by pathconf () and fpathconf ()
        !           291:  *     along with the POSIX defined return value. The return value is based
        !           292:  *     on the type of file specified by "path" or "fildes".
        !           293:  *
        !           294:  *     _PC_LINK_MAX    The maximum value of a file's link count. If "path" or
        !           295:  *                     "fildes" refers to a directory, the value returned
        !           296:  *                     applies to the directory itself.
        !           297:  *
        !           298:  *     _PC_MAX_CANON   The number of bytes in a terminal canonical input
        !           299:  *                     queue. The behaviour is undefined if "path" or
        !           300:  *                     "fildes" does not refer to a terminal file.
        !           301:  *
        !           302:  *     _PC_MAX_INPUT   The number of bytes for which space will be available
        !           303:  *                     in a terminal input queue. The behaviour is undefined 
        !           304:  *                     "path" or "fildes" does not refer to a terminal file.
        !           305:  *
        !           306:  *     _PC_NAME_MAX    The number of bytes in a filename. The behaviour is
        !           307:  *                     undefined if "path" or "fildes" does not refer to a
        !           308:  *                     directory. The value returned applies to the filenames
        !           309:  *                     within the directory.
        !           310:  *
        !           311:  *     _PC_PATH_MAX    The number of bytes in a pathname. The behaviour is
        !           312:  *                     undefined if "path" or "fildes" does not refer to a
        !           313:  *                     directory. The value returned is the maximum length of
        !           314:  *                     a relative pathname when the specified directory is
        !           315:  *                     the working directory.
        !           316:  *
        !           317:  *     _PC_PIPE_BUF    The number of bytes that can be written atomically
        !           318:  *                     when writing to a pipe. If "path" or "files" refers to
        !           319:  *                     a pipe or FIFO, the value returned applies to the FIFO
        !           320:  *                     itself. If "path" or "fildes" refers to a directory,
        !           321:  *                     the value returned applies to any FIFOs that exist or
        !           322:  *                     can be created within the directory. If "path" or
        !           323:  *                     "fildes" refer to any other type of file, the
        !           324:  *                     behaviour is undefined.
        !           325:  *
        !           326:  *     _PC_CHOWN_RESTRICTED    The use of the chown () function is restricted
        !           327:  *                     to a process with appropriate priveleges, and to
        !           328:  *                     changing the group ID of a file only to the effective
        !           329:  *                     group ID of the process or to one of its supplementary
        !           330:  *                     group IDs. If "path" or "fildes" refers to a
        !           331:  *                     directory, the value returned applies to any files,
        !           332:  *                     other than directories, that exist or can be created
        !           333:  *                     within the directory.
        !           334:  *
        !           335:  *     _PC_NO_TRUNC    Pathname components longer than NAME_MAX generate an
        !           336:  *                     error. The behaviour is undefined if "path" or
        !           337:  *                     "fildes" does not refer to a directory. The value
        !           338:  *                     returned applies to the filenames within the
        !           339:  *                     directory.
        !           340:  *     _PC_VDISABLE    Terminal special characters can be disabled using this
        !           341:  *                     character value, if it is defined. The behaviour is
        !           342:  *                     undefined if "path" or "filedes" does not refer to a
        !           343:  *                     terminal file.
        !           344:  *
        !           345:  *     The value of the configurable system limit or option specified by
        !           346:  *     "name" does not change during the lifetime of the calling process.
        !           347:  *
        !           348:  *     fpathconf () fails if the following is true:
        !           349:  *
        !           350:  *     EBADF           "fildes" is not a valid file descriptor.
        !           351:  *
        !           352:  *     pathconf () fails if any of the following are true:
        !           353:  *
        !           354:  *     EACCES          Search permission is denied for a component of the
        !           355:  *                     path prefix.
        !           356:  *
        !           357:  *     ELOOP           Too many symbolic links are encountered while
        !           358:  *                     translating "path".
        !           359:  *
        !           360:  *     EMULTIHOP       Components of "path" require hopping to multiple
        !           361:  *                     remote machines and the file system type does not
        !           362:  *                     allow it.
        !           363:  *
        !           364:  *     ENAMETOOLONG    The length of a pathname component exceeds PATH_MAX,
        !           365:  *                     or a pathname component is longer than NAME_MAX while
        !           366:  *                     _POSIX_NO_TRUNC is in effect.
        !           367:  *
        !           368:  *     ENOENT          "path" is needed for the command specified and the
        !           369:  *                     named file does not exist or if the "path" argument
        !           370:  *                     points to an empty string.
        !           371:  *
        !           372:  *     ENOLINK         "path" points to a remote machine and the link to that
        !           373:  *                     machine is no longer active.
        !           374:  *
        !           375:  *     ENOTDIR         A component of the path prefix is not a directory.
        !           376:  *
        !           377:  *     Both fpathconf () and pathconf () fail if the following is true:
        !           378:  *
        !           379:  *     EINVAL          if "name" is an invalid value.
        !           380:  *
        !           381:  *-DIAGNOSTICS:
        !           382:  *     If fpathconf () or pathconf () is invoked with an invalid symbolic
        !           383:  *     constant or the symbolic constant corresponds to a configurable system
        !           384:  *     limit or option not supported on the system, a value of -1 is returned
        !           385:  *     to the invoking process. If the function fails because the
        !           386:  *     configurable system limit or option corresponding to "name" is not
        !           387:  *     supported on the system the value of "errno" is not changed.
        !           388:  */
        !           389: 
        !           390: #if    __USE_PROTO__
        !           391: int ufpathconf (int fildes, int name)
        !           392: #else
        !           393: int
        !           394: ufpathconf (fildes, name)
        !           395: int            fildes;
        !           396: int            name;
        !           397: #endif
        !           398: {
        !           399:        return -1;
        !           400: }
        !           401: 
        !           402: 
        !           403: #if    __USE_PROTO__
        !           404: int upathconf (__CONST__ char * path, int name)
        !           405: #else
        !           406: int
        !           407: upathconf (path, name)
        !           408: __CONST__ char * path;
        !           409: int            name;
        !           410: #endif
        !           411: {
        !           412:        return -1;
        !           413: }
        !           414: 
        !           415: 
        !           416: /*
        !           417:  *-STATUS:
        !           418:  *     POSIX.1
        !           419:  *
        !           420:  *-NAME:
        !           421:  *     sysconf ()      get configurable system variables
        !           422:  *
        !           423:  *-SYNOPSIS:
        !           424:  *     #include <unistd.h>
        !           425:  *
        !           426:  *     long sysconf (int name);
        !           427:  *
        !           428:  *-DESCRIPTION:
        !           429:  *     The sysconf () function provides a method for the application to
        !           430:  *     determine the current value of a configurable system limit or option.
        !           431:  *
        !           432:  *     The "name" argument represents the system variable to be queried. The
        !           433:  *     following table lists the minimal set of system variables from
        !           434:  *     <limits.h> and <unistd.h> that can be returned by sysconf (), and the
        !           435:  *     symbolic constants that are the corresponding values used for "name":
        !           436:  *
        !           437:  *     NAME:                   RETURN VALUE:
        !           438:  *     _SC_ARG_MAX             ARG_MAX
        !           439:  *     _SC_CHILD_MAX           CHILD_MAX
        !           440:  *     _SC_CLK_TCK             CLK_TCK
        !           441:  *     _SC_NGROUPS_MAX         NGROUPS_MAX
        !           442:  *     _SC_OPEN_MAX            OPEN_MAX
        !           443:  *     _SC_PASS_MAX            PASS_MAX
        !           444:  *     _SC_PAGESIZE            PAGESIZE
        !           445:  *     _SC_JOB_CONTROL         _POSIX_JOB_CONTROL
        !           446:  *     _SC_SAVED_IDS           _POSIX_SAVED_IDS
        !           447:  *     _SC_VERSION             _POSIX_VERSION
        !           448:  *     _SC_XOPEN_VERSION       _XOPEN_VERSION
        !           449:  *     _SC_LOGNAME_MAX         LOGNAME_MAX
        !           450:  *
        !           451:  *     The value of CLK_TCK may be variable and it should not be assumed that
        !           452:  *     CLK_TCK is a compile-time constant. The value of CLK_TCK is the same
        !           453:  *     as the value of sysconf (_SC_CLK_TCK).
        !           454:  *
        !           455:  *-DIAGNOSTICS:
        !           456:  *     If "name" is an invalid value, sysconf () will return -1 and set
        !           457:  *     "errno" to indicate the error. If sysconf () fails due to a value of
        !           458:  *     "name" that is not defined on the system, the function will returne
        !           459:  *     a value of -1 without changing the value of "errno".
        !           460:  *
        !           461:  *-NOTES:
        !           462:  *     A call to setrlimit () may cause the value of OPEN_MAX to change on
        !           463:  *     System V, Release 4-compatible systems.
        !           464:  */
        !           465: 
        !           466: #if    __USE_PROTO__
        !           467: long usysconf (int name)
        !           468: #else
        !           469: long
        !           470: usysconf (name)
        !           471: int            name;
        !           472: #endif
        !           473: {
        !           474:        return -1;
        !           475: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.