fclose(fout);
}
+static bool FixProtections() {
+ for (const char *path : (const char *[]) {"/var/lib", "/var/cache", "/var/stash"}) {
+ mkdir(path, 0755);
+ if (system([[NSString stringWithFormat:@"/usr/libexec/cydia/setnsfpn %s", path] UTF8String]) != 0) {
+ fprintf(stderr, "failed to setnsfpn %s\n", path);
+ return false;
+ }
+ }
+ return true;
+}
+
+static void FixPermissions() {
+ DIR *stash(opendir("/var/stash"));
+ if (stash == NULL)
+ return;
+
+ while (dirent *entry = readdir(stash)) {
+ const char *folder(entry->d_name);
+ if (strlen(folder) != 8)
+ continue;
+ if (strncmp(folder, "_.", 2) != 0)
+ continue;
+
+ char path[1024];
+ sprintf(path, "/var/stash/%s", folder);
+
+ struct stat stat;
+ if (lstat(path, &stat) == -1)
+ continue;
+ if (!S_ISDIR(stat.st_mode))
+ continue;
+
+ chmod(path, 0755);
+ }
+
+ closedir(stash);
+}
+
#define APPLICATIONS "/Applications"
static bool FixApplications() {
char target[1024];
fprintf(stderr, "/Applications damaged -- DO NOT REBOOT\n");
goto undo;
} else {
- if (symlink(destiny, APPLICATIONS) == -1)
+ bool success;
+ if (symlink(destiny, APPLICATIONS) != -1)
+ success = true;
+ else {
fprintf(stderr, "/var/stash/Applications damaged -- DO NOT REBOOT\n");
+ success = false;
+ }
// unneccessary, but feels better (I'm nervous)
symlink(destiny, target);
[@APPLICATIONS writeToFile:[NSString stringWithFormat:@"%s.lnk", temp] atomically:YES encoding:NSNonLossyASCIIStringEncoding error:NULL];
- return true;
+ return success;
}
}
NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]);
+ if (kCFCoreFoundationVersionNumber >= 1000)
+ if (!FixProtections())
+ return 1;
+
size_t size;
sysctlbyname("kern.osversion", NULL, &size, NULL, 0);
char *osversion = new char[size];
CydiaWriteSources();
+ FixPermissions();
+
if (FixApplications())
Finish("restart");