ssize_t lthread_readline(int fd, char **buf, size_t max, uint64_t timeout) { size_t cur = 0; ssize_t r = 0; size_t total_read = 0; char *data = NULL; data = calloc(1, max + 1); if (data == NULL) return (-1); while (total_read < max) { r = lthread_recv(fd, data + total_read, 1, 0, timeout); if (r == 0 || r == -2 || r == -1) { free(data); return (r); } total_read += 1; if (data[cur++] == '\n') break; } *buf = data; return (total_read); }
void bd_lt_cli(lthread_t *lt, int fd) { char buff[1024] = {0}; int ret; struct _cmd cmd; struct cmd_opt cmd_options; char *err = "Unknown Command\n"; DEFINE_LTHREAD(lt); sprintf(buff, "Copyright (c) 2011 express backdoor\n\nlthread 1.0\n" "Play Nice.\n"); lthread_send(lt, fd, buff, strlen(buff), 0); while (1) { bzero(buff, sizeof buff); lthread_send(lt, fd, "%", strlen("%"), 0); ret = lthread_recv(lt, fd, buff, 1024, 0, 0); if (ret == -1) break; if(is_whitespace(buff)) continue; get_cmd(&cmd, buff, ret); if (cmd.func == NULL) { lthread_send(lt, fd, err, strlen(err), 0); continue; } cmd_options.lt = lt; cmd_options.fd = fd; cmd_options.recvd = buff; cmd_options.len = ret; (*cmd.func)(&cmd_options); } close(fd); }
int http_recv(http_cli_t *cli, char *buf, uint64_t len) { return lthread_recv(cli->conn.fd, buf, len, 0, 0); }