]> git.saurik.com Git - cydia.git/blob - exec.mm
Further factorization, file content list, checkbox clarication, advanced search tease...
[cydia.git] / exec.mm
1 #include <Foundation/Foundation.h>
2 #include <CoreFoundation/CoreFoundation.h>
3
4 #include <sys/types.h>
5 #include <pwd.h>
6 #include <unistd.h>
7
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 const char *Firmware_ = NULL;
12
13 unsigned Major_;
14 unsigned Minor_;
15 unsigned BugFix_;
16
17 #define FW_LEAST(major, minor, bugfix) \
18 (major < Major_ || major == Major_ && \
19 (minor < Minor_ || minor == Minor_ && \
20 bugfix <= BugFix_))
21
22 int main(int argc, char *argv[]) {
23 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
24
25 if (NSDictionary *sysver = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]) {
26 if (NSString *prover = [sysver valueForKey:@"ProductVersion"]) {
27 Firmware_ = strdup([prover UTF8String]);
28 NSArray *versions = [prover componentsSeparatedByString:@"."];
29 int count = [versions count];
30 Major_ = count > 0 ? [[versions objectAtIndex:0] intValue] : 0;
31 Minor_ = count > 1 ? [[versions objectAtIndex:1] intValue] : 0;
32 BugFix_ = count > 2 ? [[versions objectAtIndex:2] intValue] : 0;
33 }
34 }
35
36 [pool release];
37
38 const char *user;
39 if (FW_LEAST(1,1,3))
40 user = "mobile";
41 else
42 user = "root";
43
44 if (argc == 1)
45 printf("%s\n", user);
46 else {
47 struct passwd *passwd = getpwnam(user);
48
49 if (setreuid(passwd->pw_uid, 0) == -1) {
50 perror("setreuid");
51 exit(1);
52 }
53
54 if (setregid(passwd->pw_gid, 0) == -1) {
55 perror("setregid");
56 exit(1);
57 }
58
59 if (execvp(argv[1], argv + 1) == -1) {
60 perror("execvp");
61 exit(1);
62 }
63 }
64
65 return 0;
66 }