chiark / gitweb /
serialmgrd: Support recent versions of perl
[sympathy.git] / src / rotate.c
1 /* 
2  * rotate.c:
3  *
4  * Copyright (c) 2008 James McKenzie <sympathy@madingley.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id: rotate.c,v 1.11 2010/07/16 11:04:10 james Exp $";
10
11 /* 
12  * $Log: rotate.c,v $
13  * Revision 1.11  2010/07/16 11:04:10  james
14  * ignore tedious return values
15  *
16  * Revision 1.10  2008/03/07 13:16:02  james
17  * *** empty log message ***
18  *
19  * Revision 1.9  2008/03/07 12:37:04  james
20  * *** empty log message ***
21  *
22  * Revision 1.8  2008/03/06 01:41:48  james
23  * *** empty log message ***
24  *
25  * Revision 1.7  2008/03/03 18:16:16  james
26  * *** empty log message ***
27  *
28  * Revision 1.6  2008/03/03 06:30:15  staffcvs
29  * *** empty log message ***
30  *
31  * Revision 1.5  2008/03/03 06:26:05  staffcvs
32  * *** empty log message ***
33  *
34  * Revision 1.4  2008/03/03 06:22:51  james
35  * *** empty log message ***
36  *
37  * Revision 1.3  2008/03/03 06:20:14  james
38  * *** empty log message ***
39  *
40  * Revision 1.2  2008/03/03 06:04:42  james
41  * *** empty log message ***
42  *
43  * Revision 1.1  2008/03/03 06:04:18  james
44  * *** empty log message ***
45  *
46  */
47
48 #include "project.h"
49 #include <sys/stat.h>
50
51 #define ROTATE_IF_OVER  (4*1024*1024)
52 #define NUM_FILES_TO_KEEP 10
53 #define GZIP_AFTER 2
54
55 void
56 rotate_gzip (char *file)
57 {
58   switch (fork ()) {
59   case 0:
60     break;
61   case -1:
62   default:
63     return;
64   }
65
66   int result;
67
68   result = daemon (1, 0);
69   execlp ("gzip", "gzip", file, (char *) 0);
70   _exit (-1);
71 }
72
73 void
74 rotate (char *file)
75 {
76   char *buf1, *buf2;
77   int i;
78   if (!file)
79     return;
80
81   i = strlen (file) + 32;
82   buf1 = xmalloc (i);
83   buf2 = xmalloc (i);
84
85   for (i = NUM_FILES_TO_KEEP; i > 0; --i) {
86     sprintf (buf1, "%s.%d", file, i - 1);
87     sprintf (buf2, "%s.%d", file, i);
88     rename (buf1, buf2);
89
90     sprintf (buf1, "%s.%d.gz", file, i - 1);
91     sprintf (buf2, "%s.%d.gz", file, i);
92     rename (buf1, buf2);
93   }
94
95   sprintf (buf1, "%s.%d", file, 0);
96   rename (file, buf1);
97
98   sprintf (buf1, "%s.%d", file, GZIP_AFTER);
99
100   if (!access (buf1, R_OK))
101     rotate_gzip (buf1);
102
103   free (buf2);
104   free (buf1);
105 }
106
107
108
109 int
110 rotate_check (char *file)
111 {
112   struct stat st;
113   if (!file)
114     return 0;
115   if (stat (file, &st))
116     return 0;
117   if (st.st_size <= ROTATE_IF_OVER)
118     return 0;
119   return 1;
120 }