Cleaned up factory methods.
authorJarkko Sakkinen <jarkko.sakkinen@iki.fi>
Thu, 10 Nov 2011 10:18:40 +0000 (12:18 +0200)
committerJarkko Sakkinen <jarkko.sakkinen@iki.fi>
Thu, 10 Nov 2011 10:18:40 +0000 (12:18 +0200)
libsmack/libsmack.c
libsmack/libsmack.h
libsmack/libsmack.sym
utils/smackctl.c

index 8e8e3af..daa1ff2 100644 (file)
@@ -64,33 +64,38 @@ inline int access_type_to_int(const char *access_type);
 inline void int_to_access_type_c(unsigned ac, char *str);
 inline void int_to_access_type_k(unsigned ac, char *str);
 
-struct smack_accesses *smack_accesses_new(int fd)
+int smack_accesses_new(struct smack_accesses **accesses)
 {
-       struct smack_accesses *rules;
-       FILE *file;
+       struct smack_accesses *result;
+
+       result = calloc(sizeof(struct smack_accesses), 1);
+       if (result == NULL)
+               return -1;
+
+       *accesses = result;
+       return 0;
+}
+
+int smack_accesses_new_from_file(int fd, struct smack_accesses **accesses)
+{
+       struct smack_accesses *result = NULL;
+       FILE *file = NULL;
        char buf[READ_BUF_SIZE];
        char *ptr;
        const char *subject, *object, *access;
        int newfd;
 
-       rules = calloc(sizeof(struct smack_accesses), 1);
-       if (rules == NULL)
-               return NULL;
-
-       if (fd < 0)
-               return rules;
+       if (smack_accesses_new(&result))
+               goto err_out;
 
        newfd = dup(fd);
-       if (newfd == -1) {
-               free(rules);
-               return NULL;
-       }
+       if (newfd == -1)
+               goto err_out;
 
        file = fdopen(newfd, "r");
        if (file == NULL) {
                close(newfd);
-               free(rules);
-               return NULL;
+               goto err_out;
        }
 
        while (fgets(buf, READ_BUF_SIZE, file) != NULL) {
@@ -104,7 +109,7 @@ struct smack_accesses *smack_accesses_new(int fd)
                        goto err_out;
                }
 
-               if (smack_accesses_add(rules, subject, object, access))
+               if (smack_accesses_add(result, subject, object, access))
                        goto err_out;
        }
 
@@ -112,11 +117,12 @@ struct smack_accesses *smack_accesses_new(int fd)
                goto err_out;
 
        fclose(file);
-       return rules;
+       *accesses = result;
+       return 0;
 err_out:
        fclose(file);
-       smack_accesses_free(rules);
-       return NULL;
+       smack_accesses_free(result);
+       return -1;
 }
 
 void smack_accesses_free(struct smack_accesses *handle)
index 2840c74..98e0914 100644 (file)
@@ -46,13 +46,22 @@ struct smack_accesses;
 #endif
 
 /*!
- * Creates a new struct smack_accesses *instance. If fd >= 0, rule set is read from the
- * given file. Otherwise, empty rule set is created.
+ * Creates a new empty smack_accesses instance.
+ *
+ * @param created instance
+ * @return 0 on success and negative value on failure.
+ */
+int smack_accesses_new(struct smack_accesses **accesses);
+
+/*!
+ * Creates a new smack_accesses instance from a given
+ * file descriptor.
  *
  * @param fd file descriptor
- * @return struct smack_accesses *instance on success
+ * @param created instance
+ * @return 0 on success and negative value on failure.
  */
-struct smack_accesses *smack_accesses_new(int fd);
+int smack_accesses_new_from_file(int fd, struct smack_accesses **accesses);
 
 /*!
  * Destroy a struct smack_accesses *instance.
index 8cbbb7d..e983ea6 100644 (file)
@@ -1,6 +1,7 @@
 LIBSMACK_1.0 {
 global:
        smack_accesses_new;
+       smack_accesses_new_from_file;
        smack_accesses_free;
        smack_accesses_save;
        smack_accesses_apply;
index 065c971..afb49d8 100644 (file)
@@ -243,7 +243,7 @@ static int apply_rules(const char *path, int flags)
                return -1;
        }
 
-       rules = smack_accesses_new(fd);
+       ret = smack_accesses_new_from_file(fd, &rules);
        close(fd);
        if (rules == NULL) {
                perror("smack_accesses_new");