+#include "CyteKit/UCPlatform.h"
+
#include <dirent.h>
#include <strings.h>
return system([[NSString stringWithFormat:@"/usr/libexec/cydia/setnsfpn %s", path] UTF8String]) == 0;
}
-static bool MoveStash() {
+enum StashStatus {
+ StashDone,
+ StashFail,
+ StashGood,
+};
+
+static StashStatus MoveStash() {
struct stat stat;
if (lstat("/var/stash", &stat) == -1)
- return errno == ENOENT;
+ return errno == ENOENT ? StashGood : StashFail;
else if (S_ISLNK(stat.st_mode))
- return true;
+ return StashGood;
else if (!S_ISDIR(stat.st_mode))
- return false;
+ return StashFail;
if (lstat("/var/db/stash", &stat) == -1) {
if (errno == ENOENT)
goto move;
- else return false;
+ else return StashFail;
} else if (S_ISLNK(stat.st_mode))
// XXX: this is fixable
- return false;
+ return StashFail;
else if (!S_ISDIR(stat.st_mode))
- return false;
+ return StashFail;
else {
if (!setnsfpn("/var/db/stash"))
- return false;
+ return StashFail;
if (system("mv -t /var/stash /var/db/stash/*") != 0)
- return false;
+ return StashFail;
if (rmdir("/var/db/stash") == -1)
- return false;
+ return StashFail;
} move:
if (!setnsfpn("/var/stash"))
- return false;
+ return StashFail;
if (rename("/var/stash", "/var/db/stash") == -1)
- return false;
+ return StashFail;
if (symlink("/var/db/stash", "/var/stash") != -1)
- return true;
+ return StashDone;
if (rename("/var/db/stash", "/var/stash") != -1)
- return false;
+ return StashFail;
fprintf(stderr, "/var/stash misplaced -- DO NOT REBOOT\n");
- return false;
+ return StashFail;
}
static bool FixProtections() {
if (kCFCoreFoundationVersionNumber >= 1000) {
if (!FixProtections())
return 1;
- if (MoveStash())
- restart = true;
- else {
- fprintf(stderr, "failed to move stash\n");
- return 1;
+ switch (MoveStash()) {
+ case StashDone:
+ restart = true;
+ break;
+ case StashFail:
+ fprintf(stderr, "failed to move stash\n");
+ return 1;
+ case StashGood:
+ break;
}
}
- unlink("/etc/apt/sources.list.d/cydia.list");
-
#define OldCache_ "/var/root/Library/Caches/com.saurik.Cydia"
if (access(OldCache_, F_OK) == 0)
system("rm -rf " OldCache_);
#define Cytore_ "/metadata.cb0"
+ #define CYDIA_LIST "/etc/apt/sources.list.d/cydia.list"
+ unlink(CYDIA_LIST);
+ [[NSString stringWithFormat:@
+ "deb http://apt.saurik.com/ ios/%.2f main\n"
+ "deb http://apt.thebigboss.org/repofiles/cydia/ stable main\n"
+ "deb http://cydia.zodttd.com/repo/cydia/ stable main\n"
+ "deb http://apt.modmyi.com/ stable main\n"
+ , kCFCoreFoundationVersionNumber] writeToFile:@ CYDIA_LIST atomically:YES];
+
if (access(NewLibrary_ Cytore_, F_OK) != 0 && errno == ENOENT) {
if (access(NewCache_ Cytore_, F_OK) == 0)
system("mv -f " NewCache_ Cytore_ " " NewLibrary_);