📄 ez-ipupdate.c
字号:
if(send(client_sockfd, buf, strlen(buf), 0) == -1) { fprintf(stderr, "error send()ing request: %s\n", error_string); } } else { dprintf((stderr, "error: case not handled.")); } }}int read_input(void *buf, int len){ fd_set readfds; int max_fd; struct timeval tv; int ret; int bread = -1; // set up our fdset and timeout FD_ZERO(&readfds); FD_SET(client_sockfd, &readfds); max_fd = client_sockfd; memcpy(&tv, &timeout, sizeof(struct timeval)); ret = select(max_fd + 1, &readfds, NULL, NULL, &tv); dprintf((stderr, "ret: %d\n", ret)); if(ret == -1) { dprintf((stderr, "select: %s\n", error_string)); } else if(ret == 0) { fprintf(stderr, "timeout\n"); } else { /* if we woke up on client_sockfd do the data passing */ if(FD_ISSET(client_sockfd, &readfds)) { if((bread=recv(client_sockfd, buf, len, 0)) == -1) { fprintf(stderr, "error recv()ing reply: %s\n", error_string); } } else { dprintf((stderr, "error: case not handled.")); } } return(bread);}int get_if_addr(int sock, char *name, struct sockaddr_in *sin){#ifdef IF_LOOKUP struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, name); /* why does this need to be done twice? */ if(ioctl(sock, SIOCGIFADDR, &ifr) < 0) { perror("ioctl(SIOCGIFADDR)"); memset(sin, 0, sizeof(struct sockaddr_in)); dprintf((stderr, "%s: %s\n", name, "unknown interface")); return -1; } if(ioctl(sock, SIOCGIFADDR, &ifr) < 0) { perror("ioctl(SIOCGIFADDR)"); memset(sin, 0, sizeof(struct sockaddr_in)); dprintf((stderr, "%s: %s\n", name, "unknown interface")); return -1; } if(ifr.ifr_addr.sa_family == AF_INET) { memcpy(sin, &(ifr.ifr_addr), sizeof(struct sockaddr_in)); dprintf((stderr, "%s: %s\n", name, inet_ntoa(sin->sin_addr))); return 0; } else { memset(sin, 0, sizeof(struct sockaddr_in)); dprintf((stderr, "%s: %s\n", name, "could not resolve interface")); return -1; } return -1;#else return -1;#endif}static int PGPOW_read_response(char *buf){ int bytes; bytes = read_input(buf, BUFFER_SIZE); if(bytes < 1) { close(client_sockfd); return(-1); } buf[bytes] = '\0'; dprintf((stderr, "server says: %s\n", buf)); if(strncmp("OK", buf, 2) != 0) { return(1); } else { return(0); }}static int ODS_read_response(char *buf){ int bytes; bytes = read_input(buf, BUFFER_SIZE); if(bytes < 1) { close(client_sockfd); return(-1); } buf[bytes] = '\0'; dprintf((stderr, "server says: %s\n", buf)); return(atoi(buf));}int NULL_check_info(void){ char buf[64]; if(options & OPT_DAEMON) { fprintf(stderr, "no compile time default service was set therefor you must " "specify a service type.\n"); return(-1); } printf("service: "); *buf = '\0'; fgets(buf, sizeof(buf), stdin); chomp(buf); option_handler(CMD_service_type, buf); return(0);}int EZIP_check_info(void){ warn_fields(service->fields_used); return 0;}int EZIP_update_entry(void){ char buf[BUFFER_SIZE+1]; char *bp = buf; int bytes; int btot; int ret; buf[BUFFER_SIZE] = '\0'; if(do_connect((int*)&client_sockfd, server, port) != 0) { if(!(options & OPT_QUIET)) { show_message("error connecting to %s:%s\n", server, port); } return(UPDATERES_ERROR); } snprintf(buf, BUFFER_SIZE, "GET %s?mode=update&", request); output(buf); if(address) { snprintf(buf, BUFFER_SIZE, "%s=%s&", "ipaddress", address); output(buf); } snprintf(buf, BUFFER_SIZE, "%s=%s&", "wildcard", wildcard ? "yes" : "no"); output(buf); snprintf(buf, BUFFER_SIZE, "%s=%s&", "mx", mx); output(buf); snprintf(buf, BUFFER_SIZE, "%s=%s&", "url", url); output(buf); snprintf(buf, BUFFER_SIZE, "%s=%s&", "host", host); output(buf); snprintf(buf, BUFFER_SIZE, " HTTP/1.0\015\012"); output(buf); snprintf(buf, BUFFER_SIZE, "Authorization: Basic %s\015\012", auth); output(buf); snprintf(buf, BUFFER_SIZE, "User-Agent: %s-%s %s [%s] (%s)\015\012", "ez-update", VERSION, OS, (options & OPT_DAEMON) ? "daemon" : "", "by Angus Mackay"); output(buf); snprintf(buf, BUFFER_SIZE, "Host: %s\015\012", server); output(buf); snprintf(buf, BUFFER_SIZE, "\015\012"); output(buf); bp = buf; bytes = 0; btot = 0; while((bytes=read_input(bp, BUFFER_SIZE-btot)) > 0) { bp += bytes; btot += bytes; dprintf((stderr, "btot: %d\n", btot)); } close(client_sockfd); buf[btot] = '\0'; dprintf((stderr, "server output: %s\n", buf)); if(sscanf(buf, " HTTP/1.%*c %3d", &ret) != 1) { ret = -1; } switch(ret) { case -1: if(!(options & OPT_QUIET)) { show_message("strange server response, are you connecting to the right server?\n"); } return(UPDATERES_ERROR); break; case 200: if(!(options & OPT_QUIET)) { printf("request successful\n"); } break; case 401: if(!(options & OPT_QUIET)) { show_message("authentication failure\n"); } return(UPDATERES_SHUTDOWN); break; default: if(!(options & OPT_QUIET)) { // reuse the auth buffer *auth = '\0'; sscanf(buf, " HTTP/1.%*c %*3d %255[^\r\n]", auth); show_message("unknown return code: %d\n", ret); fprintf(stderr, "server response: %s\n", auth); } return(UPDATERES_ERROR); break; } return(UPDATERES_OK);}void DYNDNS_init(void){ if(options & OPT_DAEMON) { if(!(max_interval > 0)) { max_interval = DYNDNS_MAX_INTERVAL; } }}int DYNDNS_check_info(void){ char buf[BUFSIZ+1]; if((host == NULL) || (*host == '\0')) { if(options & OPT_DAEMON) { return(-1); } if(host) { free(host); } printf("host: "); *buf = '\0'; fgets(buf, BUFSIZ, stdin); host = strdup(buf); chomp(host); } if(address != NULL && !is_dotted_quad(address)) { fprintf(stderr, "the IP address \"%s\" is invalid\n", address); return(-1); } if(interface == NULL && address == NULL) { if(options & OPT_DAEMON) { fprintf(stderr, "you must provide either an interface or an address\n"); return(-1); } if(interface) { free(interface); } printf("interface: "); *buf = '\0'; fgets(buf, BUFSIZ, stdin); chomp(buf); option_handler(CMD_interface, buf); } warn_fields(service->fields_used); return 0;}int DYNDNS_update_entry(void){ char buf[BUFFER_SIZE+1]; char *bp = buf; int bytes; int btot; int ret; int retval = UPDATERES_OK; buf[BUFFER_SIZE] = '\0'; if(do_connect((int*)&client_sockfd, server, port) != 0) { if(!(options & OPT_QUIET)) { show_message("error connecting to %s:%s\n", server, port); } return(UPDATERES_ERROR); } snprintf(buf, BUFFER_SIZE, "GET %s?", request); output(buf); if(service->type == SERV_DYNDNS_STAT || service->type == SERV_QDNS_STAT) { snprintf(buf, BUFFER_SIZE, "%s=%s&", "system", "statdns"); output(buf); } snprintf(buf, BUFFER_SIZE, "%s=%s&", "hostname", host); output(buf); if(address != NULL) { snprintf(buf, BUFFER_SIZE, "%s=%s&", "myip", address); output(buf); } snprintf(buf, BUFFER_SIZE, "%s=%s&", "wildcard", wildcard ? "ON" : "OFF"); output(buf); if(mx != NULL && *mx != '\0') { snprintf(buf, BUFFER_SIZE, "%s=%s&", "mx", mx); output(buf); } //snprintf(buf, BUFFER_SIZE, "%s=%s&", "backmx", "NO"); //output(buf); if(options & OPT_OFFLINE) { snprintf(buf, BUFFER_SIZE, "%s=%s&", "offline", "yes"); output(buf); } snprintf(buf, BUFFER_SIZE, " HTTP/1.0\015\012"); output(buf); snprintf(buf, BUFFER_SIZE, "Authorization: Basic %s\015\012", auth); output(buf); snprintf(buf, BUFFER_SIZE, "User-Agent: %s-%s %s [%s] (%s)\015\012", "ez-update", VERSION, OS, (options & OPT_DAEMON) ? "daemon" : "", "by Angus Mackay"); output(buf); snprintf(buf, BUFFER_SIZE, "Host: %s\015\012", server); output(buf); snprintf(buf, BUFFER_SIZE, "\015\012"); output(buf); bp = buf; bytes = 0; btot = 0; while((bytes=read_input(bp, BUFFER_SIZE-btot)) > 0) { bp += bytes; btot += bytes; dprintf((stderr, "btot: %d\n", btot)); } close(client_sockfd); buf[btot] = '\0'; dprintf((stderr, "server output: %s\n", buf)); if(sscanf(buf, " HTTP/1.%*c %3d", &ret) != 1) { ret = -1; } switch(ret) { case -1: if(!(options & OPT_QUIET)) { show_message("strange server response, are you connecting to the right server?\n"); } retval = UPDATERES_ERROR; break; case 200: if(strstr(buf, "\ngood ") != NULL) { if(!(options & OPT_QUIET)) { printf("request successful\n"); } } else { if(strstr(buf, "\nnohost") != NULL) { show_message("invalid hostname: %s\n", host); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\nnotfqdn") != NULL) { show_message("malformed hostname: %s\n", host); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\n!yours") != NULL) { show_message("host \"%s\" is not under your control\n", host); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\nabuse") != NULL) { show_message("host \"%s\" has been blocked for abuse\n", host); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\nnochg") != NULL) { show_message("%s says that your IP address has not changed since the last update\n", server); // lets say that this counts as a successful update // but we'll roll back the last update time to max_interval/2 if(max_interval > 0) { last_update = time(NULL) - max_interval/2; } retval = UPDATERES_OK; } else if(strstr(buf, "\nbadauth") != NULL) { show_message("authentication failure\n"); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\nbadsys") != NULL) { show_message("invalid system parameter\n"); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\nbadagent") != NULL) { show_message("this useragent has been blocked\n"); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\nnumhost") != NULL) { show_message("Too many or too few hosts found\n"); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\ndnserr") != NULL) { char *p = strstr(buf, "\ndnserr"); show_message("dyndns internal error, please report this number to " "their support people: %s\n", N_STR(p)); retval = UPDATERES_ERROR; } else if(strstr(buf, "\n911") != NULL) { show_message("Ahhhh! call 911!\n"); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\n999") != NULL) { show_message("Ahhhh! call 999!\n"); retval = UPDATERES_SHUTDOWN; } else if(strstr(buf, "\n!donator") != NULL) { show_message("a feature requested is only available to donators, please donate.\n", host); retval = UPDATERES_OK; } // this one should be last as it is a stupid string to signify waits // with as it is so short else if(strstr(buf, "\nw") != NULL) { int howlong = 0; char *p = strstr(buf, "\nw"); char reason[256]; char mult;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -