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/>.
33 #include <Menes/Function.h>
35 typedef Function
<void, const char *, launch_data_t
> LaunchDataIterator
;
37 void launch_data_dict_iterate(launch_data_t data
, LaunchDataIterator code
) {
38 launch_data_dict_iterate(data
, [](launch_data_t value
, const char *name
, void *baton
) {
39 (*static_cast<LaunchDataIterator
*>(baton
))(name
, value
);
43 int main(int argc
, char *argv
[]) {
44 auto request(launch_data_new_string(LAUNCH_KEY_GETJOBS
));
45 auto response(launch_msg(request
));
46 launch_data_free(request
);
48 _assert(response
!= NULL
);
49 _assert(launch_data_get_type(response
) == LAUNCH_DATA_DICTIONARY
);
51 auto parent(getppid());
56 if (lstat("/Applications/Cydia.app/Cydia", &correct
) == -1) {
57 fprintf(stderr
, "you have no arms left");
61 launch_data_dict_iterate(response
, [=, &cydia
](const char *name
, launch_data_t value
) {
62 if (launch_data_get_type(value
) != LAUNCH_DATA_DICTIONARY
)
65 auto integer(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PID
));
66 if (integer
== NULL
|| launch_data_get_type(integer
) != LAUNCH_DATA_INTEGER
)
69 auto pid(launch_data_get_integer(integer
));
73 auto variables(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_ENVIRONMENTVARIABLES
));
74 if (variables
!= NULL
&& launch_data_get_type(variables
) == LAUNCH_DATA_DICTIONARY
) {
77 launch_data_dict_iterate(variables
, [&dyld
](const char *name
, launch_data_t value
) {
78 if (strncmp(name
, "DYLD_", 5) == 0)
86 auto string(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAM
));
87 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
) {
88 auto array(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAMARGUMENTS
));
89 if (array
== NULL
|| launch_data_get_type(array
) != LAUNCH_DATA_ARRAY
)
91 if (launch_data_array_get_count(array
) == 0)
94 string
= launch_data_array_get_index(array
, 0);
95 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
)
99 auto program(launch_data_get_string(string
));
104 if (lstat(program
, &check
) == -1)
107 if (correct
.st_dev
== check
.st_dev
&& correct
.st_ino
== check
.st_ino
)
112 fprintf(stderr
, "none shall pass\n");
119 if (argc
< 2 || argv
[1][0] != '/')
120 argv
[0] = "/usr/bin/dpkg";
126 execv(argv
[0], argv
);
127 return EX_UNAVAILABLE
;