Implementing two new ipcs options -g and -u

看板DFBSD_kernel作者時間21年前 (2004/11/01 07:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/6 (看更多)
Hey guys, Here is a patch I want you guys to look at / test / moan over. The diff message will explain what it is all about. The -u was obtained from FreeBSD and the -g was created by yours truly. Any problems, write back. If no objections are recieved, It will be committed on the 2nd of November. Joerg has gave the nod, but I will let you guys look also. Patch starts here: - Allow ipcs to display information about IPC mechanisms owned by a user. The option for this is -u user. User can be a username or a uid. Obtained from FreeBSD - Allow ipcs to display information about IPC mechanisms owned by a group. The option for this is -g group. Group can be a group name or a gid. Wrote by me. Index: ipcs.1 =================================================================== RCS file: /home/dcvs/src/usr.bin/ipcs/ipcs.1,v retrieving revision 1.2 diff -u -r1.2 ipcs.1 --- ipcs.1 17 Jun 2003 04:29:27 -0000 1.2 +++ ipcs.1 31 Oct 2004 23:30:09 -0000 @@ -30,7 +30,7 @@ .\" $FreeBSD: src/usr.bin/ipcs/ipcs.1,v 1.9.2.4 2003/04/08 11:07:51 tjr Exp $ .\" $DragonFly: src/usr.bin/ipcs/ipcs.1,v 1.2 2003/06/17 04:29:27 dillon Exp $ .\" -.Dd June 18, 1994 +.Dd Oct 31, 2004 .Dt "IPCS" 1 .Os .Sh NAME @@ -41,6 +41,8 @@ .Op Fl abcmopqstMQST .Op Fl C Ar core .Op Fl N Ar system +.Op Fl g Ar group +.Op Fl u Ar user .Sh DESCRIPTION The .Nm @@ -71,6 +73,11 @@ .It Fl c Show the creator's name and group for active semaphores, message queues, and shared memory segments. +.It Fl g Ar group +Display information about IPC mechanisms owned by +.Pa group . + Group specification can be in the form of a numeric GID or +a group name. .It Fl m Display information about active shared memory segments. .It Fl o @@ -98,6 +105,11 @@ the last send or receive of a message, the last attach or detach of a shared memory segment, or the last operation on a semaphore. +.It Fl u Ar user +Display information about IPC mechanisms owned by +.Pa user . +User specification can be in the form of a numeric UID or +a user name. .It Fl C Ar core Extract values associated with the name list from the specified core instead of the default Index: ipcs.c =================================================================== RCS file: /home/dcvs/src/usr.bin/ipcs/ipcs.c,v retrieving revision 1.6 diff -u -r1.6 ipcs.c --- ipcs.c 19 Jun 2004 18:55:48 -0000 1.6 +++ ipcs.c 31 Oct 2004 18:52:10 -0000 @@ -32,9 +32,11 @@ #include <err.h> #include <fcntl.h> +#include <grp.h> #include <kvm.h> #include <nlist.h> #include <paths.h> +#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -55,7 +57,9 @@ struct shminfo shminfo; struct shmid_ds *shmsegs; -void usage(void); +static void usage(void); +static uid_t user2uid(const char *); +static gid_t grp2gid(const char *); static struct nlist symbols[] = { {"_sema"}, @@ -128,10 +132,15 @@ { int display = SHMINFO | MSGINFO | SEMINFO; int option = 0; - char *core = NULL, *namelist = NULL; + char *core, *namelist; + const char *user, *grp; int i; + uid_t useruid; + gid_t grpgid; - while ((i = getopt(argc, argv, "MmQqSsabC:cN:optT")) != -1) + core = namelist = NULL; + + while ((i = getopt(argc, argv, "MmQqSsabC:cN:ou:g:ptT")) != -1) switch (i) { case 'M': display = SHMTOTAL; @@ -178,6 +187,16 @@ case 't': option |= TIME; break; + case 'u': + user = optarg; + grp = NULL; + useruid = user2uid(optarg); + break; + case 'g': + grp = optarg; + user = NULL; + grpgid = grp2gid(optarg); + break; default: usage(); } @@ -252,6 +271,11 @@ ctime_buf[100]; struct msqid_ds *msqptr = &xmsqids[i]; + if (user && useruid != msqptr->msg_perm.uid) + continue; + if (grp && grpgid != msqptr->msg_perm.gid) + continue; + cvt_time(msqptr->msg_stime, stime_buf); cvt_time(msqptr->msg_rtime, rtime_buf); cvt_time(msqptr->msg_ctime, ctime_buf); @@ -340,6 +364,12 @@ ctime_buf[100]; struct shmid_ds *shmptr = &xshmids[i]; + if (user && useruid != shmptr->shm_perm.uid) + continue; + + if (grp && grpgid != shmptr->shm_perm.gid) + continue; + cvt_time(shmptr->shm_atime, atime_buf); cvt_time(shmptr->shm_dtime, dtime_buf); cvt_time(shmptr->shm_ctime, ctime_buf); @@ -431,6 +461,12 @@ char ctime_buf[100], otime_buf[100]; struct semid_ds *semaptr = &xsema[i]; + if (user && useruid != semaptr->sem_perm.uid) + continue; + + if (grp && grpgid != semaptr->sem_perm.gid) + continue; + cvt_time(semaptr->sem_otime, otime_buf); cvt_time(semaptr->sem_ctime, ctime_buf); @@ -470,11 +506,43 @@ exit(0); } -void +static uid_t +user2uid(const char *username) +{ + struct passwd *pwd; + uid_t uid; + char *r; + + uid = strtoul(username, &r, 0); + if (!*r && r != username) + return (uid); + if ((pwd = getpwnam(username)) == NULL) + errx(1, "No such user"); + endpwent(); + return (pwd->pw_uid); +} + +static gid_t +grp2gid(const char *groupname) +{ + struct group *grp; + gid_t gid; + char *r; + + gid = strtol(groupname, &r, 0); + if (!*r && r != groupname) + return (gid); + if ((grp = getgrnam(groupname)) == NULL) + errx(1, "No such group"); + endgrent(); + return (grp->gr_gid); +} + +static void usage(void) { fprintf(stderr, - "usage: ipcs [-abcmopqstMQST] [-C corefile] [-N namelist]\n"); + "usage: ipcs [-abcmopqstMQST] [-C corefile] [-N namelist] [-u user] [-g group]\n"); exit(1); } -- - Liam J. Foy liamfoy@sepulcrum.org
文章代碼(AID): #11XMwm00 (DFBSD_kernel)
討論串 (同標題文章)
文章代碼(AID): #11XMwm00 (DFBSD_kernel)