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/>.
22 #include "CyteKit/UCPlatform.h"
35 #include <Menes/Function.h>
40 typedef Function
<void, const char *, launch_data_t
> LaunchDataIterator
;
42 void launch_data_dict_iterate(launch_data_t data
, LaunchDataIterator code
) {
43 launch_data_dict_iterate(data
, [](launch_data_t value
, const char *name
, void *baton
) {
44 (*static_cast<LaunchDataIterator
*>(baton
))(name
, value
);
48 int main(int argc
, char *argv
[]) {
49 auto request(launch_data_new_string(LAUNCH_KEY_GETJOBS
));
50 auto response(launch_msg(request
));
51 launch_data_free(request
);
53 _assert(response
!= NULL
);
54 _assert(launch_data_get_type(response
) == LAUNCH_DATA_DICTIONARY
);
56 auto parent(getppid());
61 if (lstat("/Applications/Cydia.app/Cydia", &correct
) == -1) {
62 fprintf(stderr
, "you have no arms left");
66 launch_data_dict_iterate(response
, [=, &cydia
](const char *name
, launch_data_t value
) {
67 if (launch_data_get_type(value
) != LAUNCH_DATA_DICTIONARY
)
70 auto integer(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PID
));
71 if (integer
== NULL
|| launch_data_get_type(integer
) != LAUNCH_DATA_INTEGER
)
74 auto pid(launch_data_get_integer(integer
));
78 auto variables(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_ENVIRONMENTVARIABLES
));
79 if (variables
!= NULL
&& launch_data_get_type(variables
) == LAUNCH_DATA_DICTIONARY
) {
82 launch_data_dict_iterate(variables
, [&dyld
](const char *name
, launch_data_t value
) {
83 if (strncmp(name
, "DYLD_", 5) == 0)
91 auto string(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAM
));
92 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
) {
93 auto array(launch_data_dict_lookup(value
, LAUNCH_JOBKEY_PROGRAMARGUMENTS
));
94 if (array
== NULL
|| launch_data_get_type(array
) != LAUNCH_DATA_ARRAY
)
96 if (launch_data_array_get_count(array
) == 0)
99 string
= launch_data_array_get_index(array
, 0);
100 if (string
== NULL
|| launch_data_get_type(string
) != LAUNCH_DATA_STRING
)
104 auto program(launch_data_get_string(string
));
109 if (lstat(program
, &check
) == -1)
112 if (correct
.st_dev
== check
.st_dev
&& correct
.st_ino
== check
.st_ino
)
117 fprintf(stderr
, "none shall pass\n");
124 if (argc
< 2 || argv
[1][0] != '/')
125 argv
[0] = "/usr/bin/dpkg";
131 execv(argv
[0], argv
);
132 return EX_UNAVAILABLE
;