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

代理服务器

开发平台:

Unix_Linux

  1. /* $Id: rredir.c,v 1.3 1996/09/14 16:54:47 wessels Exp $ */
  2. /*
  3.  * From:    richard@hekkihek.hacom.nl (Richard Huveneers)
  4.  * To:      squid-users@nlanr.net
  5.  * Subject: Save 15% on your bandwidth...
  6.  * Date:    12 Sep 1996 21:21:55 GMT
  7.  * ===========================================================================
  8.  * 
  9.  * I have downloaded the multi-megabyte files from Netscape and Microsoft
  10.  * that our users like to download from every mirror in the world,
  11.  * defeating the usual caching.
  12.  * 
  13.  * I put these files in a separate directory and installed a basic
  14.  * redirector for Squid that checks if the file (so hostname and pathname
  15.  * are disregarded) is present in this directory.
  16.  * 
  17.  * After a few days of testing (the redirector looks very stable) it looks
  18.  * like this is saving us approx. 15% on our cache flow. Also, our own WWW
  19.  * server has become more popular than ever :)
  20.  * 
  21.  * I'm sure this code will be useful to others too, so I've attached it at
  22.  * the end of this message. Improvements, extensions etc. are welcome.
  23.  * 
  24.  * I'm going on holidays now, so I won't be able to respond to e-mail
  25.  * quickly.
  26.  * 
  27.  * Enjoy, Richard.
  28.  */
  29. /*
  30.  * rredir - redirect to local directory
  31.  * 
  32.  * version 0.1, 7 sep 1996
  33.  * - initial version (Richard Huveneers <Richard.Huveneers@hekkihek.hacom.nl>)
  34.  */
  35. #include <stdio.h>
  36. #include <unistd.h>
  37. #include <string.h>
  38. #include <ctype.h>
  39. #define ACCESS_LOCAL_DIR        "/var/lib/httpd/htdocs/local/rredir"
  40. #define REDIRECT_TO_URL         "http://www.hacom.nl/local/rredir"
  41. #define BUFFER_SIZE             (16*1024)
  42. int
  43. main()
  44. {
  45.     char buf[BUFFER_SIZE];
  46.     char *s, *t;
  47.     int tlu = 0;
  48.     /* make standard output line buffered */
  49.     if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
  50. return 1;
  51.     /* speed up the access() calls below */
  52.     if (chdir(ACCESS_LOCAL_DIR) == -1)
  53. return 1;
  54.     /* scan standard input */
  55.     while (fgets(buf, BUFFER_SIZE, stdin) != NULL) {
  56. /* check for too long urls */
  57. if (strchr(buf, 'n') == NULL) {
  58.     tlu = 1;
  59.     continue;
  60. }
  61. if (tlu)
  62.     goto dont_redirect;
  63. /* determine end of url */
  64. if ((s = strchr(buf, ' ')) == NULL)
  65.     goto dont_redirect;
  66. *s = '';
  67. /* determine first character of filename */
  68. if ((s = strrchr(buf, '/')) == NULL)
  69.     goto dont_redirect;
  70. s++;
  71. /* security: do not redirect to hidden files, the current
  72.  * ** directory or the parent directory */
  73. if (*s == '.' || *s == '')
  74.     goto dont_redirect;
  75. /* map filename to lower case */
  76. for (t = s; *t != ''; t++)
  77.     *t = (char) tolower((int) *t);
  78. /* check for a local copy of this file */
  79. if (access(s, R_OK) == 0) {
  80.     (void) printf("%s/%sn", REDIRECT_TO_URL, s);
  81.     continue;
  82. }
  83.       dont_redirect:
  84. tlu = 0;
  85. (void) printf("n");
  86.     }
  87.     return 0;
  88. }