static int sysvipc_sem_read_proc(char *buffer, char **start, off_t offset, int length, int *eof, void *data) { off_t pos = 0; off_t begin = 0; int i, len = 0; int j; struct sem *sem_base; len += sprintf(buffer, " key semid perms nsems uid gid cuid cgid otime ctime\n"); down(&sem_ids.sem); for(i = 0; i <= sem_ids.max_id; i++) { struct sem_array *sma; sma = sem_lock(i); if(sma) { len += sprintf(buffer + len, "\n%10d %10d %4o %10lu %5u %5u %5u %5u %10lu %10lu\n", sma->sem_perm.key, sem_buildid(i,sma->sem_perm.seq), sma->sem_perm.mode, sma->sem_nsems, sma->sem_perm.uid, sma->sem_perm.gid, sma->sem_perm.cuid, sma->sem_perm.cgid, sma->sem_otime, sma->sem_ctime); pos += len; if(pos < offset) { len = 0; begin = pos; } if(pos > offset + length){ sem_unlock(i); goto done; } /* S.R.: print-out (pid, val) pairs for semaphore array */ sem_base = sma->sem_base; for(j=0; j < sma->sem_nsems; j++){ len += sprintf(buffer + len, " %ld (pid) %ld (val)\n", (sem_base->sempid) & 0xffff, sem_base->semval); pos += len; if(pos < offset) { len = 0; begin = pos; } if(pos > offset + length){ sem_unlock(i); goto done; } sem_base++; } sem_unlock(i); } } *eof = 1; done: up(&sem_ids.sem); *start = buffer + (offset - begin); len -= (offset - begin); if(len > length) len = length; if(len < 0) len = 0; return len; }