From 461b479d1c5896e0de728af95d5dbcbb87db7678 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Marchal?= Date: Fri, 3 Feb 2012 22:02:55 +0100 Subject: [PATCH] Sort the user's log just before using it It is cleaner to group the sorting with the code using it. Moreover, it is safer as we don't risk sorting a file that is not a user's file. The doxygen documentation of sort.c was included into the source file instead of keeping it in a separate file. --- datafile.c | 1 + documentation/sort.txt | 46 -------------------- include/defs.h | 2 +- log.c | 2 - report.c | 1 + sort.c | 96 +++++++++++++++++++++--------------------- 6 files changed, 51 insertions(+), 97 deletions(-) delete mode 100644 documentation/sort.txt diff --git a/datafile.c b/datafile.c index 3d5dabe..813966b 100644 --- a/datafile.c +++ b/datafile.c @@ -82,6 +82,7 @@ void data_file(char *tmp) user_find(uinfo->label,MAX_USER_LEN, u2); if(debug) debuga(_("Reading user file: %s/%s\n"),tmp,uinfo->filename); + sort_users_log(tmp,debug,uinfo); if (snprintf(tmp3,sizeof(tmp3),"%s/%s.log",tmp,uinfo->filename)>=sizeof(tmp3)) { debuga(_("(datafile) directory path too long: %s/%s.log\n"),tmp,uinfo->filename); exit(EXIT_FAILURE); diff --git a/documentation/sort.txt b/documentation/sort.txt deleted file mode 100644 index c72d19b..0000000 --- a/documentation/sort.txt +++ /dev/null @@ -1,46 +0,0 @@ -/*! \file sort.c -\brief Sort the temporary log files. -*/ - - - - -/*! \fn void tmpsort(void) -Sort all the \c utmp files form the temporary directory. The sort can be made according to the -number of connections, the accessed sites or the time of the access depending on the value of -::UserSortField. The sorting is either made in increasing or decreasing order as specified by -the value of ::UserSortOrder. -*/ - - - - - -/*! \fn void sort_users_log(const char *tmp, int debug) -The function sorts all the \c unsort files in the temporary directory. These files correspond -to the format described in \ref UserUnsortLog. - -\param tmp The temorary directory of the sarg files. -\param debug \c True to output debug information. - -The user's files are sorted by columns 5, 1 and 2 that are the columns of the number of bytes transfered, -the date of the access and the time of the access. - -The file with the downloads is sorted by columns 3, 1, 2 and 5 that are the columns of the user's ID, the -date, the time and the URL. - -In both cases, the sorted files are written in files with the extension \c log and the name of the unsorted -file without the \c unsort extension. The unsorted file is deleted just after the sorting. -*/ - - - - - -/*! \fn void sort_labels(const char **label,const char **order) -Get the internationalized text to display when reporting the sort criterion and order -of a user list. - -\param label A pointer to set to the string of the sort criterion name. -\param order A pointer to set to the string of the sort order name -*/ diff --git a/include/defs.h b/include/defs.h index 2eac061..0d59741 100755 --- a/include/defs.h +++ b/include/defs.h @@ -187,7 +187,7 @@ void siteuser(void); void smartfilter_report(void); // sort.c -void sort_users_log(const char *tmp, int debug); +void sort_users_log(const char *tmp, int debug,struct userinfostruct *uinfo); void tmpsort(const struct userinfostruct *uinfo); void sort_labels(const char **label,const char **order); diff --git a/log.c b/log.c index dda4dbe..585603f 100644 --- a/log.c +++ b/log.c @@ -1695,8 +1695,6 @@ int main(int argc,char *argv[]) } } - sort_users_log(tmp, debug); - if(DataFile[0] != '\0') data_file(tmp); else diff --git a/report.c b/report.c index 0ed0c9f..5249576 100644 --- a/report.c +++ b/report.c @@ -115,6 +115,7 @@ void gerarel(void) exit(EXIT_FAILURE); } while ((uinfo = userinfo_advancescan(uscan)) != NULL ) { + sort_users_log(tmp,debug,uinfo); if (snprintf(tmp3,sizeof(tmp3),"%s/%s.log",tmp,uinfo->filename)>=sizeof(tmp3)) { debuga(_("(report) directory entry too long: %s/%s.log\n"),tmp,uinfo->filename); exit(EXIT_FAILURE); diff --git a/sort.c b/sort.c index f082347..be8c71c 100644 --- a/sort.c +++ b/sort.c @@ -27,6 +27,12 @@ #include "include/conf.h" #include "include/defs.h" +/*! +Sort all the \c utmp files form the temporary directory. The sort can be made according to the +number of connections, the accessed sites or the time of the access depending on the value of +::UserSortField. The sorting is either made in increasing or decreasing order as specified by +the value of ::UserSortOrder. +*/ void tmpsort(const struct userinfostruct *uinfo) { int cstatus; @@ -87,69 +93,63 @@ void tmpsort(const struct userinfostruct *uinfo) return; } -void sort_users_log(const char *tmp, int debug) +/*! +The function sorts the \c unsort file in the temporary directory. These files correspond +to the format described in \ref UserUnsortLog. + +\param tmp The temorary directory of the sarg files. +\param debug \c True to output debug information. +\param uinfo The user whose log must be sorted. + +The user's files are sorted by columns 5, 1 and 2 that are the columns of the number of bytes transfered, +the date of the access and the time of the access. + +The sorted files are written in files with the extension \c log and the name of the unsorted +file without the \c unsort extension. The unsorted file is deleted just after the sorting. +*/ +void sort_users_log(const char *tmp, int debug,struct userinfostruct *uinfo) { - DIR *dirp; - struct dirent *direntp; char csort[MAXLEN]; - char user[MAXLEN]; - char wdname[MAXLEN]; + const char *user; int cstatus; - int dlen; int clen; - const char unsortext[]=".unsort"; if(debug) { - debuga(_("pre-sorting files\n")); + debuga(_("Sorting log %s/%s.unsort\n"),tmp,uinfo->filename); } - if ((dirp = opendir(tmp)) == NULL) { - debuga(_("Failed to open directory %s - %s\n"),tmp,strerror(errno)); + user=uinfo->filename; + clen=snprintf(csort,sizeof(csort),"sort -T \"%s\" -t \"\t\" -k 4,4 -k 1,1 -k 2,2 -o \"%s/%s.log\" \"%s/%s.unsort\"", + tmp, tmp, user, tmp, user); + if (clen>=sizeof(csort)) { + debuga(_("user name too long to sort %s\n"),csort); exit(EXIT_FAILURE); } - while ( (direntp = readdir( dirp )) != NULL ){ - dlen=strlen(direntp->d_name)-(sizeof(unsortext)-1); - if (dlen<0) continue; - if(strcmp(direntp->d_name+dlen,unsortext) != 0) - continue; - if(strcmp(direntp->d_name,"authfail.log.unsort") == 0) - continue; - if(strcmp(direntp->d_name,"download.unsort") == 0) - continue; - - if (dlen>0) { - if (dlen>=sizeof(user)) continue; - safe_strcpy(user,direntp->d_name,dlen+1); - } else { - user[0]='\0'; - } - - clen=snprintf(csort,sizeof(csort),"sort -T \"%s\" -t \"\t\" -k 4,4 -k 1,1 -k 2,2 -o \"%s/%s.log\" \"%s/%s.unsort\"", - tmp, tmp, user, tmp, user); - if (clen>=sizeof(csort)) { - debuga(_("user name too long to sort %s\n"),csort); - exit(EXIT_FAILURE); - } - cstatus=system(csort); - if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { - debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)); - debuga(_("sort command: %s\n"),csort); - exit(EXIT_FAILURE); - } - if (snprintf(wdname,sizeof(wdname),"%s/%s.unsort",tmp,user)>=sizeof(wdname)) { - debuga(_("user name too long for %s/%s.unsort\n"),tmp,user); - exit(EXIT_FAILURE); - } - if (unlink(wdname)) { - debuga(_("Cannot delete %s - %s\n"),wdname,strerror(errno)); - exit(EXIT_FAILURE); - } + cstatus=system(csort); + if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) { + debuga(_("sort command return status %d\n"),WEXITSTATUS(cstatus)); + debuga(_("sort command: %s\n"),csort); + exit(EXIT_FAILURE); + } + if (snprintf(csort,sizeof(csort),"%s/%s.unsort",tmp,user)>=sizeof(csort)) { + debuga(_("user name too long for %s/%s.unsort\n"),tmp,user); + exit(EXIT_FAILURE); + } + if (unlink(csort)) { + debuga(_("Cannot delete %s - %s\n"),csort,strerror(errno)); + exit(EXIT_FAILURE); } - (void)closedir( dirp ); return; } +/*! +Get the internationalized text to display when reporting the sort criterion and order +of a user list. + +\param label A pointer to set to the string of the sort criterion name. +\param order A pointer to set to the string of the sort order name +*/ void sort_labels(const char **label,const char **order) { if((UserSort & USER_SORT_CONNECT) != 0) { -- 2.47.2