11#include " config.h"
22
3+ #include < iostream>
4+ #include < string>
5+ #include < vector>
6+
37#include < dirent.h>
48#include < fcntl.h>
59#include < getopt.h>
6- #include <malloc.h>
7- #include <stdlib.h>
8- #include <string.h>
910#include < unistd.h>
1011#include < sys/stat.h>
12+ #include < cstring>
13+ #include < cstdlib>
14+
15+ extern " C" {
1116#include " lib.error.h"
1217#include " lib.misc.h"
18+ }
1319
1420#define PROGRAM " evict"
1521#define VERSION DOMJUDGE_VERSION " /" REVISION
@@ -30,27 +36,23 @@ struct option const long_opts[] = {
3036
3137void usage ()
3238{
33- printf ("\
34- Usage: %s [OPTION]... DIRECTORY\n\
35- Evicts all files in a directory tree from the kernel filesystem cache.\n\
36- \n\
37- -v, --verbose display some extra warnings and information\n\
38- --help display this help and exit\n\
39- --version output version information and exit\n\
40- \n" , progname );
39+ std::cout << " Usage: " << progname << " [OPTION]... DIRECTORY" << std::endl
40+ << " Evicts all files in a directory tree from the kernel filesystem cache." << std::endl << std::endl
41+ << " -v, --verbose display some extra warnings and information" << std::endl
42+ << " --help display this help and exit" << std::endl
43+ << " --version output version information and exit" << std::endl << std::endl;
4144 exit (0 );
4245}
4346
44- void evict_directory (char * dirname ) {
47+ void evict_directory (const std::string& dirname) {
4548 DIR *dir;
4649 struct dirent *entry;
47- int fd ;
48- char * entry_path ;
50+ int fd = -1 ;
4951 struct stat s;
5052
51- dir = opendir (dirname );
53+ dir = opendir (dirname. c_str () );
5254 if (dir != NULL ) {
53- if (be_verbose ) logmsg (LOG_INFO , "Evicting all files in directory: %s" , dirname );
55+ if (be_verbose) logmsg (LOG_INFO, " Evicting all files in directory: %s" , dirname. c_str () );
5456
5557 /* Read everything in the directory */
5658 while ( (entry = readdir (dir)) != NULL ) {
@@ -60,47 +62,47 @@ void evict_directory(char *dirname) {
6062 }
6163
6264 /* Construct the full file path */
63- entry_path = allocstr ( "%s/%s" , dirname , entry -> d_name ) ;
64- fd = open (entry_path , O_RDONLY , 0 );
65+ std::string entry_path = dirname + " / " + entry->d_name ;
66+ fd = open (entry_path. c_str () , O_RDONLY, 0 );
6567 if (fd == -1 ) {
66- warning (errno , "Unable to open file: %s" , entry_path );
67- goto entry_done ;
68+ warning (errno, " Unable to open file: %s" , entry_path. c_str () );
69+ continue ;
6870 }
6971
7072 if (fstat (fd, &s) < 0 ) {
71- if (be_verbose ) logerror (errno , "Unable to stat file/directory: %s\n" , entry_path );
72- goto entry_done ;
73+ if (be_verbose) logerror (errno, " Unable to stat file/directory: %s\n " , entry_path.c_str ());
74+ if ( close (fd)!=0 ) {
75+ warning (errno, " Unable to close file: %s" , entry_path.c_str ());
76+ }
77+ continue ;
7378 }
7479 if (S_ISDIR (s.st_mode )) {
7580 /* Recurse into subdirectories */
7681 evict_directory (entry_path);
7782 } else {
7883 /* evict this file from the cache */
7984 if (posix_fadvise (fd, 0 , 0 , POSIX_FADV_DONTNEED)) {
80- warning (errno , "Unable to evict file: %s\n" , entry_path );
85+ warning (errno, " Unable to evict file: %s\n " , entry_path. c_str () );
8186 } else {
82- if (be_verbose ) logmsg (LOG_DEBUG , "Evicted file: %s" , entry_path );
87+ if (be_verbose) logmsg (LOG_DEBUG, " Evicted file: %s" , entry_path. c_str () );
8388 }
8489 }
85- entry_done :
8690
87- if ( fd != -1 && close (fd )!= 0 ) {
88- warning (errno , "Unable to close file: %s" , entry_path );
91+ if ( close (fd)!=0 ) {
92+ warning (errno, " Unable to close file: %s" , entry_path. c_str () );
8993 }
90- free (entry_path );
9194 }
9295 if ( closedir (dir)!=0 ) {
93- warning (errno , "Unable to close directory: %s" , dirname );
96+ warning (errno, " Unable to close directory: %s" , dirname. c_str () );
9497 }
9598 } else {
96- warning (errno , "Unable to open directory: %s" , dirname );
99+ warning (errno, " Unable to open directory: %s" , dirname. c_str () );
97100 }
98101}
99102
100103int main (int argc, char *argv[])
101104{
102105 int opt;
103- char * dirname ;
104106
105107 progname = argv[0 ];
106108
@@ -129,11 +131,11 @@ int main(int argc, char *argv[])
129131
130132 if ( argc<=optind ) {
131133 logmsg (LOG_ERR, " no directory specified" );
132- return 0 ;
134+ return 1 ;
133135 }
134136
135137 /* directory to evict */
136- dirname = argv [optind ];
138+ std::string dirname = argv[optind];
137139
138140 evict_directory (dirname);
139141
0 commit comments