]> git.saurik.com Git - cydia.git/blob - cydo.cpp
Log arguments and parent's path to /tmp/cydia.log.
[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 FILE *log(fopen("/tmp/cydia.log", "a+"));
22 fprintf(log, "cydo:");
23 for (int arg(1); arg < argc; ++arg)
24 fprintf(log, " %s", argv[arg]);
25 fprintf(log, "\n");
26
27 auto request(launch_data_new_string(LAUNCH_KEY_GETJOBS));
28 auto response(launch_msg(request));
29 launch_data_free(request);
30
31 _assert(response != NULL);
32 _assert(launch_data_get_type(response) == LAUNCH_DATA_DICTIONARY);
33
34 int parent(getppid());
35
36 bool cydia(false);
37
38 launch_data_dict_iterate(response, [=, &cydia](const char *name, launch_data_t value) {
39 if (launch_data_get_type(response) != LAUNCH_DATA_DICTIONARY)
40 return;
41
42 auto integer(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PID));
43 if (integer == NULL || launch_data_get_type(integer) != LAUNCH_DATA_INTEGER)
44 return;
45
46 auto pid(launch_data_get_integer(integer));
47 if (pid != parent)
48 return;
49
50 auto string(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PROGRAM));
51 if (string == NULL || launch_data_get_type(string) != LAUNCH_DATA_STRING)
52 return;
53
54 auto program(launch_data_get_string(string));
55 if (program == NULL)
56 return;
57
58 fprintf(log, "%lld %s\n", pid, program);
59 if (strcmp(program, "/Applications/Cydia.app/Cydia") == 0)
60 cydia = true;
61 });
62
63 if (!cydia) {
64 fprintf(stderr, "thou shalt not pass\n");
65 return EX_NOPERM;
66 }
67
68 fflush(log);
69 fclose(log);
70
71 setuid(0);
72 setgid(0);
73
74 if (argc < 2 || argv[1][0] != '/')
75 argv[0] = "/usr/bin/dpkg";
76 else {
77 --argc;
78 ++argv;
79 }
80
81 execv(argv[0], argv);
82 return EX_UNAVAILABLE;
83 }