2 do_ipcctl(optype, arglast)
6 register STR **st = stack->ary_array;
7 register int sp = arglast[0];
10 int id, n, cmd, infosize, getinfo, ret;
12 id = (int)str_gnum(st[++sp]);
13 n = (optype == O_SEMCTL) ? (int)str_gnum(st[++sp]) : 0;
14 cmd = (int)str_gnum(st[++sp]);
18 getinfo = (cmd == IPC_STAT);
24 if (cmd == IPC_STAT || cmd == IPC_SET)
25 infosize = sizeof(struct msqid_ds);
30 if (cmd == IPC_STAT || cmd == IPC_SET)
31 infosize = sizeof(struct shmid_ds);
36 if (cmd == IPC_STAT || cmd == IPC_SET)
37 infosize = sizeof(struct semid_ds);
38 else if (cmd == GETALL || cmd == SETALL)
40 struct semid_ds semds;
41 if (semctl(id, 0, IPC_STAT, &semds) == -1)
43 getinfo = (cmd == GETALL);
44 infosize = semds.sem_nsems * sizeof(short);
45 /* "short" is technically wrong but much more portable
46 than guessing about u_?short(_t)? */
50 #if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
52 fatal("%s not implemented", opname[optype]);
60 STR_GROW(astr, infosize+1);
66 if (astr->str_cur != infosize)
75 int i = (int)str_gnum(astr);
76 a = (char *)i; /* ouch */
83 ret = msgctl(id, cmd, (struct msqid_ds *)a);
88 ret = semctl(id, n, cmd, a);
93 ret = shmctl(id, cmd, (struct shmid_ds *)a);
97 if (getinfo && ret >= 0) {
98 astr->str_cur = infosize;
99 astr->str_ptr[infosize] = '\0';