[Linux-ha-dev] Linux-HA-Question
Andrew Beekhof
beekhof at gmail.com
Thu Jan 31 04:25:20 MST 2008
On Jan 31, 2008, at 11:09 AM, bare wrote:
> Dear Sir:
> I am sorry to trouble you, but this is important for me, and I need
> you help, thank you very much.
> The problem is the following cod:
> #include <stdio.h>
> #include <ctype.h>
> #include<stdlib.h>
> #include <stdarg.h>
> #include <string.h>
>
> void msg(const char* type, ...)
> {
>
> va_list ap;
>
> char* buf;
> va_start(ap,type);
>
> while(1) {
> char* arg = va_arg(ap, char*);
> if (arg == NULL || strcmp(arg, "") == 0) {
> printf("break...\n");
> break;
> }
> printf("----------%s------------\n",arg);
> //len += strnlen(arg, 200)+1;
> }
>
> va_end(ap);
>
> }
> void main(void)
> {
> msg("char","a","b","c","d");
> }
>
> when it is run in Red hat, the result is :
> begin........
> ----------a------------
> ----------b------------
> ----------c------------
> ----------d------------
> break...
> but in solaris:
> ----------a------------
> ----------b------------
> ----------c------------
> ----------d------------
> ----------� ا���|------------
> ----------��
> �ZYX��]���------------
> ----------Z�2------------
> ----------����
------------
> ----------[�â------------
> ----------P
> �������_
��1��n~------------
> ----------n
> �|�|� ا���|------------
> ----------�|------------
> ----------[��------------
> ----------�z------------
> break...
> That means if the program is run in solaris, some problems will
> occur like 'core dumped".I don't know how to resolve this problem.
> Of course we can add a parameter of the count of parameters and do
> something in a for iterator, but there are many place to modify, so
> can you give me some suggestions to resolve this problems in solaris
> environment? thank you very much. I am looking forward to you reply.
>
> The same problem is also occured in lib/mgmt/mgmt_common_lib.c
> char*
> mgmt_new_msg(const char* type, ...)
> {
> va_list ap;
> int len;
> char* buf;
>
> /* count the total len of fields */
> len = strnlen(type, MAX_STRLEN)+1;
> va_start(ap,type);
i don't like the look of this while-loop at all
>
> while(1) {
> char* arg = va_arg(ap, char*);
> if (arg == NULL) {
> break;
> }
> len += strnlen(arg, MAX_STRLEN)+1;
> }
> va_end(ap);
>
> /* alloc memory */
> buf = (char*)mgmt_malloc(len+1);
> if (buf == NULL) {
> return NULL;
> }
>
> /* assign the first field */
> snprintf(buf,len,"%s", type);
>
> /* then the others */
> va_start(ap, type);
> while(1) {
> char* arg = va_arg(ap, char*);
> if (arg == NULL) {
> break;
> }
> strncat(buf, "\n", len);
> strncat(buf, arg, len);
> }
> va_end(ap);
>
> return buf;
> }
>
this is the loop suggested by "man va_start" on linux
void foo(char *fmt, ...) {
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
va_end(ap);
}
perhaps you can adapt that to your testcase for solaris. otherwise,
check what man va_start says on your system.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.community.tummy.com/pipermail/linux-ha-dev/attachments/20080131/6b5a535c/attachment-0001.htm
More information about the Linux-HA-Dev
mailing list