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 request(launch_data_new_string(LAUNCH_KEY_GETJOBS
));
43 auto response(launch_msg(request
));
44 launch_data_free(request
);
46 _assert(response
!= NULL
);
47 _assert(launch_data_get_type(response
) == LAUNCH_DATA_DICTIONARY
);
49 auto parent(getppid());
53 launch_data_dict_iterate(response
, [=, &cydia
](const char *name
, launch_data_t value
) {
54 if (launch_data_get_type(response
) != LAUNCH_DATA_DICTIONARY
)
57 auto integer(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PID
));
58 if (integer
== NULL
|| launch_data_get_type(integer
) != LAUNCH_DATA_INTEGER
)
61 auto pid(launch_data_get_integer(integer
));
65 auto variables(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_ENVIRONMENTVARIABLES
));
66 if (variables
!= NULL
&& launch_data_get_type(variables
) == LAUNCH_DATA_DICTIONARY
) {
69 launch_data_dict_iterate(variables
, [&dyld
](const char *name
, launch_data_t value
) {
70 if (strncmp(name
, "DYLD_", 5) == 0)
78 auto string(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAM
));
79 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
) {
80 auto array(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAMARGUMENTS
));
81 if (array
== NULL
|| launch_data_get_type(array
) != LAUNCH_DATA_ARRAY
)
83 if (launch_data_array_get_count(array
) == 0)
86 string
= launch_data_array_get_index(array
, 0);
87 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
)
91 auto program(launch_data_get_string(string
));
95 if (strcmp(program
, "/Applications/Cydia.app/Cydia") == 0)
100 fprintf(stderr
, "thou shalt not pass\n");
107 if (argc
< 2 || argv
[1][0] != '/')
108 argv
[0] = "/usr/bin/dpkg";
114 execv(argv
[0], argv
);
115 return EX_UNAVAILABLE
;