void fetchtask(void *v) { int fd, n; char buf[512]; struct timeval stTv; //fprintf(stderr, "starting...\n"); for(;;){ if((fd = netdial(TCP, server, 80)) < 0){ fprintf(stderr, "dial %s: %s (%s)\n", server, strerror(errno), taskgetstate()); continue; } stTv.tv_sec = 60; stTv.tv_usec = 0; setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&stTv, sizeof(stTv)); snprintf(buf, sizeof buf, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", url, server); fdwrite(fd, buf, strlen(buf)); while((n = fdread(fd, buf, sizeof buf)) > 0) ; if (n < 0) { fail++; }else{ sucess++; } close(fd); } }
int fdputsf(int fd, char *fmt, ...) { char msg[2048]; va_list args; va_start(args, fmt); vsnprintf(msg, sizeof(msg)-1, fmt, args); va_end(args); return fdwrite(fd, msg, strlen(msg)); }
static int ttyreset(int fd) { static uint8 ff = 0xff; if(fdwrite(fd, &ff, 1) < 0) return -1; /* This is fairly conservative. */ taskdelay(250); return 0; }
void proxytask(void *v) { int fd ; int n = 0 ; char buf[1024]; fd = (int)v; while((n = fdread(&fd, buf, sizeof buf)) > 0) { fdwrite(&fd, buf, n); } close(fd); }
void rwtask(void *v) { int *a, rfd, wfd, n; char buf[2048]; a = v; rfd = a[0]; wfd = a[1]; free(a); while ((n = fdread(rfd, buf, sizeof buf)) > 0) { fdwrite(wfd, buf, n); } shutdown(wfd, SHUT_WR); close(rfd); }
static int hexwrite(int fd, void *p, int n) { char hex[RCALLMAX*2]; int i, nw; char *cp = (char*)p; for(i=0; i<n; i++) to_hex8_ascii(&hex[i*2], cp[i]); nw = fdwrite(fd, hex, n*2); if(nw < 0) return -1; return nw/2; }
void fetchtask(ltctx *lt, void *v) { int fd, n; char buf[512]; fprintf(stderr, "starting...\n"); for(;;) { if((fd = netdial(lt, TCP, server, 80)) < 0) { fprintf(stderr, "dial %s: %s (%s)\n", server, strerror(errno), taskgetstate(lt)); continue; } snprintf(buf, sizeof buf, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", url, server); fdwrite(lt, fd, buf, strlen(buf)); while((n = fdread(lt, fd, buf, sizeof buf)) > 0) ; close(fd); write(1, ".", 1); } }
void fetchtask(void *v) { int fd, n; char buf[512]; fprintf(stderr, "starting...\n"); for (; ;) { if ((fd = netdial(TCP, server, 80)) < 0) { // 异步连接服务器, 会造成协程切换 fprintf(stderr, "dial %s: %s (%s)\n", server, strerror(errno), taskgetstate()); continue; } snprintf(buf, sizeof buf, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", url, server); fdwrite(&fd, buf, strlen(buf)); // 异步数据读写, 这里可能会造成协程切换, 因为一定有阻塞操作 while ((n = fdread(&fd, buf, sizeof buf)) > 0) { // 异步读取 buf[n] = '\0'; printf("buf:%s", buf); } close(fd); write(1, ".", 1); } }
int bsd_sendfile(int out_fd, int in_fd, off_t *offset, size_t count) { char buf[BSD_SENDFILE_BUF_SIZE]; int tot, cur, rem, sent; int ret = -1; off_t orig_offset = 0; if (offset != NULL) { orig_offset = lseek(in_fd, 0, SEEK_CUR); check(orig_offset >= 0, "lseek failure when determining current position"); check(lseek(in_fd, *offset, SEEK_SET) >= 0, "lseek failure when setting new position"); } for (tot = 0, rem = count, cur = rem; cur != 0 && tot < count; tot += cur, rem -= cur) { if (rem >= BSD_SENDFILE_BUF_SIZE) { cur = BSD_SENDFILE_BUF_SIZE; } else { cur = rem; } cur = fdread(in_fd, buf, cur); check(cur >= 0, "Internal sendfile emulation failed: fdread: %i", cur); if (cur != 0) { sent = fdwrite(out_fd, buf, cur); check(sent == cur, "Internal sendfile emulation failed: fdread: %i, fdwrite: %i", cur, sent); } } ret = tot; error: if (offset != NULL) { if (ret != -1) { *offset += tot; } lseek(in_fd, orig_offset, SEEK_SET); } return ret; }
inline int cornet_write(int fd, const char* buf, int len) { return fdwrite(fd, (char*)buf, len); }
static ssize_t file_send(IOBuf *iob, char *buffer, int len) { return fdwrite(iob->fd, buffer, len); }
int fdputs(int fd, char *msg) { return fdwrite(fd, msg, strlen(msg)); }
static void send_device_command(struct videohub_data *d, char *cmd_buffer) { if (!test_data) fdwrite(d->dev_fd, cmd_buffer, strlen(cmd_buffer)); else parse_text_buffer(d, cmd_buffer); }
/* Returns: -1 = exit thread 1 = retry 0 = connected ok */ int connect_source(INPUT *r, int retries, int readbuflen, int *http_code) { CHANSRC *src = chansrc_init(r->channel->source); if (!src) { LOGf("ERR : Can't parse channel source | Channel: %s Source: %s\n", r->channel->name, r->channel->source); FATAL_ERROR; } r->connected = 0; r->reconnect = 0; int active = 1; int dret = async_resolve_host(src->host, src->port, &(r->src_sockname), 5000, &active); if (dret != 0) { if (dret == 1) proxy_log(r, "Can't resolve host"); if (dret == 2) proxy_log(r, "Timeout resolving host"); DO_RECONNECT; } proxy_log(r, "Connecting"); char buf[1024]; *http_code = 0; if (src->sproto == tcp_sock) { r->sock = socket(PF_INET, SOCK_STREAM, 0); if (r->sock < 0) { log_perror("play(): Could not create SOCK_STREAM socket.", errno); FATAL_ERROR; } //proxy_log(r, "Add"); if (do_connect(r->sock, (struct sockaddr *)&(r->src_sockname), sizeof(r->src_sockname), PROXY_CONNECT_TIMEOUT) < 0) { LOGf("ERR : Error connecting to %s srv_fd: %i err: %s\n", r->channel->source, r->sock, strerror(errno)); DO_RECONNECT; } snprintf(buf,sizeof(buf)-1, "GET /%s HTTP/1.0\nHost: %s:%u\nX-Smart-Client: yes\nUser-Agent: %s %s (%s)\n\n", src->path, src->host, src->port, server_sig, server_ver, config->ident); buf[sizeof(buf)-1] = 0; fdwrite(r->sock, buf, strlen(buf)); char xresponse[128]; memset(xresponse, 0, sizeof(xresponse)); memset(buf, 0, sizeof(buf)); regmatch_t res[4]; while (fdgetline(r->sock,buf,sizeof(buf)-1)) { if (buf[0] == '\n' || buf[0] == '\r') break; if (strstr(buf,"HTTP/1.") != NULL) { regex_t http_response; regcomp(&http_response, "^HTTP/1.[0-1] (([0-9]{3}) .*)", REG_EXTENDED); if (regexec(&http_response,buf,3,res,0) != REG_NOMATCH) { char codestr[4]; if ((unsigned int)res[1].rm_eo-res[1].rm_so < sizeof(xresponse)) { strncpy(xresponse, &buf[res[1].rm_so], res[1].rm_eo-res[1].rm_so); xresponse[res[1].rm_eo-res[1].rm_so] = '\0'; chomp(xresponse); strncpy(codestr, &buf[res[2].rm_so], res[2].rm_eo-res[2].rm_so); codestr[3] = 0; *http_code = atoi(codestr); } } regfree(&http_response); } if (*http_code == 504) { // Extract extra error code if (strstr(buf, "X-ErrorCode: ") != NULL) { *http_code = atoi(buf+13); break; } } } if (*http_code == 0) { // No valid HTTP response, retry LOGf("DEBUG: Server returned not valid HTTP code | srv_fd: %i\n", r->sock); DO_RECONNECT; } if (*http_code == 504) { // No signal, exit LOGf("ERR : Get no-signal for %s from %s on srv_fd: %i\n", r->channel->name, r->channel->source, r->sock); FATAL_ERROR; } if (*http_code > 300) { // Unhandled or error codes, exit LOGf("ERR : Get code %i for %s from %s on srv_fd: %i exiting.\n", *http_code, r->channel->name, r->channel->source, r->sock); FATAL_ERROR; } // connected ok, continue } else { if (!IN_MULTICAST(ntohl(r->src_sockname.sin_addr.s_addr))) { LOGf("ERR : %s is not multicast address\n", r->channel->source); FATAL_ERROR; } struct ip_mreq mreq; struct sockaddr_in receiving_from; r->sock = socket(PF_INET, SOCK_DGRAM, 0); if (r->sock < 0) { log_perror("play(): Could not create SOCK_DGRAM socket.", errno); FATAL_ERROR; } // LOGf("CONN : Listening on multicast socket %s srv_fd: %i retries left: %i\n", r->channel->source, r->sock, retries); int on = 1; setsockopt(r->sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); // subscribe to multicast group memcpy(&mreq.imr_multiaddr, &(r->src_sockname.sin_addr), sizeof(struct in_addr)); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(r->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { LOGf("ERR : Failed to add IP membership on %s srv_fd: %i\n", r->channel->source, r->sock); FATAL_ERROR; } // bind to the socket so data can be read memset(&receiving_from, 0, sizeof(receiving_from)); receiving_from.sin_family = AF_INET; receiving_from.sin_addr = r->src_sockname.sin_addr; receiving_from.sin_port = htons(src->port); if (bind(r->sock, (struct sockaddr *) &receiving_from, sizeof(receiving_from)) < 0) { LOGf("ERR : Failed to bind to %s srv_fd: %i\n", r->channel->source, r->sock); FATAL_ERROR; } } if (setsockopt(r->sock, SOL_SOCKET, SO_RCVBUF, (const char *)&readbuflen, sizeof(readbuflen)) < 0) log_perror("play(): setsockopt(SO_RCVBUF)", errno); r->connected = 1; // proxy_log(r, "Connected"); chansrc_free(&src); return 0; }