⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ez-ipupdate.c

📁 Connect DDNS Client Use GNUDIP
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -