+/*
+ * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
// Author: Jens-S. V?ckler <voeckler@rvs.uni-hannover.de>
//
// File: purge.cc
// Initial revision
//
//
-#if (defined(__GNUC__) || defined(__GNUG__)) && !defined(__clang__)
-#pragma implementation
-#endif
-
#include "squid.h"
#include "util.h"
-#include <stdarg.h>
-#include <stdio.h>
+#include <cerrno>
+#include <climits>
+#include <csignal>
+#include <cstdarg>
+#include <cstdlib>
+#include <cstring>
#include <dirent.h>
-#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <signal.h>
-#include <errno.h>
#if HAVE_SIGINFO_H
#include <siginfo.h>
#include <arpa/inet.h>
#include <netdb.h>
+#include "conffile.hh"
#include "convert.hh"
-#include "socket.hh"
+#include "copyout.hh"
#include "signal.hh"
+#include "socket.hh"
#include "squid-tlv.hh"
-#include "copyout.hh"
-#include "conffile.hh"
#ifndef DEFAULTHOST
#define DEFAULTHOST "localhost"
char* linebuffer = 0;
size_t buffersize = 128*1024;
static char* copydir = 0;
-static unsigned debugFlag = 0;
+static uint32_t debugFlag = 0;
static unsigned purgeMode = 0;
static bool iamalive = false;
static bool reminder = false;
};
REList::REList( const char* what, bool doCase )
- :next(0),data(xstrdup(what))
+ :next(0),data(xstrdup(what))
{
int result = regcomp( &rexp, what,
REG_EXTENDED | REG_NOSUB | (doCase ? 0 : REG_ICASE) );
const char* fn, const char* url, const SquidMetaList& meta )
// purpose: if cmdline-requested, send the purge request to the cache
// paramtr: fd (IN): open FD for the object file
-// metasize (IN): offset into data portion of file (meta data size)
+// metasize (IN): offset into data portion of file (meta data size)
// fn (IN): name of the object file
// url (IN): URL string stored in the object file
-// meta (IN): list containing further meta data
+// meta (IN): list containing further meta data
// returns: true for a successful action, false otherwise. The action
// may just print the file, send the purge request or even
// remove unwanted files.
return false;
}
- int size = strlen(buffer);
- if ( write( sockfd, buffer, size ) != size ) {
+ int content_size = strlen(buffer);
+ if ( write( sockfd, buffer, content_size ) != content_size ) {
// error while talking to squid
fprintf( stderr, "unable to talk to server: %s\n", strerror(errno) );
close(sockfd);
}
int
-checkForPortOnly( const char* optarg )
+checkForPortOnly( const char* arg )
// purpose: see if somebody just put in a port instead of a hostname
// paramtr: optarg (IN): argument from commandline
// returns: 0..65535 is the valid port number in network byte order,
// -1 if not a port
{
// if there is a period in there, it must be a valid hostname
- if ( strchr( optarg, '.' ) != 0 ) return -1;
+ if ( strchr( arg, '.' ) != 0 ) return -1;
// if it is just a number between 0 and 65535, it must be a port
char* errstr = 0;
- unsigned long result = strtoul( optarg, &errstr, 0 );
- if ( result < 65536 && errstr != optarg ) return htons(result);
+ unsigned long result = strtoul( arg, &errstr, 0 );
+ if ( result < 65536 && errstr != arg ) return htons(result);
#if 0
// one last try, test for a symbolical service name
- struct servent* service = getservbyname( optarg, "tcp" );
+ struct servent* service = getservbyname( arg, "tcp" );
return service ? service->s_port : -1;
#else
return -1;
" -a\tdisplay a little rotating thingy to indicate that I am alive (tty only).\n"
" -c c\tsquid.conf location, default \"%s\".\n"
" -C dir\tbase directory for content extraction (copy-out mode).\n"
- " -d l\tdebug level, an OR of different debug options.\n"
+ " -d l\tdebug level, an OR mask of different debug options.\n"
" -e re\tsingle regular expression per -e instance (use quotes!).\n"
" -E re\tsingle case sensitive regular expression like -e.\n"
" -f fn\tname of textfile containing one regular expression per line.\n"
void
parseCommandline( int argc, char* argv[], REList*& head,
- char*& conffile, char*& copydir,
- struct in_addr& serverHost, unsigned short& serverPort )
+ char*& conffile, char*& copyDirPath,
+ struct in_addr& serverHostIp, unsigned short& serverHostPort )
// paramtr: argc: see ::main().
// argv: see ::main().
// returns: Does terminate the program on errors!
break;
case 'C':
if ( optarg && *optarg ) {
- if ( copydir ) xfree( (void*) copydir );
- copydir = xstrdup(optarg);
- assert(copydir);
+ if ( copyDirPath ) xfree( (void*) copyDirPath );
+ copyDirPath = xstrdup(optarg);
+ assert(copyDirPath);
}
break;
case 'c':
- if ( optarg && *optarg ) {
- if ( *conffile ) xfree((void*) conffile);
- conffile = xstrdup(optarg);
- assert(conffile);
+ if ( !optarg || !*optarg ) {
+ fprintf( stderr, "%c requires a regex pattern argument!\n", option );
+ exit(1);
}
+ if ( *conffile ) xfree((void*) conffile);
+ conffile = xstrdup(optarg);
+ assert(conffile);
break;
case 'd':
- ::debugFlag = strtoul( optarg, 0, 0 );
+ if ( !optarg || !*optarg ) {
+ fprintf( stderr, "%c expects a mask parameter. Debug disabled.\n", option );
+ ::debugFlag = 0;
+ } else
+ ::debugFlag = (strtoul(optarg, NULL, 0) & 0xFFFFFFFF);
break;
case 'E':
case 'e':
- if ( head == 0 ) tail = head = new REList( optarg, option=='E' );
+ if ( !optarg || !*optarg ) {
+ fprintf( stderr, "%c requires a regex pattern argument!\n", option );
+ exit(1);
+ }
+ if ( head == 0 )
+ tail = head = new REList( optarg, option=='E' );
else {
tail->next = new REList( optarg, option=='E' );
tail = tail->next;
break;
case 'f':
+ if ( !optarg || !*optarg ) {
+ fprintf( stderr, "%c requires a filename argument!\n", option );
+ exit(1);
+ }
if ( (rfile = fopen( optarg, "r" )) != NULL ) {
unsigned long lineno = 0;
#define LINESIZE 512
::no_fork = ! ::no_fork;
break;
case 'p':
+ if ( !optarg || !*optarg ) {
+ fprintf( stderr, "%c requires a port argument!\n", option );
+ exit(1);
+ }
colon = strchr( optarg, ':' );
if ( colon == 0 ) {
// no colon, only look at host
port = checkForPortOnly( optarg );
if ( port == -1 ) {
// assume that main() did set the default port
- if ( convertHostname(optarg,serverHost) == -1 ) {
+ if ( convertHostname(optarg,serverHostIp) == -1 ) {
fprintf( stderr, "unable to resolve host %s!\n", optarg );
exit(1);
}
} else {
// assume that main() did set the default host
- serverPort = port;
+ serverHostPort = port;
}
} else {
// colon used, port is extra
*colon = 0;
++colon;
- if ( convertHostname(optarg,serverHost) == -1 ) {
+ if ( convertHostname(optarg,serverHostIp) == -1 ) {
fprintf( stderr, "unable to resolve host %s!\n", optarg );
exit(1);
}
- if ( convertPortname(colon,serverPort) == -1 ) {
+ if ( convertPortname(colon,serverHostPort) == -1 ) {
fprintf( stderr, "unable to resolve port %s!\n", colon );
exit(1);
}
}
break;
case 'P':
+ if ( !optarg || !*optarg ) {
+ fprintf( stderr, "%c requires a mode argument!\n", option );
+ exit(1);
+ }
::purgeMode = ( strtol( optarg, 0, 0 ) & 0x07 );
break;
case 's':
assert( head != 0 );
// make sure that the copy out directory is there and accessible
- if ( copydir && *copydir )
- if ( assert_copydir( copydir ) != 0 ) exit(1);
+ if ( copyDirPath && *copyDirPath )
+ if ( assert_copydir( copyDirPath ) != 0 ) exit(1);
// show results
if ( showme ) {
puts( ::verbose ? " + extra verbosity" : "" );
printf( "# Copy-out directory: %s ",
- copydir ? copydir : "copy-out mode disabled" );
- if ( copydir )
+ copyDirPath ? copyDirPath : "copy-out mode disabled" );
+ if ( copyDirPath )
printf( "(%s HTTP header)\n", ::envelope ? "prepend" : "no" );
else
puts("");
printf( "# Squid config file : %s\n", conffile );
printf( "# Cacheserveraddress: %s:%u\n",
- inet_ntoa( serverHost ), ntohs( serverPort ) );
+ inet_ntoa( serverHostIp ), ntohs( serverHostPort ) );
printf( "# purge mode : 0x%02x\n", ::purgeMode );
printf( "# Regular expression: " );
delete list;
return 0;
}
+