On Fri, Jan 28, 2000 at 01:19:01PM -0500, Roland McGrath wrote:
> > Now for the next problem. I think this also is a bug in the hurdish part of
> > glibc. Attached is a stripped-down part of the debian linux portmapper.
> > This works on linux, but on the hurd this crashes in svc_run:
> 
> Thanks for the report.  That is indeed a libc bug.
> I've fixed the bug and will check that in shortly.

Ok, now glibc-2.1.3 is out, and I've got some time to play with this again. 
I've installed the debian libc0.2{,-dev,-dbg}_2.1.3-6.deb packages. 
(I can use the CVS sources, but I do not have time nor machine power to
compile glibc myself.)

Anyway, it does no longer crash when entering svc_run(), but when I
establish a (tcp) connection.

Attached is the same test program, but this time it includes tcp support.
If yo run it, and then do 'rpcinfo -p', or 'telnet localhost 111' if
you don't have rpcinfo. The program will crash like this:

Program received signal SIGSEGV, Segmentation fault.
0x1126bd3 in svc_getreqset () at svc.c:222
222     svc.c: No such file or directory.
(gdb) bt
#0  0x1126bd3 in svc_getreqset () at svc.c:222
#1  0x1127329 in svc_run () at svc_run.c:89
#2  0x80489cf in main () at rpct.c:56
(gdb)

I belive udp will behave similar, but since rpcinfo uses tcp, I have only
tested this.

Marcus, tell me when you are ready to decide how to package the various rpc
and yp-daemons and utilities.

        Steinar
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define PORTMAP
#include <rpc/rpc.h>

void dispatch() {
        fprintf(stderr, "dispatch\n");
}
int
main() {
        SVCXPRT *xprt;
        int sock;
        struct sockaddr_in addr;

        /* udp */
        int len = sizeof(struct sockaddr_in);
        if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
                fprintf(stderr, "cannot create udp socket: %s\n",
                        strerror(errno));
                exit(1);
        }
        memset((char *) &addr, 0, sizeof(addr));
        addr.sin_addr.s_addr = 0;
        addr.sin_family = AF_INET;
        addr.sin_port = htons((short)111);
        if (bind(sock, (struct sockaddr *)&addr, len) != 0) {
                fprintf(stderr, "cannot bind udp: %s\n",
                        strerror(errno));
                exit(1);
        }
        if ((xprt = svcudp_create(sock)) == (SVCXPRT *)NULL) {
                fprintf(stderr, "couldn't do ucp_create\n");
                exit(1);
        }

        /* tcp */
        if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
                fprintf(stderr, "cannot create tcp socket: %s\n",
                        strerror(errno));
                exit(1);
        }
        if (bind(sock, (struct sockaddr *)&addr, len) != 0) {
                fprintf(stderr, "cannot bind tcp: %s\n",
                        strerror(errno));
                exit(1);
        }
        if ((xprt = svctcp_create(sock, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE))
            == (SVCXPRT *)NULL) {
                fprintf(stderr, "couldn't do tcp_create\n");
                exit(1);
        }

        svc_register(xprt, 98934, 1, dispatch, 0);
        svc_run();
        fprintf(stderr, "svc_run exited!\n");
        exit(1);
}

Reply via email to