Rev 11173 | Rev 15349 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 11173 | Rev 12474 | ||
---|---|---|---|
Line 23... | Line 23... | ||
23 | int loglinecnt; |
23 | int loglinecnt; |
24 | char *logbuf, *logfname; |
24 | char *logbuf, *logfname; |
25 | 25 | ||
26 | int llcmp(const void *c1, const void *c2) |
26 | int llcmp(const void *c1, const void *c2) |
27 | { |
27 | { |
28 |
|
28 | char **p1,**p2; |
29 |
|
29 | p1=(char **) c1; p2=(char **) c2; |
30 |
|
30 | return strcmp(*p1,*p2); |
31 | } |
31 | } |
32 | 32 | ||
33 | void onelogfile(char *fname) |
33 | void onelogfile(char *fname) |
34 | { |
34 | { |
35 |
|
35 | char namebuf[1024], *pp; |
36 |
|
36 | FILE *f; |
37 |
|
37 | size_t l, l2; |
38 |
|
38 | struct stat st; |
39 |
|
39 | int lim; |
40 | 40 | ||
41 |
|
41 | if(fname[0] == 0) { |
42 | abort: |
42 | abort: |
43 |
|
43 | llptr=llbuf; return; |
44 |
|
44 | } |
45 |
|
45 | if(llptr<=llbuf) goto abort; |
46 |
|
46 | if(strstr(fname,"..")!=NULL) goto abort; |
47 |
|
47 | for(pp=fname; *pp; pp++) if(*pp<'-' || *pp>'z' || strchr(":;=<>?\\^[]",*pp)!=NULL) goto abort; |
48 |
|
48 | snprintf(namebuf,sizeof(namebuf),"%s/%s",logd,fname); |
49 |
|
49 | pp=strrchr(namebuf,'/'); if(pp>namebuf+strlen(logd)) { |
50 |
|
50 | *pp=0; mkdirs(namebuf); *pp='/'; |
51 |
|
51 | } |
52 |
|
52 | f=fopen(namebuf,"a"); if(f==NULL) goto abort; |
53 |
|
53 | l2=ftell(f); |
54 |
|
54 | fwrite(llbuf,1,llptr-llbuf,f); l=ftell(f); fclose(f); llptr=llbuf; |
55 |
|
55 | if(l2==0) chmod(namebuf,S_IRUSR|S_IWUSR); |
56 |
|
56 | if(strcmp(fname,"access.log")==0 || strcmp(fname,"referer.log")==0 || |
57 |
|
57 | strcmp(fname,"session.log")==0 || strcmp(fname,"post.log")==0 || |
58 |
|
58 | strcmp(fname,"user_error.log")==0 || |
59 |
|
59 | strncmp(fname,"classes/",8)==0) |
- | 60 | lim=GEN_LOG_LIMIT; |
|
60 |
|
61 | else lim=MODULE_LOG_LIMIT; |
61 |
|
62 | if(l>=lim) { |
62 |
|
63 | char b3[1024], b4[1024]; |
63 |
|
64 | int i; |
64 |
|
65 | for(i=OLD_LOG_FILES-1;i>0;i--) { |
65 |
|
66 | snprintf(b3,sizeof(b3),"%s.old%d",namebuf,i); |
66 |
|
67 | snprintf(b4,sizeof(b4),"%s.old%d",namebuf,i+1); |
67 |
|
68 | if(stat(b3,&st)==0) rename(b3,b4); |
68 |
|
69 | } |
69 |
|
70 | if(OLD_LOG_FILES>0) { |
70 |
|
71 | snprintf(b3,sizeof(b3),"%s.old1",namebuf); |
71 |
|
72 | rename(namebuf,b3); |
72 |
|
73 | } |
73 |
|
74 | else unlink(namebuf); |
74 |
|
75 | } |
75 | } |
76 | } |
76 | 77 | ||
77 | void dispatch_log(void) |
78 | void dispatch_log(void) |
78 | { |
79 | { |
79 |
|
80 | size_t l, l2; |
80 |
|
81 | pid_t pid; |
81 |
|
82 | FILE *f; |
82 |
|
83 | char *p1,*p2; |
83 |
|
84 | char namebuf[1024]; |
84 |
|
85 | int i; |
85 |
|
86 | #define TEMP_LOG_2 "log/temp-2.log" |
86 | 87 | ||
87 |
|
88 | fflush(NULL); |
88 |
|
89 | pid=fork(); if(pid>0) {addfork(pid,1); return;} |
89 |
|
90 | close(commsock); |
90 |
|
91 | call_sh(1,"ls %s* 2>/dev/null >/dev/null || exit;\n\ |
91 |
|
92 | for f in %s*; do mv $f $f.bb; done;\n\ |
92 | sleep 1;\n\ |
93 | sleep 1;\n\ |
93 | cat %s*.bb >%s;\n\ |
94 | cat %s*.bb >%s;\n\ |
94 | rm -f %s*.bb", |
95 | rm -f %s*.bb", |
95 | TEMP_LOG_FILE+3,TEMP_LOG_FILE+3,TEMP_LOG_FILE+3,TEMP_LOG_2,TEMP_LOG_FILE+3); |
96 | TEMP_LOG_FILE+3,TEMP_LOG_FILE+3,TEMP_LOG_FILE+3,TEMP_LOG_2,TEMP_LOG_FILE+3); |
96 |
|
97 | f=fopen(TEMP_LOG_2,"r"); if(f==NULL) exit(0); |
97 |
|
98 | fseek(f,0,SEEK_END); l=ftell(f); |
- | 99 | if(l<=0) |
|
98 |
|
100 | {fclose(f); unlink(TEMP_LOG_2); exit(0);} |
99 |
|
101 | logbuf=xmalloc(l+16); fseek(f,0,SEEK_SET); |
100 |
|
102 | l2=fread(logbuf,1,l,f);fclose(f); unlink(TEMP_LOG_2); |
101 |
|
103 | if(l2!=l) {free(logbuf); exit(0);} |
102 |
|
104 | logbuf[l2]=0; |
103 |
|
105 | for(loglinecnt=0,p1=logbuf;loglinecnt<MAX_LOGLINES && *p1;p1=p2) { |
104 |
|
106 | p2=strchr(p1,'\n'); if(p2) *p2++=0; else p2=p1+strlen(p1); |
105 |
|
107 | p1=find_word_start(p1); if(*p1==0) continue; |
106 |
|
108 | linetab[loglinecnt++]=p1; |
- | 109 | } |
|
- | 110 | qsort(linetab,loglinecnt,sizeof(linetab[0]),llcmp); |
|
- | 111 | namebuf[0]=0; llptr=llbuf; |
|
- | 112 | for(i=0;i<loglinecnt;i++) { |
|
- | 113 | p1=linetab[i]; p2=find_word_end(p1); *p2++=0; |
|
- | 114 | if(strcmp(namebuf,p1)!=0) { |
|
- | 115 | onelogfile(namebuf); snprintf(namebuf,sizeof(namebuf),"%s",p1); |
|
107 | } |
116 | } |
108 | qsort(linetab,loglinecnt,sizeof(linetab[0]),llcmp); |
- | |
109 | namebuf[0]=0; llptr=llbuf; |
- | |
110 | for(i=0;i<loglinecnt;i++) { |
- | |
111 | p1=linetab[i]; p2=find_word_end(p1); *p2++=0; |
- | |
112 | if(strcmp(namebuf,p1)!=0) { |
- | |
113 | onelogfile(namebuf); snprintf(namebuf,sizeof(namebuf),"%s",p1); |
- | |
114 | } |
- | |
115 |
|
117 | if(strlen(p2)>=sizeof(llbuf)-(llptr-llbuf)-2) onelogfile(namebuf); |
116 |
|
118 | snprintf(llptr,sizeof(llbuf)-(llptr-llbuf),"%s\n",p2); |
117 |
|
119 | llptr+=strlen(llptr); |
118 |
|
120 | } |
119 |
|
121 | if(namebuf[0]) onelogfile(namebuf); |
120 |
|
122 | free(logbuf); |
121 |
|
123 | exit(0); |
122 | } |
124 | } |
123 | - |