/* succ [, errmsg] = socket:connect(host, port) */ static int str_connect (lua_State *L) { loski_NetDriver *drv = (loski_NetDriver *)lua_touserdata(L, lua_upvalueindex(1)); loski_Socket *socket = tosock(L, LOSKI_STRMSOCKET); loski_Address address; int res = checkaddress(drv, L, 2, 3, &address); if (res != 0) return pushaddrres(L, 0, res); res = loski_connectsocket(drv, socket, &address); return pushsockres(L, 0, res); }
/* sent [, errmsg] = socket:send(data [, i [, j [, host, port]]]) */ static int dgm_send (lua_State *L) { loski_NetDriver *drv = (loski_NetDriver *)lua_touserdata(L, lua_upvalueindex(1)); loski_Socket *socket = tosock(L, LOSKI_DGRMSOCKET); size_t sz, sent; const char *data = checkstream(L, 2, 3, 4, &sz); int res; if (!lua_isnoneornil(L, 5)) { loski_Address address; res = checkaddress(drv, L, 5, 6, &address); if (res != 0) return pushaddrres(L, 0, res); res = loski_sendtosocket(drv, socket, data, sz, &sent, &address); } else { res = loski_sendtosocket(drv, socket, data, sz, &sent, NULL); } lua_pushinteger(L, sent); return pushsockres(L, 1, res); }
void threadmain(int argc, char *argv[]) { int serveudp, servetcp; char *service; serveudp = 0; servetcp = 0; service = "dns"; ARGBEGIN{ case 'd': debug = 1; traceactivity = 1; break; case 'f': dbfile = EARGF(usage()); break; case 'x': service = EARGF(usage()); break; case 'r': resolver = 1; break; case 's': serveudp = 1; cachedb = 1; break; case 't': servetcp = 1; cachedb = 1; break; case 'a': maxage = atoi(EARGF(usage())); break; case 'z': zonerefreshprogram = EARGF(usage()); break; case 'n': sendnotifies = 1; break; case 'U': udpaddr = estrdup(netmkaddr(EARGF(usage()), "udp", "domain")); break; case 'T': tcpaddr = estrdup(netmkaddr(EARGF(usage()), "tcp", "domain")); break; default: usage(); }ARGEND if(argc) usage(); if(serveudp && servetcp) checkaddress(); rfork(RFNOTEG); /* start syslog before we fork */ fmtinstall('F', fcallfmt); dninit(); if(myipaddr(ipaddr, mntpt) < 0) sysfatal("can't read my ip address"); syslog(0, logfile, "starting dns on %I", ipaddr); opendatabase(); mountinit(service); now = time(0); srand(now*getpid()); db2cache(1); if(serveudp) proccreate(dnudpserver, nil, STACK); if(servetcp) proccreate(dntcpserver, nil, STACK); if(sendnotifies) proccreate(notifyproc, nil, STACK); io(); }