|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.