diff -Naur ez-ipupdate-3.0.11b7/ez-ipupdate.c ez-ipupdate-3.0.11b7-sr1/ez-ipupdate.c --- ez-ipupdate-3.0.11b7/ez-ipupdate.c 2002-03-12 01:31:47.000000000 +0200 +++ ez-ipupdate-3.0.11b7-sr1/ez-ipupdate.c 2006-10-08 17:51:40.000000000 +0200 @@ -103,6 +103,11 @@ #define HEIPV6TB_DEFAULT_PORT "80" #define HEIPV6TB_REQUEST "/index.cgi" +#define EVERYDNS_DEFAULT_SERVER "dyn.everydns.net" +#define EVERYDNS_DEFAULT_PORT "80" +#define EVERYDNS_REQUEST "/index.php" +#define EVERYDNS_VERSION "0.1" + #define DEFAULT_TIMEOUT 120 #define DEFAULT_UPDATE_PERIOD 120 #define DEFAULT_RESOLV_PERIOD 30 @@ -341,6 +346,10 @@ int HEIPV6TB_check_info(void); static char *HEIPV6TB_fields_used[] = { "server", "user", NULL }; +int EVERYDNS_update_entry(void); +int EVERYDNS_check_info(void); +static char *EVERYDNS_fields_used[] = { "server", "user", "host", "address", NULL }; + struct service_t services[] = { { "NULL", { "null", "NULL", 0, }, @@ -514,6 +523,16 @@ HEIPV6TB_DEFAULT_PORT, HEIPV6TB_REQUEST }, + { "everydns", + { "everydns", 0, 0, }, + NULL, + EVERYDNS_update_entry, + EVERYDNS_check_info, + EVERYDNS_fields_used, + EVERYDNS_DEFAULT_SERVER, + EVERYDNS_DEFAULT_PORT, + EVERYDNS_REQUEST + }, }; static struct service_t *service = NULL; @@ -4246,6 +4265,165 @@ return(UPDATERES_OK); } +int EVERYDNS_check_info(void) +{ + warn_fields(service->fields_used); + + return 0; +} + +int EVERYDNS_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?ver=%s&", request, EVERYDNS_VERSION); + output(buf); + if(address) + { + snprintf(buf, BUFFER_SIZE, "%s=%s&", "ip", address); + output(buf); + } + if((host != NULL) && (*host == '\0')) + { + snprintf(buf, BUFFER_SIZE, "%s=%s&", "domain", 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) + { + char *p; + + 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: + ret = -1; + if((p=strstr(buf, "Exit code: ")) != NULL) + { + sscanf(p, "Exit code: %d", &ret); + } + + /* + * 0 - Successfully Updated + */ + 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 0: + if(!(options & OPT_QUIET)) + { + printf("request successful\n"); + } + break; + + case 2: + if(!(options & OPT_QUIET)) + { + show_message("Bad Username/password\n"); + } + return(UPDATERES_SHUTDOWN); + break; + + case 5: + if(!(options & OPT_QUIET)) + { + show_message("Last update too recent, please wait...\n"); + } + return(UPDATERES_ERROR); + break; + + default: + if(!(options & OPT_QUIET)) + { + show_message("unknown return code: %d\n", ret); + fprintf(stderr, "server response: %s\n", buf); + } + return(UPDATERES_ERROR); + break; + } + 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); +} + static int is_in_list(char *needle, char **haystack) { char **p;