📄 ez-ipupdate.c
字号:
// get time and reason if(strlen(p) >= 2) { sscanf(p, "%d%c %255[^\r\n]", &howlong, &mult, reason); if(mult == 'h') { howlong *= 3600; } else if(mult == 'm') { howlong *= 60; } if(howlong > MAX_WAITRESPONSE_WAIT) { howlong = MAX_WAITRESPONSE_WAIT; }; } else { sprintf(reason, "problem parsing reason for wait response"); } show_message("Wait response received, waiting for %d seconds before next update.\n", howlong); show_message("Wait response reason: %d\n", N_STR(reason)); sleep(howlong); retval = UPDATERES_ERROR; } else { show_message("error processing request\n"); if(!(options & OPT_QUIET)) { fprintf(stderr, "==== server output: ====\n%s\n", buf); } retval = UPDATERES_ERROR; } } break; case 401: if(!(options & OPT_QUIET)) { show_message("authentication failure\n"); } retval = 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); } retval = UPDATERES_ERROR; break; } return(retval);}int PGPOW_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(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 PGPOW_update_entry(void){ char buf[BUFFER_SIZE+1]; 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); } /* read server message */ if(PGPOW_read_response(buf) != 0) { show_message("strange server response, are you connecting to the right server?\n"); close(client_sockfd); return(UPDATERES_ERROR); } /* send version command */ snprintf(buf, BUFFER_SIZE, "VER %s [%s-%s %s (%s)]\015\012", PGPOW_VERSION, "ez-update", VERSION, OS, "by Angus Mackay"); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } /* send user command */ snprintf(buf, BUFFER_SIZE, "USER %s\015\012", user_name); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } /* send pass command */ snprintf(buf, BUFFER_SIZE, "PASS %s\015\012", password); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } /* send host command */ snprintf(buf, BUFFER_SIZE, "HOST %s\015\012", host); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } /* send oper command */ snprintf(buf, BUFFER_SIZE, "OPER %s\015\012", request); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } if(strcmp("update", request) == 0) { /* send ip command */ snprintf(buf, BUFFER_SIZE, "IP %s\015\012", address); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } } /* send done command */ snprintf(buf, BUFFER_SIZE, "DONE\015\012"); output(buf); if(PGPOW_read_response(buf) != 0) { if(strncmp("ERR", buf, 3) == 0) { show_message("error talking to server: %s\n", &(buf[3])); } else { show_message("error talking to server:\n\t%s\n", buf); } close(client_sockfd); return(UPDATERES_ERROR); } if(!(options & OPT_QUIET)) { printf("request successful\n"); } close(client_sockfd); return(UPDATERES_OK);}int DHS_check_info(void){ char buf[BUFSIZ+1]; if((host == NULL) || (*host == '\0')) { if(options & OPT_DAEMON) { return(-1); } if(host) { free(host); } printf("host: "); fgets(buf, BUFSIZ, stdin); host = strdup(buf); chomp(host); } 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;}/* * grrrrr, it seems that dhs.org requires us to use POST * also DHS doesn't update both the mx record and the address at the same * time, this service really stinks. go with justlinix.com (penguinpowered) * instead, the only advantage is short host names. */int DHS_update_entry(void){ char buf[BUFFER_SIZE+1]; char putbuf[BUFFER_SIZE+1]; char *bp = buf; int bytes; int btot; int ret; char *domain = NULL; char *hostname = NULL; char *p; int limit; int retval = UPDATERES_OK; buf[BUFFER_SIZE] = '\0'; putbuf[BUFFER_SIZE] = '\0'; /* parse apart the domain and hostname */ hostname = strdup(host); if((p=strchr(hostname, '.')) == NULL) { if(!(options & OPT_QUIET)) { show_message("error parsing hostname from host %s\n", host); } return(UPDATERES_ERROR); } *p = '\0'; p++; if(*p == '\0') { if(!(options & OPT_QUIET)) { show_message("error parsing domain from host %s\n", host); } return(UPDATERES_ERROR); } domain = strdup(p); dprintf((stderr, "hostname: %s, domain: %s\n", hostname, domain)); 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, "POST %s HTTP/1.0\015\012", request); 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); p = putbuf; *p = '\0'; limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "hostscmd=edit&hostscmdstage=2&type=4&"); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s&", "updatetype", "Online"); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s&", "ip", address); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s&", "mx", mx); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s&", "offline_url", url); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); if(cloak_title) { snprintf(p, limit, "%s=%s&", "cloak", "Y"); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s&", "cloak_title", cloak_title); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); } else { snprintf(p, limit, "%s=%s&", "cloak_title", ""); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); } snprintf(p, limit, "%s=%s&", "submit", "Update"); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s&", "domain", domain); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "%s=%s", "hostname", hostname); p += strlen(p); limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(buf, BUFFER_SIZE, "Content-length: %d\015\012", strlen(putbuf)); output(buf); snprintf(buf, BUFFER_SIZE, "\015\012"); output(buf); output(putbuf); 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(!(options & OPT_QUIET)) { printf("request successful\n"); } break; case 401: if(!(options & OPT_QUIET)) { show_message("authentication failure\n"); } retval = 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); show_message("server response: %s\n", auth); } retval = UPDATERES_ERROR; break; } // this stupid service requires us to do seperate request if we want to // update the mail exchanger (mx). grrrrrr if(*mx != '\0') { // okay, dhs's service is incredibly stupid and will not work with two // requests right after each other. I could care less that this is ugly, // I personally will NEVER use dhs, it is laughable. sleep(DHS_SUCKY_TIMEOUT < timeout.tv_sec ? DHS_SUCKY_TIMEOUT : timeout.tv_sec); 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, "POST %s HTTP/1.0\015\012", request); 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); p = putbuf; *p = '\0'; limit = BUFFER_SIZE - 1 - strlen(buf); snprintf(p, limit, "hostscmd=edit&hostscmdstage=2&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -