ftp_proxy.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:3k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** ftp_proxy.c
  3. **
  4. ** Copyright (c) 1995 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <alloca.h>
  23. #include "phttpd.h"
  24. int pm_init(const char **argv)
  25. {
  26.     const char *name = argv[0];
  27.     
  28.     if (debug > 1)
  29. fprintf(stderr, "ftp_proxy: pm_init("%s")n", name);
  30.     return 0;
  31. }
  32. void pm_exit(void)
  33. {
  34.     if (debug > 1)
  35. fprintf(stderr, "ftp_proxy: pm_exit()n");
  36. }
  37. static int get_rq(char *in_url,
  38.   char **host,
  39.   char **port,
  40.   char **out_url)
  41. {
  42.     char *cp;
  43.     
  44.     if (strncmp(in_url, "ftp://", 6) != 0)
  45. return -1;
  46.     cp = in_url+6;
  47.     *host = cp;
  48.     while (*cp && !(*cp == '/' || *cp == ':'))
  49. ++cp;
  50.     if (*cp == 0)
  51. return 1;
  52.     if (*cp == ':')
  53.     {
  54. *cp++ = '';
  55. *port = cp;
  56. while (*cp && *cp != '/')
  57.     ++cp;
  58. if (*cp == 0)
  59.     return 2;
  60.     }
  61.     
  62.     *cp++ = '';
  63.     *out_url = cp;
  64.     return 3;
  65. }
  66. int pm_request(struct connectioninfo *cip)
  67. {
  68.     struct httpinfo *hip;
  69.     char *tmp, *host, *port, *url;
  70.     int sock_fd, result, fd, tmpsize;
  71.     fd = cip->fd;
  72.     host = port = url = NULL;
  73.     
  74.     hip = cip->hip;
  75.      
  76.     if (debug > 1)
  77.     {
  78. fprintf(stderr, "ftp_proxy: pm_request()n");
  79. fprintf(stderr, "thip->method = %sn", hip->method);
  80. fprintf(stderr, "thip->url = %sn", hip->url);
  81.     }
  82.     tmpsize = strlen(hip->url)+1;
  83.     tmp = (char *) alloca(tmpsize);
  84.     s_strcpy(tmp, tmpsize, hip->url);
  85.     
  86.     if (get_rq(tmp, &host, &port, &url) < 0)
  87.     {
  88. if (debug > 2)
  89.     fprintf(stderr, "get_rq(): Failedn");
  90. goto Fail;
  91.     }
  92.     if (debug > 2)
  93. fprintf(stderr, "get_rq(), host=%s, port=%s, url=%sn",
  94. host ? host : "<null>",
  95. port ? port : "<null>",
  96. url ? url : "<null>");
  97. /* XXX should probably check if this is ourself we are connecting to... */
  98.     
  99.     sock_fd = fd_sconnect(host, port ? port : "21");
  100.     if (sock_fd < 0)
  101.     {
  102. if (debug > 2)
  103.     fprintf(stderr, "fd_sconnect("%s") failedn", host);
  104. goto Fail;
  105.     }
  106.     if (debug > 4)
  107. fprintf(stderr, "Ftp query: %sn", url+1);
  108.     result = 200;
  109.     if (hip->mip)
  110. http_sendheaders(fd, cip, result, NULL);
  111.     fd_puts("Content-Type: text/htmlnn", fd);
  112.     html_sysheader(fd, "H2", "Ftp Connection");
  113.     fd_puts("Sorry, FTP Proxying is not yet implemented.n", fd);
  114.     html_sysfooter(fd);
  115.     
  116.     if (debug > 4)
  117. fprintf(stderr, "ftp_proxy: closing downn");
  118.     
  119.     fd_close(sock_fd);
  120.     return 200;
  121.     
  122.   Fail:
  123.     return -1;
  124. }