Moved apache code into a folder to help prepare for packaging where we dont want...
[httpd-crcsyncproxy.git] / apache / support / checkgid.c
blob2a918b2956a97f1cc1bab7b0e2d6635063c133fe
1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * Given one or more group identifers on the command line (e.g.,
19 * "httpd" or "#-1"), figure out whether they'll be valid for
20 * the server to use at run-time.
22 * If a groupname isn't found, or we can't setgid() to it, return
23 * -1. If all groups are valid, return 0.
25 * This may need to be run as the superuser for the setgid() to
26 * succeed; running it as any other user may result in a false
27 * negative.
30 #include "ap_config.h"
31 #if APR_HAVE_STDIO_H
32 #include <stdio.h>
33 #endif
34 #if APR_HAVE_STDLIB_H
35 #include <stdlib.h>
36 #endif
37 #if APR_HAVE_SYS_TYPES_H
38 #include <sys/types.h>
39 #endif
40 #if HAVE_GRP_H
41 #include <grp.h>
42 #endif
43 #if APR_HAVE_UNISTD_H
44 #include <unistd.h>
45 #endif
47 int main(int argc, char *argv[])
49 int i;
50 int result;
51 gid_t gid;
52 struct group *grent;
53 struct group fake_grent;
56 * Assume success. :-)
58 result = 0;
59 for (i = 1; i < argc; ++i) {
60 char *arg;
61 arg = argv[i];
64 * If it's from a 'Group #-1' statement, get the numeric value
65 * and skip the group lookup stuff.
67 if (*arg == '#') {
68 gid = atoi(&arg[1]);
69 fake_grent.gr_gid = gid;
70 grent = &fake_grent;
72 else {
73 grent = getgrnam(arg);
77 * A NULL return means no such group was found, so we're done
78 * with this one.
80 if (grent == NULL) {
81 fprintf(stderr, "%s: group '%s' not found\n", argv[0], arg);
82 result = -1;
84 else {
85 int check;
88 * See if we can switch to the numeric GID we have. If so,
89 * all well and good; if not, well..
91 gid = grent->gr_gid;
92 check = setgid(gid);
93 if (check != 0) {
94 fprintf(stderr, "%s: invalid group '%s'\n", argv[0], arg);
95 perror(argv[0]);
96 result = -1;
101 * Worst-case return value.
103 return result;
106 * Local Variables:
107 * mode: C
108 * c-file-style: "bsd"
109 * End: