]> git.saurik.com Git - cydia.git/blobdiff - postinst.mm
Add more parts of Cydia that need to run as root.
[cydia.git] / postinst.mm
index a32691179822e94144d9026f110601e93559e213..bbef4c8aeeeb52bb90af221441431a0148970c83 100644 (file)
@@ -24,6 +24,44 @@ void Finish(const char *finish) {
     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];
@@ -98,6 +136,10 @@ int main(int argc, const char *argv[]) {
 
     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];
@@ -126,6 +168,8 @@ int main(int argc, const char *argv[]) {
 
     CydiaWriteSources();
 
+    FixPermissions();
+
     if (FixApplications())
         Finish("restart");