cgivars.c
上传用户:sxdewei
上传日期:2014-06-02
资源大小:67k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* cgivars.c
  2.  * (C) Copyright 2000, Moreton Bay (http://www.moretonbay.com).
  3.  * see HTTP (www.w3.org) and RFC
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include "cgivars.h"
  10. /* local function prototypes */
  11. char hex2char(char *hex);
  12. void unescape_url(char *url);
  13. char x2c(char *what);
  14. /* hex2char */
  15. /* RFC */
  16. char hex2char(char *hex) {
  17. char char_value;
  18. char_value = (hex[0] >= 'A' ? ((hex[0] & 0xdf) - 'A') + 10 : (hex[0] - '0'));
  19. char_value *= 16;
  20. char_value += (hex[1] >= 'A' ? ((hex[1] & 0xdf) - 'A') + 10 : (hex[1] - '0'));
  21. return char_value;
  22. }
  23. /* unescape_url */
  24. /* RFC */
  25. void unescape_url(char *url) {
  26. int n, k;
  27. for(n=0, k=0;url[k];++n, ++k) {
  28. if((url[n] = url[k]) == '%') {
  29. url[n] = hex2char(&url[k+1]);
  30. k += 2;
  31. }
  32. }
  33. url[n] = '';
  34. }
  35. /* getRequestMethod
  36.  * retn: from_method (GET or POST) on success,
  37.  * -1 on failure.  */
  38. int getRequestMethod() {
  39. char *request_method;
  40. int form_method;
  41. request_method = getenv("REQUEST_METHOD");
  42. if(request_method == NULL)
  43. return -1;
  44. if (!strcmp(request_method, "GET") || !strcmp(request_method, "HEAD") ) {
  45. form_method = GET;
  46. } else if (!strcmp(request_method, "POST")) {
  47. form_method = POST;
  48. } else {
  49. /* wtf was it then?!! */
  50. return -1;
  51. }
  52. return form_method;
  53. }
  54. /* getGETvars
  55.  * retn: getvars */
  56. char **getGETvars() {
  57. int i;
  58. char **getvars;
  59. char *getinput;
  60. char **pairlist;
  61. int paircount = 0;
  62. char *nvpair;
  63. char *eqpos;
  64. getinput = getenv("QUERY_STRING");
  65. if (getinput)
  66. getinput = strdup(getinput);
  67. //DEBUGMSG(1, ("gin=%sn", getinput));
  68. /* Change all plusses back to spaces */
  69.     for(i=0; getinput && getinput[i]; i++)
  70. if(getinput[i] == '+')
  71. getinput[i] = ' ';
  72.     pairlist = (char **) malloc(256*sizeof(char **));
  73. paircount = 0;
  74.     nvpair = getinput ? strtok(getinput, "&") : NULL;
  75. while (nvpair) {
  76. pairlist[paircount++]= strdup(nvpair);
  77.          if(!(paircount%256))
  78. pairlist = (char **) realloc(pairlist,(paircount+256)*sizeof(char **));
  79.         nvpair = strtok(NULL, "&");
  80. }
  81.     pairlist[paircount] = 0;
  82.     getvars = (char **) malloc((paircount*2+1)*sizeof(char **));
  83. for (i= 0; i<paircount; i++) {
  84. if(eqpos=strchr(pairlist[i], '=')) {
  85.              *eqpos = '';
  86.              unescape_url(getvars[i*2+1] = strdup(eqpos+1));
  87.          } else {
  88. unescape_url(getvars[i*2+1] = strdup(""));
  89.          }
  90. unescape_url(getvars[i*2] = strdup(pairlist[i]));
  91.      }
  92.     getvars[paircount*2] = 0;
  93.      for(i=0;pairlist[i];i++)
  94. free(pairlist[i]);
  95. free(pairlist);
  96. if (getinput)
  97. free(getinput);
  98. return getvars;
  99. }
  100. /* getPOSTvars
  101.  * retn: postvars */
  102. char **getPOSTvars() {
  103. int i;
  104. int content_length;
  105. char **postvars;
  106. char *postinput;
  107. char **pairlist;
  108. int paircount = 0;
  109. char *nvpair;
  110. char *eqpos;
  111. postinput = getenv("CONTENT_LENGTH");
  112. if (!postinput)
  113. exit(1);
  114. if(!(content_length = atoi(postinput)))
  115. exit(1);
  116. if(!(postinput = (char *) malloc(content_length+1)))
  117. exit(1);
  118. if (!fread(postinput, content_length, 1, stdin))
  119. exit(1);
  120. postinput[content_length] = '';
  121. //DEBUGMSG(1, ("pin=%sn", postinput));
  122.     for(i=0;postinput[i];i++)
  123. if(postinput[i] == '+')
  124. postinput[i] = ' ';
  125. pairlist = (char **) malloc(256*sizeof(char **));
  126. paircount = 0;
  127. nvpair = strtok(postinput, "&");
  128. while (nvpair) {
  129. pairlist[paircount++] = strdup(nvpair);
  130. if(!(paircount%256))
  131.      pairlist = (char **) realloc(pairlist, (paircount+256)*sizeof(char **));
  132. nvpair = strtok(NULL, "&");
  133. }
  134.     
  135. pairlist[paircount] = 0;
  136. postvars = (char **) malloc((paircount*2+1)*sizeof(char **));
  137. for(i = 0;i<paircount;i++) {
  138.          if(eqpos = strchr(pairlist[i], '=')) {
  139.              *eqpos= '';
  140.          unescape_url(postvars[i*2+1] = strdup(eqpos+1));
  141.          } else {
  142.              unescape_url(postvars[i*2+1] = strdup(""));
  143.     }
  144.          unescape_url(postvars[i*2]= strdup(pairlist[i]));
  145. }
  146. postvars[paircount*2] = 0;
  147. for(i=0;pairlist[i];i++)
  148. free(pairlist[i]);
  149. free(pairlist);
  150. free(postinput);
  151. return postvars;
  152. }
  153. /* cleanUp
  154.  * free the mallocs */
  155. int cleanUp(int form_method, char **getvars, char **postvars) {
  156. int i;
  157. if (postvars) {
  158. for(i=0;postvars[i];i++)
  159. free(postvars[i]);
  160. free(postvars);
  161. }
  162. if (getvars) {
  163. for(i=0;getvars[i];i++)
  164. free(getvars[i]);
  165. free(getvars);
  166. }
  167. return 0;
  168. }
  169. void adminCheck(){
  170.  char * userName = NULL;
  171.  char * errPage = "Location: UnauthorizedError.htmnn";
  172.  userName = getenv("REMOTE_USER");
  173.    if(userName == NULL)  goto err;
  174.     
  175.  if(!strcmp("admin",userName))
  176. {
  177.       return;
  178. }
  179. err:    printf("%sn",errPage);
  180.     fflush(stdout);
  181.     exit(0);
  182. }