void htmlrel(void)
{
- FILE *fp_in, *fp_ou, *fp_ip, *fp_ip2, *fp_usr;
+ FILE *fp_in, *fp_ou, *fp_ip, *fp_ip2;
long long int nnbytes=0, unbytes=0, tnbytes=0, totbytes=0, totbytes2=0;
long long int totelap=0, totelap2=0, nnelap=0, unelap=0, tnelap=0;
char siteind[MAX_TRUNCATED_URL];
struct getwordstruct gwarea;
longline line,line1;
- const struct userinfostruct *uinfo;
+ struct userinfostruct *uinfo;
userscan uscan;
if (snprintf(tmp2,sizeof(tmp2),"%s/sargtmp.int_unsort",tmp)>=sizeof(tmp2)) {
fputs("</tr>\n",fp_ou);
}
- if(PerUserLimit > 0) {
- if(tnbytes > (PerUserLimit*1000000)) {
- limit_flag=0;
- if(access(PerUserLimitFile, R_OK) == 0) {
- if((fp_usr = fopen(PerUserLimitFile, "r")) == 0) {
- debuga(_("(html9) Cannot open file %s: %s\n"),PerUserLimitFile,strerror(errno));
- exit(EXIT_FAILURE);
- }
- while(fgets(tmp6,sizeof(tmp6),fp_usr)!=NULL) {
- fixendofline(tmp6);
- if(strcmp(tmp6,uinfo->label) == 0) {
- limit_flag=1;
- break;
- }
- }
- fclose(fp_usr);
- }
+ if (PerUserLimit > 0 && (int)(tnbytes/1000000LLU) > PerUserLimit && !uinfo->user_limit) {
+ FILE *fp_usr;
- if(!limit_flag) {
- if((fp_usr = fopen(PerUserLimitFile, "a")) == 0) {
- debuga(_("(html10) Cannot open file %s: %s\n"),PerUserLimitFile,strerror(errno));
- exit(EXIT_FAILURE);
- }
- fprintf(fp_usr,"%s\n",uinfo->label);
- if (fclose(fp_usr)==EOF) {
- debuga(_("Write error in %s: %s\n"),PerUserLimitFile,strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- if(debug)
- debuga(_("User %s limit exceeded (%d MB). Added to file %s\n"),uinfo->label,PerUserLimit,PerUserLimitFile);
- }
+ if((fp_usr = fopen(PerUserLimitFile, "a")) == 0) {
+ debuga(_("(html10) Cannot open file %s: %s\n"),PerUserLimitFile,strerror(errno));
+ exit(EXIT_FAILURE);
}
+ fprintf(fp_usr,"%s\n",uinfo->ip);
+ if (fclose(fp_usr)==EOF) {
+ debuga(_("Write error in %s: %s\n"),PerUserLimitFile,strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ uinfo->user_limit=1;
+
+ if(debug)
+ debuga(_("User %s limit exceeded (%d MB). Added to file %s\n"),uinfo->label,PerUserLimit,PerUserLimitFile);
}
if ((ReportType & REPORT_TYPE_TOPUSERS) != 0 && (UserReportFields & USERREPORTFIELDS_AVERAGE) != 0) {
{
//! The ID of the user as found in the input file.
const char *id;
+ //! The user's IP address.
+ const char *ip;
//! \c True if the ID is in fact the IP address from which the user connected.
bool id_is_ip;
//! \c True if the user doesn't have a report file.
const char *filename;
//! \c True if this user is in the topuser list.
int topuser;
+ //! \c True if the user's limit has been reached.
+ int user_limit;
//! A general purpose flag that can be set when scanning the user's list.
int flag;
#ifdef ENABLE_DOUBLE_CHECK_DATA
void useragent(void);
// userinfo.c
-/*@shared@*/struct userinfostruct *userinfo_create(const char *userid);
+/*@shared@*/struct userinfostruct *userinfo_create(const char *userid, const char *ip);
void userinfo_free(void);
void userinfo_label(struct userinfostruct *uinfo,const char *label);
/*@shared@*/struct userinfostruct *userinfo_find_from_file(const char *filename);
//! User aliases.
static AliasObject UserAliases=NULL;
-struct userinfostruct *userinfo_create(const char *userid)
+struct userinfostruct *userinfo_create(const char *userid,const char *ip)
{
struct usergroupstruct *group, *last;
struct userinfostruct *user;
exit(EXIT_FAILURE);
}
user->label=user->id; //assign a label to avoid a NULL pointer in case none is provided
+ if (ip) {
+ user->id_is_ip=0;
+ user->ip=StringBuffer_Store(UserStrings,ip);
+ } else {
+ user->id_is_ip=1;
+ user->ip=user->id;
+ }
+ user->user_limit=0;
if (AnonymousOutputFiles) {
snprintf(filename,sizeof(filename),"%d",AnonymousCounter++);