strtbl *st_newWithString(const char *s) { strtbl *st = NULL; char key[MAXSTR], value[MAXSTR]; if ((s == NULL) || (*s != LEFTCURLY)) return NULL; /* * repeat over key = value pairs */ s++; while (*s != RIGHTCURLY) { s = _getstr(s, key); while (*s && isspace((int)*s)) s++; if (*s == EQUAL) s = _getstr(s+1, value); if (*key && *value) { if (st == NULL) st = st_new(0); st_add(st, key, value, STR_COPYKEY|STR_COPYVALUE); } while (*s && (isspace((int)*s) || (*s == SEMI))) s++; } return st; }
static int ml_aitvaras_init(lua_State* l) { checkargs(0, "aitvaras.init"); invocation_cs = async_make_cs(); mempool_init(&invocation_pool, sizeof(Invocation)); cb_l = l; lua_getglobal(l, "aitvaras"); if(!_validate_conf(l)) return luaL_error(l, "invalid configuration"); const char* lobby_addr = _getstr(l, "lobby_addr"); const char* server_addr = _getstr(l, "server_addr"); char* enlist_req = alloca(strlen(lobby_addr) + strlen("/enlist") + 1); strcpy(enlist_req, lobby_addr); strcat(enlist_req, "/enlist"); http_post(enlist_req, false, server_addr, NULL, _enlist_cb); aatree_init(&clients); const char* options[] = { "listening_ports", _getstr(l, "listening_port"), "document_root", _getstr(l, "document_root"), NULL }; mg_ctx = mg_start(mg_callback, NULL, options); lua_pop(l, 1); return 0; }
char *InputBox ( /*bool bksave, int bkmax,*/ int max, /*char *bkfile*/ char *msg, char *init ) { unsigned char *p; unsigned char input[max += max == 0 ? 1025 : 1]; int key, pos = _wstrlen(init), strpos; dispos = 0; curs_set(1); strcpy((char *)input, init); while(1) { _boxdis(msg, (char *)input, pos, max); switch (key = getch()) { case KEY_UP: break; case KEY_DOWN: input[0] = '\0'; pos = 0; break; case KEY_LEFT: pos = MAX(0, pos - 1); break; case KEY_RIGHT: pos = MIN(_wstrlen((char *)input), pos + 1); break; case KEY_RESIZE: break; case 033: curs_set(0); return NULL; case '\n': curs_set(0); return _getstr((char *)input); case KEY_DC: case KEY_BACKSPACE: case 127: strpos = POS; strcpy((char *)&input[strpos == 0 ? 0 : _wstrpos((char *)input, pos - 1)], (char *)&input[strpos == 0 ? _wstrpos((char *)input, 1) : strpos]); pos -= pos != 0; break; default: if (key > 255 || key < 0) break; if (isascii(key) && (int)strlen((char *)input) > max - 2) break; if (!isascii(key) && (int)strlen((char *)input) > max - 3) { getch(); break; } strpos = POS; p = malloc(strlen((char *)input) - strpos + 1); strcpy((char *)p, (char *)&input[strpos]); input[strpos] = key; if (!isascii(key)) input[strpos + 1] = getch(); pos++; strcpy((char *)&input[strpos + 1 + !isascii(key)], (char *)p); free(p); } } }
static int ml_aitvaras_close(lua_State* l) { checkargs(0, "aitvaras.close"); lua_getglobal(l, "aitvaras"); const char* lobby_addr = _getstr(l, "lobby_addr"); const char* server_addr = _getstr(l, "server_addr"); char* remove_req = alloca(strlen(lobby_addr) + strlen("/remove") + 1); strcpy(remove_req, lobby_addr); strcat(remove_req, "/remove"); if(server_id != -1) http_post(remove_req, false, server_addr, NULL, _remove_cb); mg_stop(mg_ctx); aatree_free(&clients); // Since some invocations might still be live, append // cleanup task to the end of the queue async_schedule(_cleanup_invocations, 0, NULL); return 0; }
int socks4_negotiate(int clisock, struct conndesc *conn) { u_char data, *addr; char hostname[256]; int ret; struct socks4_hdr hdr4; struct sockaddr_in rem_in; struct hostent *hent; /* This is already implied ... */ hdr4.vn = SOCKS4_VN; ret = -1; /* Get the seven first bytes after version, until USERID */ if (atomicio(read, clisock, &hdr4.cd, 7) != 7) return (-1); switch (hdr4.cd) { case SOCKS4_CD_CONNECT: case SOCKS4_CD_RESOLVE: /* We can only do connect & resolve. */ break; default: warnxv(0, "Client attempted unsupported SOCKS4 command %d", hdr4.cd); return (-1); }; /* Eat the username; it is not used */ while ((ret = atomicio(read, clisock, &data, 1)) == 1 && data != 0); if (ret != 1) return (-1); memset(&rem_in, 0, sizeof(rem_in)); rem_in.sin_family = AF_INET; rem_in.sin_port = hdr4.destport; addr = (unsigned char *)&hdr4.destaddr; /* SOCKS4A or tor-resolve? */ if ((addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] != 0) || (hdr4.cd == SOCKS4_CD_RESOLVE && hdr4.destport == 0)) { if (_getstr(clisock, hostname, sizeof(hostname)) < 0) return (-1); if ((hent = gethostbyname(hostname)) == NULL) { hdr4.cd = SOCKS4_REP_REJECT; } else { rem_in.sin_addr = *(struct in_addr *)hent->h_addr; /* * Send back the resolved address as well, for * tor-resolve. */ hdr4.destaddr = rem_in.sin_addr.s_addr; } } else { rem_in.sin_addr.s_addr = hdr4.destaddr; } return (_socks4_tryconnect(clisock, &rem_in, &hdr4, conn)); }