|
|
1.1 ! root 1: /* ! 2: * User Message Functions. ! 3: * ! 4: * Note: msgget() must be first function called. ! 5: * ! 6: * 91/02/07 Hal Snyder mwchwc!/u/libc/sys/msgop.c ! 7: * msgget(): sizeof(key_t) is 4, not 2. ! 8: */ ! 9: #include <sys/msg.h> ! 10: #include <errno.h> ! 11: ! 12: static int msgfno = -1; ! 13: static char msgdev[] = "/dev/msg"; ! 14: ! 15: /* ! 16: * Message Control Operations. ! 17: */ ! 18: ! 19: msgctl( msqid, cmd, buf ) ! 20: ! 21: int msqid; ! 22: int cmd; ! 23: struct msqid_ds * buf; ! 24: ! 25: { ! 26: int parm[4]; ! 27: ! 28: if ( msgfno < 0 ) { ! 29: errno = ENODEV; ! 30: return -1; ! 31: } ! 32: ! 33: parm[0] = -1; ! 34: parm[1] = msqid; ! 35: parm[2] = cmd; ! 36: parm[3] = (int) buf; ! 37: ! 38: ioctl( msgfno, MSGCTL, parm ); ! 39: return parm[0]; ! 40: } ! 41: ! 42: /* ! 43: * Get Message Queue. ! 44: */ ! 45: ! 46: msgget( key, msgflg ) ! 47: ! 48: key_t key; ! 49: int msgflg; ! 50: ! 51: { ! 52: int parm[4]; ! 53: ! 54: if ( msgfno < 0 ) { ! 55: ! 56: msgfno = open(msgdev, 0); ! 57: ! 58: if ( msgfno < 0 ) { ! 59: perror(msgdev); ! 60: errno = ENODEV; ! 61: return -1; ! 62: } ! 63: } ! 64: ! 65: parm[0] = -1; ! 66: parm[1] = key; ! 67: parm[2] = key >> 16; ! 68: parm[3] = msgflg; ! 69: ! 70: ioctl( msgfno, MSGGET, parm ); ! 71: return parm[0]; ! 72: } ! 73: ! 74: /* ! 75: * Send Message. ! 76: */ ! 77: ! 78: msgsnd( msqid, msgp, msgsz, msgflg ) ! 79: ! 80: int msqid; ! 81: struct msgbuf *msgp; ! 82: int msgsz; ! 83: int msgflg; ! 84: ! 85: { ! 86: int parm[5]; ! 87: ! 88: if ( msgfno < 0 ) { ! 89: errno = ENODEV; ! 90: return -1; ! 91: } ! 92: ! 93: parm[0] = -1; ! 94: parm[1] = msqid; ! 95: parm[2] = (int) msgp; ! 96: parm[3] = msgsz; ! 97: parm[4] = msgflg; ! 98: ! 99: ioctl( msgfno, MSGSND, parm ); ! 100: return parm[0]; ! 101: } ! 102: ! 103: /* ! 104: * Receive Message. ! 105: */ ! 106: ! 107: msgrcv( msqid, msgp, msgsz, msgtyp, msgflg ) ! 108: ! 109: int msqid; ! 110: struct msgbuf *msgp; ! 111: int msgsz; ! 112: long msgtyp; ! 113: int msgflg; ! 114: ! 115: { ! 116: int parm[7]; ! 117: ! 118: if ( msgfno < 0 ) { ! 119: errno = ENODEV; ! 120: return -1; ! 121: } ! 122: ! 123: parm[0] = -1; ! 124: parm[1] = msqid; ! 125: parm[2] = (int) msgp; ! 126: parm[3] = msgsz; ! 127: parm[4] = (int) msgtyp; ! 128: parm[5] = (int) (msgtyp >> 16); ! 129: parm[6] = msgflg; ! 130: ! 131: ioctl( msgfno, MSGRCV, parm ); ! 132: return parm[0]; ! 133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.