RPC Problem



  • Nicht lachen, erste Schritte in RPC.

    Was stimmt damit nicht?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <rpc/rpc.h>
    #include <rpc/pmap_clnt.h>
    #include <rpcsvc/rusers.h>
    
    [...]
    
    int arg, test_rusers = 0, test_rup = 0, nusers;
    CLIENT *rusers_clnt;
    struct utmpidlearr *up;
    struct timeval timeout = { 5, 0 };
    
    [...]
    
    rusers_clnt = clnt_create(argv[2], RUSERSPROG, RUSERSVERS_IDLE, "udp");
    
    if (rusers_clnt == NULL) {
            clnt_pcreateerror(argv[0]);
            exit(EXIT_FAILURE);
            }
    
            memset(&up, 0, sizeof(up));
    
            clnt_call(
            rusers_clnt,
                    RUSERSPROC_NAMES,
                    xdr_void,
                    NULL,
                    xdr_utmpidlearr,
                    &up,
                    timeout);
    
    for (nusers = 0; nusers < up->uia_cnt; nusers++) {
    
    char *name = malloc(sizeof(char)*1000);
    strncpy(name, up->uia_arr[nusers]->ui_utmp.ut_name, 1000);
    
    printf("%s\n", name);
    }
    
    /* callrpc(argv[2], RUSERSPROG, RUSERSVERS_IDLE, RUSERSPROC_NAMES, (xdrproc_t)xdr_void,(char*)NULL,xdr_utmpidlearr, (char*)up);
    
    for (nusers = 0; nusers < up->uia_cnt; nusers++) {
    
    char *name;
    strcpy(name, up->uia_arr[nusers]->ui_utmp.ut_name);
    
    printf("%s\n", name);
    
    }
    */
    
    /* printf() the usernames to stdout */
    
    // clnt_destroy(rusers_clnt);
    
    exit ( EXIT_SUCCESS );
    }
    

    Hab schon so gut wie alle möglichen Variationen durchgespielt.
    Kann mir mal einer Bitte behilflich sein?
    Fehler:

    Ich bekomme eine SIGSEGV.

    ltrace(1) darauf ergibt das:

    [...]
    malloc(1000) = 0x0804f2c8
    strncpy(0x0804f2c8, "EOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOFEOF"..., 1000 <unfinished ...>
    --- SIGSEGV (Segmentation fault) ---
    +++ killed by SIGSEGV +++

    gdb:
    Program received signal SIGSEGV, Segmentation fault.
    0x400a6d20 in strncpy () from /lib/libc.so.6
    (gdb) where
    #0 0x400a6d20 in strncpy () from /lib/libc.so.6
    #1 0x0804885e in main (argc=3, argv=0xbffff4a4) at rpc_test.c:75
    #2 0x400408ae in __libc_start_main () from /lib/libc.so.6

    Nachtrag: Ich bekomme immer einen Fehler, wenn ich auf
    up->uia_arr[nusers]->ui_utmp.ut_name zugreifen will.
    Wird das Element nicht richtig gefüllt? Ist das ein C Problem oder doch RPC?



  • patrick++ schrieb:

    for (nusers = 0; nusers < up->uia_cnt; nusers++) {
    
    char *name = malloc(sizeof(char)*1000);
    strncpy(name, up->uia_arr[nusers]->ui_utmp.ut_name, 1000);
    
    printf("%s\n", name);
    }
    

    1. Du reservierst Speicher mit malloc (warum auch immer) und gibst ihn nie frei
    2. 'name' ist eventuell garnicht 0-Terminiert.
    Mach aus der malloc-Zeile also besser:

    char name[1001] = {0};
    

    Weiß nicht, wieso es abstürzt.. Sicher dass 'up' keinen Speicher brauch? (Der memset-Aufruf ist jedenfalls schonmal falsch).



  • Hi.

    Hmmmm jetzt gehts. Lag aber nicht an deinen Tips, Doc 😉
    Leider.

    clnt_call(
                    rusers_clnt,
                    RUSERSPROC_NAMES,
                    (xdrproc_t)xdr_void,
                    NULL,
                    (xdrproc_t)xdr_utmpidlearr,
                    &up,
                    timeout);
    

    So muss das aussehen.
    Dann klappts auch mit der struct 😉

    Trotzdem danke



  • patrick++ schrieb:

    Lag aber nicht an deinen Tips

    Nichtsdestotrotz solltest du dich ihren annehmen 😉


Anmelden zum Antworten