rredir.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:3k
- /* $Id: rredir.c,v 1.3 1996/09/14 16:54:47 wessels Exp $ */
- /*
- * From: richard@hekkihek.hacom.nl (Richard Huveneers)
- * To: squid-users@nlanr.net
- * Subject: Save 15% on your bandwidth...
- * Date: 12 Sep 1996 21:21:55 GMT
- * ===========================================================================
- *
- * I have downloaded the multi-megabyte files from Netscape and Microsoft
- * that our users like to download from every mirror in the world,
- * defeating the usual caching.
- *
- * I put these files in a separate directory and installed a basic
- * redirector for Squid that checks if the file (so hostname and pathname
- * are disregarded) is present in this directory.
- *
- * After a few days of testing (the redirector looks very stable) it looks
- * like this is saving us approx. 15% on our cache flow. Also, our own WWW
- * server has become more popular than ever :)
- *
- * I'm sure this code will be useful to others too, so I've attached it at
- * the end of this message. Improvements, extensions etc. are welcome.
- *
- * I'm going on holidays now, so I won't be able to respond to e-mail
- * quickly.
- *
- * Enjoy, Richard.
- */
- /*
- * rredir - redirect to local directory
- *
- * version 0.1, 7 sep 1996
- * - initial version (Richard Huveneers <Richard.Huveneers@hekkihek.hacom.nl>)
- */
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <ctype.h>
- #define ACCESS_LOCAL_DIR "/var/lib/httpd/htdocs/local/rredir"
- #define REDIRECT_TO_URL "http://www.hacom.nl/local/rredir"
- #define BUFFER_SIZE (16*1024)
- int
- main()
- {
- char buf[BUFFER_SIZE];
- char *s, *t;
- int tlu = 0;
- /* make standard output line buffered */
- if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
- return 1;
- /* speed up the access() calls below */
- if (chdir(ACCESS_LOCAL_DIR) == -1)
- return 1;
- /* scan standard input */
- while (fgets(buf, BUFFER_SIZE, stdin) != NULL) {
- /* check for too long urls */
- if (strchr(buf, 'n') == NULL) {
- tlu = 1;
- continue;
- }
- if (tlu)
- goto dont_redirect;
- /* determine end of url */
- if ((s = strchr(buf, ' ')) == NULL)
- goto dont_redirect;
- *s = ' ';
- /* determine first character of filename */
- if ((s = strrchr(buf, '/')) == NULL)
- goto dont_redirect;
- s++;
- /* security: do not redirect to hidden files, the current
- * ** directory or the parent directory */
- if (*s == '.' || *s == ' ')
- goto dont_redirect;
- /* map filename to lower case */
- for (t = s; *t != ' '; t++)
- *t = (char) tolower((int) *t);
- /* check for a local copy of this file */
- if (access(s, R_OK) == 0) {
- (void) printf("%s/%sn", REDIRECT_TO_URL, s);
- continue;
- }
- dont_redirect:
- tlu = 0;
- (void) printf("n");
- }
- return 0;
- }