From: Jarkko Sakkinen Date: Thu, 10 Nov 2011 10:18:40 +0000 (+0200) Subject: Cleaned up factory methods. X-Git-Tag: accepted/trunk/20130107.204027~53 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ba2d257d9e09ee64ce65e5ea506dc0311d56009d;p=platform%2Fupstream%2Fsmack.git Cleaned up factory methods. --- diff --git a/libsmack/libsmack.c b/libsmack/libsmack.c index 8e8e3af..daa1ff2 100644 --- a/libsmack/libsmack.c +++ b/libsmack/libsmack.c @@ -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) diff --git a/libsmack/libsmack.h b/libsmack/libsmack.h index 2840c74..98e0914 100644 --- a/libsmack/libsmack.h +++ b/libsmack/libsmack.h @@ -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. diff --git a/libsmack/libsmack.sym b/libsmack/libsmack.sym index 8cbbb7d..e983ea6 100644 --- a/libsmack/libsmack.sym +++ b/libsmack/libsmack.sym @@ -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; diff --git a/utils/smackctl.c b/utils/smackctl.c index 065c971..afb49d8 100644 --- a/utils/smackctl.c +++ b/utils/smackctl.c @@ -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");