|
I''ve converted a C example that uses Linux signals and getaddrinfo_a to LuaJIT. The example works but I get a double free corruption sometimes. Could anybody help me identify where I deviate from LuaJIT best practices ? The .lj file has the LuaJIT code. The .cdef file has the C definitions. The attached C example is taken from http://www.hrozkovi.cz/?p=learning/.git;a=blob;f=getaddrinfo_a/gaia.c Thanks jose
Attachment:
gaia.lj
Description: Binary data
Attachment:
gaia.cdef
Description: Binary data
/* * Quick and dirty example of getaddrinfo_a usage * * Compile with -lanl * * Usage ./gaia <space-delimited-list-of-hostnames> * */ #define _GNU_SOURCE #include <netdb.h> #include <stdio.h> #include <assert.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <sys/signalfd.h> #include <sys/socket.h> #include <arpa/inet.h> int main(int argc, char **argv) { struct gaicb *host; struct gaicb *out; struct sigevent ev; struct signalfd_siginfo fdsi; sigset_t mask; int sfd; int s; int queued, resolved; struct sockaddr_in *res; if(argc < 2) { return 1; } sigemptyset(&mask); sigaddset(&mask, SIGRTMIN); sigprocmask(SIG_BLOCK, &mask, NULL); sfd = signalfd(-1, &mask, 0); for(queued=1; queued<argc; ++queued) { host = calloc(1, sizeof(struct gaicb)); assert(host != NULL); host->ar_name = argv[queued]; ev.sigev_notify = SIGEV_SIGNAL; ev.sigev_value.sival_ptr = host; ev.sigev_signo = SIGRTMIN; getaddrinfo_a(GAI_NOWAIT, &host, 1, &ev); } --queued; resolved = 0; /* In real world, we would probably monitor sfd via event loop */ for(;;) { if(resolved == queued) { printf("Resolved all hostnames, quit\n"); break; } s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo)); ++resolved; if (s != sizeof(struct signalfd_siginfo)) { perror("read"); return 1; } if (fdsi.ssi_signo != SIGRTMIN) { printf("Got signal %d\n, quitting", fdsi.ssi_signo); return 1; } out = fdsi.ssi_ptr; assert(out != NULL); if(out->ar_result == NULL) { printf("Cannot resolve %s\n", out->ar_name); continue; } res = (struct sockaddr_in *) out->ar_result->ai_addr; printf("host %s has address %s\n", out->ar_name, inet_ntoa(res->sin_addr)); free(out); } return 0; }