extern FileListObject AccessLog;
extern int PerUserLimitsNumber;
extern struct PerUserLimitStruct PerUserLimits[MAX_USER_LIMITS];
+extern enum PerUserFileCreationEnum PerUserFileCreation;
struct param_list
{
unsigned long int value;
};
+struct select_list
+{
+ //! The name of the value of the parameter.
+ const char *name;
+ //! The value to assign when the name is selected.
+ int value;
+};
+
static struct param_list report_type_values[]=
{
{"users_sites",REPORT_TYPE_USERS_SITES,0},
{"TIME",USER_SORT_TIME},
};
+static struct select_list per_user_limit_create_file[]=
+{
+ {"always",PUFC_Always}, //always create an empty file
+ {"as_required",PUFC_AsRequired}, //create the file if necessary (no empty file is created)
+};
+
static int is_param(const char *param,const char *buf)
{
int plen;
return(1);
}
+static int getparam_select(const char *param,struct select_list *options,int noptions,char *buf,int *value)
+{
+ int plen;
+ char *str;
+ int i;
+
+ plen=strlen(param);
+ if (strncmp(buf,param,plen) != 0) return(0);
+ buf+=plen;
+ if ((unsigned char)*buf>' ') return(0);
+ while (*buf && (unsigned char)*buf<=' ') buf++;
+
+ str=buf;
+ while (*buf && (unsigned char)*buf>' ' && *buf!=';') buf++;
+ *buf='\0';
+ for (i=0 ; i<noptions && strcasecmp(str,options[i].name) ; i++);
+ if (i>=noptions) {
+ debuga(_("Unknown value \"%s\" for parameter \"%s\"\n"),str,param);
+ exit(EXIT_FAILURE);
+ }
+ *value=options[i].value;
+ return(1);
+}
+
static int getparam_userlimit(const char *param,char *buf)
{
int plen;
{
char wbuf[2048];
struct getwordstruct gwarea;
+ int iVal;
while (*buf && (unsigned char)*buf<=' ') buf++;
if (getparam_userlimit("per_user_limit",buf)>0) return;
+ if (getparam_select("per_user_limit_file_create",SET_LIST(per_user_limit_create_file),buf,&iVal)>0) {
+ PerUserFileCreation=(enum PerUserFileCreationEnum)iVal;
+ return;
+ }
+
if (getparam_int("lastlog",buf,&LastLog)>0) return;
if (getparam_bool("remove_temp_files",buf,&RemoveTempFiles)>0) return;
int PerUserLimitsNumber=0;
//! Log user's who downloaded more than the limit.
struct PerUserLimitStruct PerUserLimits[MAX_USER_LIMITS];
+//! How to create a per user file.
+enum PerUserFileCreationEnum PerUserFileCreation=PUFC_Always;
extern struct globalstatstruct globstat;
sort_labels(&sort_field,&sort_order);
- for (i=0 ; i<PerUserLimitsNumber ; i++) {
- if (access(PerUserLimits[i].File,R_OK)==0 && unlink(PerUserLimits[i].File)==-1) {
- debuga(_("Cannot delete per_user_limit file \"%s\": %s"),PerUserLimits[i].File,
- strerror(errno));
- exit(EXIT_FAILURE);
- }
+ switch (PerUserFileCreation)
+ {
+ case PUFC_Always:
+ for (i=0 ; i<PerUserLimitsNumber ; i++) {
+ FILE *fp_usr=fopen(PerUserLimits[i].File,"wt");
+ if (fp_usr==NULL) {
+ debuga(_("Cannot create empty per_user_limit file \"%s\": %s"),PerUserLimits[i].File,
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ fclose(fp_usr);
+ }
+ break;
+
+ case PUFC_AsRequired:
+ for (i=0 ; i<PerUserLimitsNumber ; i++) {
+ if (access(PerUserLimits[i].File,R_OK)==0 && unlink(PerUserLimits[i].File)==-1) {
+ debuga(_("Cannot delete per_user_limit file \"%s\": %s"),PerUserLimits[i].File,
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ }
+ break;
}
uscan=userinfo_startscan();
if (limit>PerUserLimits[i].Limit && (user_limit[maskid] & mask)==0) {
FILE *fp_usr;
- if((fp_usr = fopen(PerUserLimits[i].File, "a")) == 0) {
+ if((fp_usr = fopen(PerUserLimits[i].File, "at")) == 0) {
debuga(_("(html10) Cannot open per user limit file %s: %s\n"),PerUserLimits[i].File,strerror(errno));
exit(EXIT_FAILURE);
}
int EndTime;
};
+/*!
+\brief How to handle the per_user_limit file creation.
+*/
+enum PerUserFileCreationEnum
+{
+ //! Purge the file if it exists or create an empty file.
+ PUFC_Always,
+ //! Delete old files and don't create a new file unless necessary.
+ PUFC_AsRequired
+};
+
/*!
\brief How to log every user crossing the download limit.
*/
#
#per_user_limit none
+# TAG: per_user_limit_file_create always/as_required
+# When to create a per_user_limit file.
+#
+# Use 'always' to always create the file requested by per_user_limit
+# even if it is empty.
+#
+# Use 'as_required' to create a per_user_limit file only if at least
+# one user crosses the limit.
+#
+#per_user_limit_file_create purge
+
# TAG: lastlog n
# How many reports files must be keept in reports directory.
# The oldest report file will be automatically removed.