This patch applies on top of the previous 2 cache patches. It does two
things, create the cache dir if it is missing, and moves the cache clearing
logic into the create cache routine, because if we are writing a new
cache .features file the cache dir should be cleared out.

Signed-off-by: John Johansen <[email protected]>

---
=== modified file 'parser/parser_main.c'
--- parser/parser_main.c        2013-09-23 22:26:51 +0000
+++ parser/parser_main.c        2013-09-23 23:09:21 +0000
@@ -1260,20 +1260,42 @@
        return error;
 }
 
-static int create_cache(const char *path, const char *features)
+static int create_cache(const char *cachedir, const char *path,
+                       const char *features)
 {
+       struct stat stat_file;
        FILE * f = NULL;
 
+       if (cond_clear_cache && clear_cache_files(cacheloc) != 0)
+               goto error;
+
+create_file:
        f = fopen(path, "w");
        if (f) {
                if (fwrite(features, strlen(features), 1, f) != 1 )
-                       goto fail;
+                       goto error;
 
                fclose(f);
-       }
-
-       return 0;
-fail:
+
+
+               return 0;
+       }
+
+error:
+       /* does the dir exist? */
+       if (stat(cachedir, &stat_file) == -1) {
+               if (mkdir(cachedir, 0700) == 0)
+                       goto create_file;
+               if (show_cache)
+                       PERROR(_("Can't create cache directory: %s\n"), 
cachedir);
+       } else if (!S_ISDIR(stat_file.st_mode)) {
+               if (show_cache)
+                       PERROR(_("File in cache directory location: %s\n"), 
cachedir);
+       } else {
+               if (show_cache)
+                       PERROR(_("Can't update cache directory: %s\n"), 
cachedir);
+       }
+
        if (show_cache)
                PERROR("Cache write disabled: cannot create %s\n", path);
        write_cache = 0;
@@ -1319,12 +1341,10 @@
        get_flags_string(&cache_flags, cache_features_path);
        if (cache_flags) {
                if (strcmp(flags_string, cache_flags) != 0) {
-                       if (write_cache && cond_clear_cache) {
-                               if (clear_cache_files(cacheloc) ||
-                                   create_cache(cache_features_path,
-                                                flags_string)) {
+                       if (write_cache) {
+                               if (create_cache(cacheloc, cache_features_path,
+                                                flags_string))
                                        skip_read_cache = 1;
-                               }
                        } else {
                                if (show_cache)
                                        PERROR("Cache read/write disabled: %s 
does not match %s\n", FLAGS_FILE, cache_features_path);
@@ -1335,7 +1355,7 @@
                free(cache_flags);
                cache_flags = NULL;
        } else if (write_cache) {
-               create_cache(cache_features_path, flags_string);
+               create_cache(cacheloc, cache_features_path, flags_string);
        }
 
        free(cache_features_path);



-- 
AppArmor mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/apparmor

Reply via email to