diff options
-rw-r--r-- | Cydia.mm | 10 | ||||
-rw-r--r-- | exec.mm | 66 | ||||
-rw-r--r-- | makefile | 7 |
3 files changed, 76 insertions, 7 deletions
@@ -184,9 +184,9 @@ unsigned Minor_; unsigned BugFix_; #define FW_LEAST(major, minor, bugfix) \ - (major > Major_ || major == Major_ && \ - (minor > Minor_ || minor == Minor_ && \ - bugfix >= BugFix_)) + (major < Major_ || major == Major_ && \ + (minor < Minor_ || minor == Minor_ && \ + bugfix <= BugFix_)) bool bootstrap_ = false; @@ -3701,8 +3701,8 @@ int main(int argc, char *argv[]) { NSArray *versions = [prover componentsSeparatedByString:@"."]; int count = [versions count]; Major_ = count > 0 ? [[versions objectAtIndex:0] intValue] : 0; - Minor_ = count > 1 ? [[versions objectAtIndex:0] intValue] : 0; - BugFix_ = count > 2 ? [[versions objectAtIndex:0] intValue] : 0; + Minor_ = count > 1 ? [[versions objectAtIndex:1] intValue] : 0; + BugFix_ = count > 2 ? [[versions objectAtIndex:2] intValue] : 0; } } @@ -0,0 +1,66 @@ +#include <Foundation/Foundation.h> +#include <CoreFoundation/CoreFoundation.h> + +#include <sys/types.h> +#include <pwd.h> +#include <unistd.h> + +#include <stdio.h> +#include <stdlib.h> + +const char *Firmware_ = NULL; + +unsigned Major_; +unsigned Minor_; +unsigned BugFix_; + +#define FW_LEAST(major, minor, bugfix) \ + (major < Major_ || major == Major_ && \ + (minor < Minor_ || minor == Minor_ && \ + bugfix <= BugFix_)) + +int main(int argc, char *argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (NSDictionary *sysver = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]) { + if (NSString *prover = [sysver valueForKey:@"ProductVersion"]) { + Firmware_ = strdup([prover cString]); + NSArray *versions = [prover componentsSeparatedByString:@"."]; + int count = [versions count]; + Major_ = count > 0 ? [[versions objectAtIndex:0] intValue] : 0; + Minor_ = count > 1 ? [[versions objectAtIndex:1] intValue] : 0; + BugFix_ = count > 2 ? [[versions objectAtIndex:2] intValue] : 0; + } + } + + [pool release]; + + const char *user; + if (FW_LEAST(1,1,3)) + user = "mobile"; + else + user = "root"; + + if (argc == 1) + printf("%s\n", user); + else { + struct passwd *passwd = getpwnam(user); + + if (setreuid(passwd->pw_uid, 0) == -1) { + perror("setreuid"); + exit(1); + } + + if (setregid(passwd->pw_gid, 0) == -1) { + perror("setregid"); + exit(1); + } + + if (execvp(argv[1], argv + 1) == -1) { + perror("execvp"); + exit(1); + } + } + + return 0; +} @@ -1,10 +1,13 @@ iPhone := 192.168.1.100 -all: Cydia +all: Cydia exec test: all scp -p Cydia saurik@$(iPhone):/dat ssh saurik@$(iPhone) /dat/Cydia -Cydia: *.mm *.h makefile +exec: exec.mm makefile + arm-apple-darwin-g++ -Wall -Werror -o $@ $< -framework Foundation -framework CoreFoundation -lobjc + +Cydia: Cydia.mm *.h makefile arm-apple-darwin-g++ -fobjc-call-cxx-cdtors -g3 -O2 -Wall -Werror -o $@ $< -framework UIKit -framework IOKit -framework Foundation -framework CoreFoundation -framework CoreGraphics -framework GraphicsServices -lobjc -lapt-pkg -lpcre -fobjc-exceptions |