summaryrefslogtreecommitdiff
blob: 8fe4c0f1239692e2731f2ec53ad8c21195db5554 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
diff -Naur cronolog-1.6.2/configure cronolog-1.6.2-new/configure
--- a/configure	Thu May  3 17:44:22 2001
+++ b/configure	Mon Jun  3 00:38:32 2002
@@ -1757,15 +1757,49 @@
 
 fi
 
+echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
+echo "configure:1762: checking for uid_t in sys/types.h" >&5
+if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1767 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "uid_t" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_uid_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_uid_t=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_type_uid_t" 1>&6
+if test $ac_cv_type_uid_t = no; then
+  cat >> confdefs.h <<\EOF
+#define uid_t int
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define gid_t int
+EOF
+
+fi
+
 
 
 echo $ac_n "checking for strftime""... $ac_c" 1>&6
-echo "configure:1764: checking for strftime" >&5
+echo "configure:1798: checking for strftime" >&5
 if eval "test \"`echo '$''{'ac_cv_func_strftime'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1769 "configure"
+#line 1803 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char strftime(); below.  */
@@ -1788,7 +1822,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1792: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1826: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_strftime=yes"
 else
@@ -1810,7 +1844,7 @@
   echo "$ac_t""no" 1>&6
 # strftime is in -lintl on SCO UNIX.
 echo $ac_n "checking for strftime in -lintl""... $ac_c" 1>&6
