1 /* Cydia - iPhone UIKit Front-End for Debian APT
2 * Copyright (C) 2008-2015 Jay Freeman (saurik)
5 /* GNU General Public License, Version 3 {{{ */
7 * Cydia is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation, either version 3 of the License,
10 * or (at your option) any later version.
12 * Cydia is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Cydia. If not, see <http://www.gnu.org/licenses/>.
31 #include <Menes/Function.h>
33 typedef Function
<void, const char *, launch_data_t
> LaunchDataIterator
;
35 void launch_data_dict_iterate(launch_data_t data
, LaunchDataIterator code
) {
36 launch_data_dict_iterate(data
, [](launch_data_t value
, const char *name
, void *baton
) {
37 (*static_cast<LaunchDataIterator
*>(baton
))(name
, value
);
41 int main(int argc
, char *argv
[]) {
42 auto log(fopen("/tmp/cydia.log", "a+"));
43 fprintf(log
, "cydo:");
44 for (int arg(1); arg
< argc
; ++arg
)
45 fprintf(log
, " %s", argv
[arg
]);
48 auto request(launch_data_new_string(LAUNCH_KEY_GETJOBS
));
49 auto response(launch_msg(request
));
50 launch_data_free(request
);
52 _assert(response
!= NULL
);
53 _assert(launch_data_get_type(response
) == LAUNCH_DATA_DICTIONARY
);
55 auto parent(getppid());
59 launch_data_dict_iterate(response
, [=, &cydia
](const char *name
, launch_data_t value
) {
60 if (launch_data_get_type(response
) != LAUNCH_DATA_DICTIONARY
)
63 auto integer(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PID
));
64 if (integer
== NULL
|| launch_data_get_type(integer
) != LAUNCH_DATA_INTEGER
)
67 auto pid(launch_data_get_integer(integer
));
71 auto variables(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_ENVIRONMENTVARIABLES
));
72 if (variables
!= NULL
&& launch_data_get_type(variables
) == LAUNCH_DATA_DICTIONARY
) {
75 launch_data_dict_iterate(variables
, [&dyld
](const char *name
, launch_data_t value
) {
76 if (strncmp(name
, "DYLD_", 5) == 0)
84 auto string(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAM
));
85 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
) {
86 auto array(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAMARGUMENTS
));
87 if (array
== NULL
|| launch_data_get_type(array
) != LAUNCH_DATA_ARRAY
)
89 if (launch_data_array_get_count(array
) == 0)
92 string
= launch_data_array_get_index(array
, 0);
93 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
)
97 auto program(launch_data_get_string(string
));
101 fprintf(log
, "%lld %s\n", pid
, program
);
102 if (strcmp(program
, "/Applications/Cydia.app/Cydia") == 0)
107 fprintf(stderr
, "thou shalt not pass\n");
117 if (argc
< 2 || argv
[1][0] != '/')
118 argv
[0] = "/usr/bin/dpkg";
124 execv(argv
[0], argv
);
125 return EX_UNAVAILABLE
;