summaryrefslogtreecommitdiffstats
path: root/games/xbill/xbill-wrapper.c
blob: 119e58c01467a7939a8c2829af1dad668a7e95cd (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
/* Written by Menno Duursma for use with xbill */

/*
 * This program is free software. It comes without any warranty.
 * Granted WTFPL, Version 2, as published by Sam Hocevar. See
 * http://sam.zoy.org/wtfpl/COPYING for more details.
 */

/*
 * Per default xbill sets its score file world writable
 * which obviously allows cheating ones hi-score :-(
 * Probably this came about since GTK+ doesn't allow setgid?
 * 
 * In the install-script we move xbill to xbill-bin and install
 * this here wrapper thing as xbill, with setuid and video group
 * executable filesystem perms. Here we change groups to games.
 *
 * We should now be able make /var/xbill group-writable only...
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <grp.h>

int main(int argc, char *argv[], char *envp[])
{

	/*
         * hardcoded path/program to exec
	 * and group to run under
	 */
        char prog[] = "/usr/bin/xbill-bin";
	char grpname[] = "games";

	struct group *grp;
	errno = 0;

	/* get our gid */
	grp = getgrnam(grpname);
	if (grp == NULL) {
		fprintf(stderr, "Error: getgrnam(%s) - %s\n",
			grpname,
			strerror(errno));
		exit(EXIT_FAILURE);
	}

	/* drop to the gid */
	if (setgid(grp->gr_gid)) {
		fprintf(stderr, "Error: setgid(%d) - %s\n",
			grp->gr_gid,
			strerror(errno));
		exit(EXIT_FAILURE);
	}
		

        /* drop back to calling uid */
	if (setuid(getuid())) {
		fprintf(stderr, "Error: setuid(%d) - %s\n",
			getuid(),
			strerror(errno));
		exit(EXIT_FAILURE);
	}

        /* tell the viewers wat is going to happen */
        fprintf(stderr, "Starting %s with uid = %d, gid = %d\n",
		prog,
		getuid(),
		getgid());

	/* fire it up */
	if (execve(prog, argv, envp) == -1) {
		fprintf(stderr, "Error: execve(%s, argv, envp) - %s\n",
			prog,
			strerror(errno));
		exit(EXIT_FAILURE);
	}

	return EXIT_SUCCESS;
}