]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
ipcs: make individual message queue id printing to use /proc
authorSami Kerola <kerolasa@iki.fi>
Sun, 11 Nov 2012 22:31:21 +0000 (22:31 +0000)
committerKarel Zak <kzak@redhat.com>
Fri, 23 Nov 2012 13:58:22 +0000 (14:58 +0100)
[kzak@redhat.com: - fix msgctl() call,
  move q_qbytes to ipc_msg_get_info]

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Signed-off-by: Karel Zak <kzak@redhat.com>
sys-utils/ipcs.c
sys-utils/ipcutils.c

index 78bec7d5f98bc06924bc40d4c39e1938bdbf9cc8..632dd10753a08d9d769daa71d1e8185057e90b49 100644 (file)
@@ -572,33 +572,32 @@ static void print_shm(int shmid)
 }
 
 
-void print_msg (int msqid)
+void print_msg(int msgid)
 {
-       struct msqid_ds buf;
-       struct ipc_perm *ipcp = &buf.msg_perm;
+       struct msg_data *msgdata;
 
-       if (msgctl (msqid, IPC_STAT, &buf) == -1)
-               err(EXIT_FAILURE, _("msgctl failed"));
+       if (ipc_msg_get_info(msgid, &msgdata) < 1) {
+               warnx(_("id %d not found"), msgid);
+               return;
+       }
 
-       printf (_("\nMessage Queue msqid=%d\n"), msqid);
-       printf (_("uid=%u\tgid=%u\tcuid=%u\tcgid=%u\tmode=%#o\n"),
-               ipcp->uid, ipcp->gid, ipcp->cuid, ipcp->cgid, ipcp->mode);
-       printf (_("cbytes=%ld\tqbytes=%ld\tqnum=%ld\tlspid=%d\tlrpid=%d\n"),
-               /*
-                * glibc-2.1.3 and earlier has unsigned short. glibc-2.1.91
-                * has variation between unsigned short, unsigned long.
-                * Austin has msgqnum_t (for msg_qbytes)
-                */
-               (long) buf.msg_cbytes, (long) buf.msg_qbytes,
-               (long) buf.msg_qnum, buf.msg_lspid, buf.msg_lrpid);
-       printf (_("send_time=%-26.24s\n"),
-               buf.msg_stime ? ctime (&buf.msg_stime) : _("Not set"));
-       printf (_("rcv_time=%-26.24s\n"),
-               buf.msg_rtime ? ctime (&buf.msg_rtime) : _("Not set"));
-       printf (_("change_time=%-26.24s\n"),
-               buf.msg_ctime ? ctime (&buf.msg_ctime) : _("Not set"));
-       printf ("\n");
-       return;
+       printf(_("\nMessage Queue msqid=%d\n"), msgid);
+       printf(_("uid=%u\tgid=%u\tcuid=%u\tcgid=%u\tmode=%#o\n"),
+              msgdata->msg_perm.uid, msgdata->msg_perm.uid,
+              msgdata->msg_perm.cuid, msgdata->msg_perm.cgid,
+              msgdata->msg_perm.mode);
+       printf(_("cbytes=%jd\tqbytes=%jd\tqnum=%jd\tlspid=%d\tlrpid=%d\n"),
+              msgdata->q_cbytes, msgdata->q_qbytes, msgdata->q_qnum,
+              msgdata->q_lspid, msgdata->q_lrpid);
+       printf(_("send_time=%-26.24s\n"),
+              msgdata->q_stime ? ctime(&msgdata->q_stime) : _("Not set"));
+       printf(_("rcv_time=%-26.24s\n"),
+              msgdata->q_rtime ? ctime(&msgdata->q_rtime) : _("Not set"));
+       printf(_("change_time=%-26.24s\n"),
+              msgdata->q_ctime ? ctime(&msgdata->q_ctime) : _("Not set"));
+       printf("\n");
+
+       ipc_msg_free_info(msgdata);
 }
 
 static void print_sem(int semid)
index 772863c544e72806123e63d9f29db9f7fe692943..7d1f0d1efb3747b8a7df02a985e5c929c7fb1e4f 100644 (file)
@@ -362,6 +362,7 @@ int ipc_msg_get_info(int id, struct msg_data **msgds)
        int i, maxid;
        struct msg_data *p;
        struct msqid_ds dummy;
+       struct msqid_ds msgseg;
 
        p = *msgds = xcalloc(1, sizeof(struct msg_data));
        p->next = NULL;
@@ -394,6 +395,12 @@ int ipc_msg_get_info(int id, struct msg_data **msgds)
                if (id > -1) {
                        /* ID specified */
                        if (id == p->msg_perm.id) {
+                               /*
+                                * FIXME: q_qbytes are not in /proc
+                                *
+                                */
+                               if (msgctl(id, IPC_STAT, &msgseg) != -1)
+                                       p->q_qbytes = msgseg.msg_qbytes;
                                i = 1;
                                break;
                        } else
@@ -421,10 +428,9 @@ int ipc_msg_get_info(int id, struct msg_data **msgds)
 
        while (i <= maxid) {
                int msgid;
-               struct msqid_ds msgseg;
                struct ipc_perm *ipcp = &msgseg.msg_perm;
 
-               msgid = msgctl(id, MSG_STAT, &msgseg);
+               msgid = msgctl(i, MSG_STAT, &msgseg);
                if (msgid < 0) {
                        if (-1 < id) {
                                free(*msgds);
@@ -448,6 +454,7 @@ int ipc_msg_get_info(int id, struct msg_data **msgds)
                p->q_stime = msgseg.msg_stime;
                p->q_rtime = msgseg.msg_rtime;
                p->q_ctime = msgseg.msg_ctime;
+               p->q_qbytes = msgseg.msg_qbytes;
 
                if (id < 0) {
                        p->next = xcalloc(1, sizeof(struct msg_data));