]> git.saurik.com Git - cydia.git/blob - cydo.cpp
49e419a6e7f422d128bed908572b0359cb7f9368
[cydia.git] / cydo.cpp
1 #include <cstdio>
2 #include <cstdlib>
3
4 #include <errno.h>
5 #include <sysexits.h>
6 #include <unistd.h>
7
8 #include <launch.h>
9
10 #include <Menes/Function.h>
11
12 typedef Function<void, const char *, launch_data_t> LaunchDataIterator;
13
14 void launch_data_dict_iterate(launch_data_t data, LaunchDataIterator code) {
15 launch_data_dict_iterate(data, [](launch_data_t value, const char *name, void *baton) {
16 (*static_cast<LaunchDataIterator *>(baton))(name, value);
17 }, &code);
18 }
19
20 int main(int argc, char *argv[]) {
21 auto request(launch_data_new_string(LAUNCH_KEY_GETJOBS));
22 auto response(launch_msg(request));
23 launch_data_free(request);
24
25 _assert(response != NULL);
26 _assert(launch_data_get_type(response) == LAUNCH_DATA_DICTIONARY);
27
28 int parent(getppid());
29
30 bool cydia(false);
31
32 launch_data_dict_iterate(response, [=, &cydia](const char *name, launch_data_t value) {
33 if (launch_data_get_type(response) != LAUNCH_DATA_DICTIONARY)
34 return;
35
36 auto integer(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PID));
37 if (integer == NULL || launch_data_get_type(integer) != LAUNCH_DATA_INTEGER)
38 return;
39
40 auto pid(launch_data_get_integer(integer));
41 if (pid != parent)
42 return;
43
44 auto string(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PROGRAM));
45 if (string == NULL || launch_data_get_type(string) != LAUNCH_DATA_STRING)
46 return;
47
48 auto program(launch_data_get_string(string));
49 if (program == NULL)
50 return;
51
52 if (strcmp(program, "/Applications/Cydia.app/Cydia") == 0)
53 cydia = true;
54 });
55
56 if (!cydia) {
57 fprintf(stderr, "thou shalt not pass\n");
58 return EX_NOPERM;
59 }
60
61 setuid(0);
62 setgid(0);
63
64 if (argc < 2 || argv[1][0] != '/')
65 argv[0] = "/usr/bin/dpkg";
66 else {
67 --argc;
68 ++argv;
69 }
70
71 execv(argv[0], argv);
72 return EX_UNAVAILABLE;
73 }