From: Manfred Spraul <manfred@colorfullife.com>
To: Mark Swanson <swansma@yahoo.com>, linux-kernel@vger.kernel.org
Subject: Re: System V msg queue bugs in latest kernels
Date: Sat, 17 Feb 2001 21:07:16 +0100 [thread overview]
Message-ID: <3A8ED9F4.AEFC4D29@colorfullife.com> (raw)
In-Reply-To: <20010217184242.1070.qmail@web1302.mail.yahoo.com> <3A8ECB1B.776D0372@colorfullife.com>
[-- Attachment #1: Type: text/plain, Size: 979 bytes --]
Manfred Spraul wrote:
>
> Mark Swanson wrote:
> >
> > Hello,
> >
> > ipcs (msg) gives incorrect results if used-bytes is above 65536. It
> > stays at 65536 even though messages are being read and removed from the
> > msg queue.
> >
Ok, does the value stay at 65536 or 65535?
It should stay at 65535 if you use a too old version of util-linux.
Please upgrade (see linux/Documentation/Changes)
The proc interface at /proc/sysvipc/msg should report the correct
numbers.
If you want to access values > 65535 from your app you have 2 options:
1) use the new msqid64_ds structure. You must pass IPC_64 to the msgctl
call. This is the only option if you need correct 32-bit uids.
Check the util-linux source, I don't have sample code.
msqid64_ds is only supported by the 2.4 kernel.
2) the old msqid_ds structure also support 32-bit queue length, an
unused field was reused. No support for 32-bit uids.
#define msg_lqbytes __rwait;
I've attached my old sample code.
--
Manfred
[-- Attachment #2: longqueue.c --]
[-- Type: text/plain, Size: 2435 bytes --]
/*
* This code is public domain sample code.
* Written by Manfred Spraul, 1999
*
* The application must be started by root or
* setuid(root).
*
* $Header: /pub/cvs/ms/ipcmsg/longqueue.c,v 1.2 1999/10/09 23:27:54 manfreds Exp $
*/
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* result codes:
* 0: success
* 1: partial success, queue len now USHORT_MAX
* 100: invalid parameters.
* 101: other error
* 256: fatal error, please delete the queue: queue len now 0.
*/
#define USHORT_MAX 0xFFff
struct queuelen {
int llen;
unsigned short slen;
};
struct msqid_ds g_q;
#define msg_lqbytes __rwait
void failure(char* msg)
{
printf(" unexpected error in %s.\n",msg);
exit(101);
}
int init_ipc(int id)
{
int res;
res = msgget(id,0);
if(res == -1)
failure("findkey()");
id = res;
res = msgctl(id,IPC_STAT,&g_q);
if(res == -1)
failure("init_ipc()");
return id;
}
void get_queuelen(int id,
struct queuelen *out)
{
int res;
struct msqid_ds q;
res = msgctl(id,IPC_STAT,&q);
if(res == -1)
failure("get_queuelen()");
out->llen = q.msg_lqbytes;
out->slen = q.msg_qbytes;
}
int set_queuelen(int id, int len)
{
struct msqid_ds q;
memcpy(&q,&g_q,sizeof(q));
if(len > USHORT_MAX) {
q.msg_qbytes = 0;
q.msg_lqbytes = len;
} else
{
q.msg_qbytes = len;
}
return msgctl(id,IPC_SET,&q);
}
int main(int argc,char** argv)
{
int id;
int len;
struct queuelen prev;
struct queuelen new;
printf("longqueue <id> <len>\n");
if(argc != 3) {
printf("Invalid parameters.\n");
return 100;
}
id = atoi(argv[1]);
len = atoi(argv[2]);
if(len <= 0) {
printf("Invalid parameters.\n");
return 100;
}
id = init_ipc(id);
get_queuelen(id,&prev);
if(set_queuelen(id,len) == -1)
failure("set_queuelen()");
if(len <= USHORT_MAX) {
out_success:
get_queuelen(id,&prev);
printf(" new queuelen: (%d,%d).\n",prev.slen,prev.llen);
return 0;
}
/* the old Linux ipcmsg code doesn't support
* long queues. It interprets this as "queue len 0".
* Check for this, and try USHORT_MAX, then the original
* value.
*/
get_queuelen(id,&new);
if(new.slen != 0)
goto out_success;
if(set_queuelen(id,USHORT_MAX) == -1) {
if(set_queuelen(id,prev.slen) == -1) {
printf(" fatal error. queue len now 0.\n");
return 256;
};
failure("set_queuelen()");
}
get_queuelen(id,&new);
printf(" new queuelen: (%d,%d).\n",prev.slen,prev.llen);
return 1;
}
next prev parent reply other threads:[~2001-02-17 20:08 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-02-17 18:42 System V msg queue bugs in latest kernels Mark Swanson
2001-02-17 19:03 ` Manfred Spraul
2001-02-17 19:22 ` Mark Swanson
2001-02-17 19:40 ` Mark Swanson
2001-02-17 20:07 ` Manfred Spraul [this message]
-- strict thread matches above, loose matches on Subject: below --
2001-02-17 23:53 Christopher Allen Wing
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3A8ED9F4.AEFC4D29@colorfullife.com \
--to=manfred@colorfullife.com \
--cc=linux-kernel@vger.kernel.org \
--cc=swansma@yahoo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox