Annotation of coherent/b/kernel/io.386/semcon.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * System V Compatible Semaphore Device Driver
        !             3:  *
        !             4:  *     This device driver provides System V compatible semaphore operations.
        !             5:  *     Operations are performed through the semaphore device (/dev/sem).
        !             6:  *     and are implemented as ioctl calls from semctl, semget, semop
        !             7:  *     utilities.
        !             8:  *
        !             9:  *     Author: Allan Cornish.
        !            10:  */
        !            11: 
        !            12: #include <sys/coherent.h>
        !            13: #include <sys/types.h>
        !            14: #include <sys/uproc.h>
        !            15: #include <errno.h>
        !            16: #include <sys/con.h>
        !            17: #include <sys/sem.h>
        !            18: #ifndef _I386
        !            19: #define getusd(arg)            getuwd(arg)
        !            20: #define putusd(arg1, arg2)     putuwd(arg1, arg2)
        !            21: #endif
        !            22: 
        !            23: /*
        !            24:  * Functions.
        !            25:  */
        !            26: 
        !            27: int seminit();
        !            28: int semioctl();
        !            29: int nulldev();
        !            30: int nonedev();
        !            31: 
        !            32: /*
        !            33:  * Device Configuration.
        !            34:  */
        !            35: 
        !            36: CON semcon = {
        !            37:        DFCHR,                  /* Flags                        */
        !            38:        23,                     /* Major Index                  */
        !            39:        nulldev,                /* Open                         */
        !            40:        nulldev,                /* Close                        */
        !            41:        nonedev,                /* Block                        */
        !            42:        nonedev,                /* Read                         */
        !            43:        nonedev,                /* Write                        */
        !            44:        semioctl,               /* Ioctl                        */
        !            45:        nulldev,                /* Power fail                   */
        !            46:        nulldev,                /* Timeout                      */
        !            47:        seminit,                /* Load                         */
        !            48:        nulldev                 /* Unload                       */
        !            49: };
        !            50: 
        !            51: /*
        !            52:  * Semaphore Device Ioctl.
        !            53:  */
        !            54: 
        !            55: static
        !            56: semioctl( dev, com, vec )
        !            57: 
        !            58: dev_t dev;  /* the id of the semaphore as determined by a previous open() of /dev/sem */
        !            59: short com;  /* command ofr use in switch() */
        !            60: register short *vec;  /* if calling semctl or semget, this is a pointer to a struct of 5 ints
        !            61:                        * if calling semop, this is a pointer to a struct of 4 ints.
        !            62:                        */
        !            63: 
        !            64: {
        !            65: /*     printf("semioctl() called: dev= %x (%d) cmd = %x (%d)  vec= %x (%d)\n", 
        !            66:  *             dev, dev, com, com, vec, vec);
        !            67:  *     printf("Vectors: [0] = %d ; key = %d ; key>>16 = %d ; nsems = %d ; semflg = 0%o\n",
        !            68:  *             vec[0],vec[1],vec[2],vec[3],vec[4]);
        !            69:  */
        !            70:        switch ( com ) {
        !            71: 
        !            72:        case SEMCTL:
        !            73:                putusd( vec+0,                       /* -1 passed from semop (286 libc) */
        !            74:                        usemctl(getusd( vec+1 ),     /* semaphore id */
        !            75:                                getusd( vec+2 ),     /* semaphore number */
        !            76:                                getusd( vec+3 ),     /* command passed to usemctl */
        !            77:                                getusd( vec+4 ) ));  /* address of struct semid_ds */
        !            78:                return;
        !            79: 
        !            80:        case SEMGET:
        !            81: /*             printf("semioctl: performing SEMGET\n");  */
        !            82:                putusd( vec+0,                        /* -1 passed from semget (286 libc) */                            
        !            83:                        usemget(getusd( vec+1 ),      /* bits 00 - 15 of semaphore key */
        !            84: /*                             getusd( vec+2 ), */   /* bits 16 - 31 of semaphore key */
        !            85:                                getusd( vec+3 ),      /* number of semaphores to make room for */
        !            86:                                getusd( vec+4 ) ));   /* semaphore flag (IPC_CREAT|0644) */
        !            87:                return;
        !            88: 
        !            89:        case SEMOP:
        !            90:                putusd( vec+0,                        /* -1 passed from semop (286 libc) */
        !            91:                        usemop( getusd( vec+1 ),      /* semaphore id */
        !            92:                                getusd( vec+2 ),      /* address of struct sembuf (ops on value) */
        !            93:                                getusd( vec+3 ) ));   /* # of struct sembufs */
        !            94:                return;
        !            95: 
        !            96:        default:
        !            97:                printf("semioctl(): received invalid cmd!\n");
        !            98:                u.u_error = EINVAL;
        !            99:                return;
        !           100:        }
        !           101: }

unix.superglobalmegacorp.com

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