8 |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
9 |
*/ |
*/ |
10 |
|
|
|
#include "busybox.h" |
|
|
#include <errno.h> |
|
|
#include <time.h> |
|
|
#include <pwd.h> |
|
|
#include <grp.h> |
|
|
|
|
11 |
/* X/OPEN tells us to use <sys/{types,ipc,sem}.h> for semctl() */ |
/* X/OPEN tells us to use <sys/{types,ipc,sem}.h> for semctl() */ |
12 |
/* X/OPEN tells us to use <sys/{types,ipc,msg}.h> for msgctl() */ |
/* X/OPEN tells us to use <sys/{types,ipc,msg}.h> for msgctl() */ |
13 |
/* X/OPEN tells us to use <sys/{types,ipc,shm}.h> for shmctl() */ |
/* X/OPEN tells us to use <sys/{types,ipc,shm}.h> for shmctl() */ |
17 |
#include <sys/msg.h> |
#include <sys/msg.h> |
18 |
#include <sys/shm.h> |
#include <sys/shm.h> |
19 |
|
|
20 |
|
#include "libbb.h" |
21 |
|
|
22 |
/*-------------------------------------------------------------------*/ |
/*-------------------------------------------------------------------*/ |
23 |
/* SHM_DEST and SHM_LOCKED are defined in kernel headers, |
/* SHM_DEST and SHM_LOCKED are defined in kernel headers, |
61 |
/* The last arg of semctl is a union semun, but where is it defined? |
/* The last arg of semctl is a union semun, but where is it defined? |
62 |
X/OPEN tells us to define it ourselves, but until recently |
X/OPEN tells us to define it ourselves, but until recently |
63 |
Linux include files would also define it. */ |
Linux include files would also define it. */ |
64 |
#if defined (__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) |
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) |
65 |
/* union semun is defined by including <sys/sem.h> */ |
/* union semun is defined by including <sys/sem.h> */ |
66 |
#else |
#else |
67 |
/* according to X/OPEN we have to define it ourselves */ |
/* according to X/OPEN we have to define it ourselves */ |
68 |
union semun { |
union semun { |
69 |
int val; |
int val; |
70 |
struct semid_ds *buf; |
struct semid_ds *buf; |
71 |
unsigned short int *array; |
unsigned short *array; |
72 |
struct seminfo *__buf; |
struct seminfo *__buf; |
73 |
}; |
}; |
74 |
#endif |
#endif |
78 |
<linux/ipc.h>, which defines a struct ipc_perm with such fields. |
<linux/ipc.h>, which defines a struct ipc_perm with such fields. |
79 |
glibc-1.09 has no support for sysv ipc. |
glibc-1.09 has no support for sysv ipc. |
80 |
glibc 2 uses __key, __seq */ |
glibc 2 uses __key, __seq */ |
81 |
#if defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 |
#if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 |
82 |
#define KEY __key |
#define KEY __key |
83 |
#else |
#else |
84 |
#define KEY key |
#define KEY key |
99 |
|
|
100 |
printf("%-10d %-10o", id, ipcp->mode & 0777); |
printf("%-10d %-10o", id, ipcp->mode & 0777); |
101 |
|
|
102 |
if ((pw = getpwuid(ipcp->cuid))) |
pw = getpwuid(ipcp->cuid); |
103 |
printf(" %-10s", pw->pw_name); |
if (pw) printf(" %-10s", pw->pw_name); |
104 |
else |
else printf(" %-10d", ipcp->cuid); |
105 |
printf(" %-10d", ipcp->cuid); |
gr = getgrgid(ipcp->cgid); |
106 |
if ((gr = getgrgid(ipcp->cgid))) |
if (gr) printf(" %-10s", gr->gr_name); |
107 |
printf(" %-10s", gr->gr_name); |
else printf(" %-10d", ipcp->cgid); |
108 |
else |
|
109 |
printf(" %-10d", ipcp->cgid); |
pw = getpwuid(ipcp->uid); |
110 |
|
if (pw) printf(" %-10s", pw->pw_name); |
111 |
if ((pw = getpwuid(ipcp->uid))) |
else printf(" %-10d", ipcp->uid); |
112 |
printf(" %-10s", pw->pw_name); |
gr = getgrgid(ipcp->gid); |
113 |
else |
if (gr) printf(" %-10s\n", gr->gr_name); |
114 |
printf(" %-10d", ipcp->uid); |
else printf(" %-10d\n", ipcp->gid); |
|
if ((gr = getgrgid(ipcp->gid))) |
|
|
printf(" %-10s\n", gr->gr_name); |
|
|
else |
|
|
printf(" %-10d\n", ipcp->gid); |
|
115 |
} |
} |
116 |
|
|
117 |
|
|
555 |
} |
} |
556 |
printf("%-10d %-10d %-10d %-10d %-10d\n", i, val, ncnt, zcnt, pid); |
printf("%-10d %-10d %-10d %-10d %-10d\n", i, val, ncnt, zcnt, pid); |
557 |
} |
} |
558 |
puts(""); |
bb_putchar('\n'); |
559 |
} |
} |
560 |
|
|
561 |
int ipcs_main(int argc, char **argv) |
int ipcs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
562 |
|
int ipcs_main(int argc UNUSED_PARAM, char **argv) |
563 |
{ |
{ |
564 |
int id = 0; |
int id = 0; |
565 |
unsigned flags = 0; |
unsigned flags = 0; |
570 |
#define flag_sem (1<<2) |
#define flag_sem (1<<2) |
571 |
#define flag_shm (1<<3) |
#define flag_shm (1<<3) |
572 |
|
|
573 |
opt = getopt32(argc, argv, "i:aqsmtcplu", &opt_i); |
opt = getopt32(argv, "i:aqsmtcplu", &opt_i); |
574 |
if (opt & 0x1) { // -i |
if (opt & 0x1) { // -i |
575 |
id = xatoi(opt_i); |
id = xatoi(opt_i); |
576 |
flags |= flag_print; |
flags |= flag_print; |
588 |
if (flags & flag_print) { |
if (flags & flag_print) { |
589 |
if (flags & flag_shm) { |
if (flags & flag_shm) { |
590 |
print_shm(id); |
print_shm(id); |
591 |
fflush_stdout_and_exit(0); |
fflush_stdout_and_exit(EXIT_SUCCESS); |
592 |
} |
} |
593 |
if (flags & flag_sem) { |
if (flags & flag_sem) { |
594 |
print_sem(id); |
print_sem(id); |
595 |
fflush_stdout_and_exit(0); |
fflush_stdout_and_exit(EXIT_SUCCESS); |
596 |
} |
} |
597 |
if (flags & flag_msg) { |
if (flags & flag_msg) { |
598 |
print_msg(id); |
print_msg(id); |
599 |
fflush_stdout_and_exit(0); |
fflush_stdout_and_exit(EXIT_SUCCESS); |
600 |
} |
} |
601 |
bb_show_usage(); |
bb_show_usage(); |
602 |
} |
} |
603 |
|
|
604 |
if (!(flags & (flag_shm | flag_msg | flag_sem))) |
if (!(flags & (flag_shm | flag_msg | flag_sem))) |
605 |
flags |= flag_msg | flag_shm | flag_sem; |
flags |= flag_msg | flag_shm | flag_sem; |
606 |
puts(""); |
bb_putchar('\n'); |
607 |
|
|
608 |
if (flags & flag_shm) { |
if (flags & flag_shm) { |
609 |
do_shm(); |
do_shm(); |
610 |
puts(""); |
bb_putchar('\n'); |
611 |
} |
} |
612 |
if (flags & flag_sem) { |
if (flags & flag_sem) { |
613 |
do_sem(); |
do_sem(); |
614 |
puts(""); |
bb_putchar('\n'); |
615 |
} |
} |
616 |
if (flags & flag_msg) { |
if (flags & flag_msg) { |
617 |
do_msg(); |
do_msg(); |
618 |
puts(""); |
bb_putchar('\n'); |
619 |
} |
} |
620 |
fflush_stdout_and_exit(0); |
fflush_stdout_and_exit(EXIT_SUCCESS); |
621 |
} |
} |