-echo "configure:1814: checking for strftime in -lintl" >&5
+echo "configure:1848: checking for strftime in -lintl" >&5
 ac_lib_var=`echo intl'_'strftime | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1818,7 +1852,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lintl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1822 "configure"
+#line 1856 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1829,7 +1863,7 @@
 strftime()
 ; return 0; }
 EOF
-if { (eval echo configure:1833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1867: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1856,12 +1890,12 @@
 fi
 
 echo $ac_n "checking for vprintf""... $ac_c" 1>&6
-echo "configure:1860: checking for vprintf" >&5
+echo "configure:1894: checking for vprintf" >&5
 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1865 "configure"
+#line 1899 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char vprintf(); below.  */
@@ -1884,7 +1918,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_vprintf=yes"
 else
@@ -1908,12 +1942,12 @@
 
 if test "$ac_cv_func_vprintf" != yes; then
 echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
-echo "configure:1912: checking for _doprnt" >&5
+echo "configure:1946: checking for _doprnt" >&5
 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1917 "configure"
+#line 1951 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char _doprnt(); below.  */
@@ -1936,7 +1970,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func__doprnt=yes"
 else
@@ -1963,12 +1997,12 @@
 for ac_func in mkdir mktime putenv
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1967: checking for $ac_func" >&5
+echo "configure:2001: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1972 "configure"
+#line 2006 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1991,7 +2025,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1995: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2029: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -2018,12 +2052,12 @@
 for ac_func in strptime localtime_r
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2022: checking for $ac_func" >&5
+echo "configure:2056: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2027 "configure"
+#line 2061 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -2046,7 +2080,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2050: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
diff -Naur cronolog-1.6.2/configure.in cronolog-1.6.2-new/configure.in
--- cronolog-1.6.2/configure.in	Thu May  3 17:30:50 2001
+++ cronolog-1.6.2-new/configure.in	Mon Jun  3 00:38:32 2002
@@ -56,6 +56,7 @@
 AC_C_CONST
 AC_TYPE_SIZE_T
 AC_STRUCT_TM
+AC_TYPE_UID_T
 
 dnl Checks for library functions.
 
diff -Naur cronolog-1.6.2/doc/cronolog.1m cronolog-1.6.2-new/doc/cronolog.1m
--- cronolog-1.6.2/doc/cronolog.1m	Fri May  4 09:44:55 2001
+++ cronolog-1.6.2-new/doc/cronolog.1m	Mon Jun  3 00:39:10 2002
@@ -89,6 +89,20 @@
 .IP --help
 print a help message and then exit.
 .\"
+.IP "-u \fIUSER\fP"
+.IP "--set-uid=\fIUSER\fP"
+sets the user ID of the cronolog process before any logs are opened.
+\fIUSER\fP can be a username or a numeric user ID. If \fIUSER\fP
+contains solely digits, it will be assumed to be a numeric user ID;
+otherwise, it will be assumed to be a username.
+.\"
+.IP "-g \fIGROUP\fP"
+.IP "--set-gid=\fIGROUP\fP"
+sets the group ID of the cronolog process before any logs are opened.
+\fIGROUP\fP can be a group name or a numeric group ID. If \fIGROUP\fP
+contains solely digits, it will be assumed to be a numeric group ID;
+otherwise, it will be assumed to be a group name.
+.\"
 .IP "-p \fIPERIOD\fP"
 .IP "--period=\fIPERIOD\fP"
 specifies the period explicitly as an optional digit string followed
diff -Naur cronolog-1.6.2/src/cronolog.c cronolog-1.6.2-new/src/cronolog.c
--- cronolog-1.6.2/src/cronolog.c	Thu May  3 17:42:48 2001
+++ cronolog-1.6.2-new/src/cronolog.c	Mon Jun  3 00:38:32 2002
@@ -100,6 +100,12 @@
 #define VERSION_MSG      "cronolog version 0.1\n"
 #endif
 
+#ifndef _WIN32
+#define SETUGID_USAGE	"   -u USER,   --set-uid=USER  change to USER before doing anything (name or UID)\n" \
+			"   -g GROUP,  --set-gid=GROUP change to GROUP before doing anything (name or GID)\n"
+#else
+#define SETUGID_USAGE	""
+#endif
 
 #define USAGE_MSG 	"usage: %s [OPTIONS] logfile-spec\n" \
 			"\n" \
@@ -117,12 +123,17 @@
 			"   -e,        --european         European date formats (default)\n" \
 			"   -s,    --start-time=TIME   starting time\n" \
 			"   -z TZ, --time-zone=TZ      use TZ for timezone\n" \
+			SETUGID_USAGE \
 			"   -V,      --version         print version number, then exit\n"
 
 
 /* Definition of the short and long program options */
 
+#ifndef _WIN32
+char          *short_options = "ad:eop:s:z:H:P:S:l:hVx:u:g:";
+#else
 char          *short_options = "ad:eop:s:z:H:P:S:l:hVx:";
+#endif        
 
 #ifndef _WIN32
 struct option long_options[] =
@@ -137,6 +148,8 @@
     { "link",      	required_argument, 	NULL, 'l' },
     { "period",		required_argument,	NULL, 'p' },
     { "delay",		required_argument,	NULL, 'd' },
+    { "set-uid",      	required_argument,     	NULL, 'u' },
+    { "set-gid",      	required_argument,     	NULL, 'g' },
     { "once-only", 	no_argument,       	NULL, 'o' },
     { "help",      	no_argument,       	NULL, 'h' },
     { "version",   	no_argument,       	NULL, 'V' }
@@ -160,6 +173,12 @@
     char	*template;
     char	*linkname = NULL;
     char	*prevlinkname = NULL;
+#ifndef _WIN32
+    uid_t	new_uid = 0;
+    gid_t	new_gid = 0;
+    int		change_uid = 0;
+    int		change_gid = 0;
+#endif
     mode_t	linktype = 0;
     int 	n_bytes_read;
     int		ch;
@@ -234,6 +253,16 @@
 	    }		
 	    break;
 	    
+#ifndef _WIN32
+	case 'u':
+	    new_uid = parse_uid(optarg, argv[0]);
+	    change_uid = 1;
+	    break;
+	case 'g':
+	    new_gid = parse_gid(optarg, argv[0]);
+	    change_gid = 1;
+	    break;
+#endif
 	case 'o':
 	    periodicity = ONCE_ONLY;
 	    break;
@@ -265,6 +294,17 @@
 	fprintf(stderr, USAGE_MSG, argv[0]);
 	exit(1);
     }
+
+#ifndef _WIN32
+    if (change_gid && setgid(new_gid) == -1) {
+	fprintf(stderr, "setgid: unable to change to gid: %d\n", new_gid);
+       	exit(1);
+    }
+    if (change_uid && setuid(new_uid) == -1) {
+	fprintf(stderr, "setuid: unable to change to uid: %d\n", new_uid);
+       	exit(1);
+    }
+#endif
 
     DEBUG((VERSION_MSG "\n"));
 
diff -Naur cronolog-1.6.2/src/cronoutils.c cronolog-1.6.2-new/src/cronoutils.c
--- cronolog-1.6.2/src/cronoutils.c	Thu May  3 17:43:21 2001
+++ cronolog-1.6.2-new/src/cronoutils.c	Mon Jun  3 00:38:32 2002
@@ -710,4 +710,50 @@
     return retval;
 }
 
-    
+
+#ifndef _WIN32
+/* Turn a string specifying either a username or UID into an actual
+ * uid_t for use in setuid(). A string is assumed to be a UID if
+ * it contains only decimal digits. */
+uid_t
+parse_uid(char *user, char *argv0)
+{
+    char		*probe = user;
+    struct passwd	*ent;
+
+    while (*probe && isdigit(*probe)) {
+	probe++;
+    }
+    if (!(*probe)) {
+	return atoi(user);
+    }
+    if (!(ent = getpwnam(user))) {
+	fprintf(stderr, "%s: Bad username %s\n", argv0, user);
+	exit(1);
+    }
+    return (ent->pw_uid);
+}
+
+
+/* Turn a string specifying either a group name or GID into an actual
+ * gid_t for use in setgid(). A string is assumed to be a GID if
+ * it contains only decimal digits. */
+gid_t
+parse_gid(char *group, char *argv0)
+{
+    char		*probe = group;
+    struct group	*ent;
+
+    while (*probe && isdigit(*probe)) {
+	probe++;
+    }
+    if (!(*probe)) {
+	return atoi(group);
+    }
+    if (!(ent = getgrnam(group))) {
+	fprintf(stderr, "%s: Bad group name %s\n", argv0, group);
+	exit(1);
+    }
+    return (ent->gr_gid);
+}
+#endif /* _WIN32 */
diff -Naur cronolog-1.6.2/src/cronoutils.h cronolog-1.6.2-new/src/cronoutils.h
--- cronolog-1.6.2/src/cronoutils.h	Thu May  3 17:40:12 2001
+++ cronolog-1.6.2-new/src/cronoutils.h	Mon Jun  3 00:38:32 2002
@@ -84,6 +84,8 @@
 #include <limits.h>
 #ifndef _WIN32
 #include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
 #else
 #include <io.h>
 #include <direct.h>
@@ -172,7 +174,8 @@
 void		print_debug_msg(char *msg, ...);
 time_t		parse_time(char *time_str, int);
 char 		*timestamp(time_t thetime);
-
+uid_t		parse_uid(char *user, char *argv0);
+gid_t		parse_gid(char *group, char *argv0);
 
 /* Global variables */