diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-09-17 10:03:46 -0500 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-09-17 10:06:50 -0500 |
commit | 19f6d710772305610b928bc2678b9d77fe11e770 (patch) | |
tree | ca3e7b4f7f20f94137fcef96b92a7a208c72e1c5 /src/shared/install-printf.c | |
parent | 0aafd43d235982510d1c40564079f7bcec0c7c19 (diff) |
specifier: rework specifier calls to return proper error message
Previously the specifier calls could only indicate OOM by returning
NULL. With this change they will return negative errno-style error codes
like everything else.
Diffstat (limited to 'src/shared/install-printf.c')
-rw-r--r-- | src/shared/install-printf.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/src/shared/install-printf.c b/src/shared/install-printf.c index 1157ea989b..1ee1243f4d 100644 --- a/src/shared/install-printf.c +++ b/src/shared/install-printf.c @@ -27,21 +27,35 @@ #include "util.h" #include "install-printf.h" -static char *specifier_prefix_and_instance(char specifier, void *data, void *userdata) { +static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) { InstallInfo *i = userdata; + char *n; + assert(i); - return unit_name_to_prefix_and_instance(i->name); + n = unit_name_to_prefix_and_instance(i->name); + if (!n) + return -ENOMEM; + + *ret = n; + return 0; } -static char *specifier_prefix(char specifier, void *data, void *userdata) { +static int specifier_prefix(char specifier, void *data, void *userdata, char **ret) { InstallInfo *i = userdata; + char *n; + assert(i); - return unit_name_to_prefix(i->name); + n = unit_name_to_prefix(i->name); + if (!n) + return -ENOMEM; + + *ret = n; + return 0; } -static char *specifier_instance(char specifier, void *data, void *userdata) { +static int specifier_instance(char specifier, void *data, void *userdata, char **ret) { InstallInfo *i = userdata; char *instance; int r; @@ -50,14 +64,19 @@ static char *specifier_instance(char specifier, void *data, void *userdata) { r = unit_name_to_instance(i->name, &instance); if (r < 0) - return NULL; - if (instance != NULL) - return instance; - else - return strdup(""); + return r; + + if (!instance) { + instance = strdup(""); + if (!instance) + return -ENOMEM; + } + + *ret = instance; + return 0; } -static char *specifier_user_name(char specifier, void *data, void *userdata) { +static int specifier_user_name(char specifier, void *data, void *userdata, char **ret) { InstallInfo *i = userdata; const char *username; _cleanup_free_ char *tmp = NULL; @@ -82,18 +101,20 @@ static char *specifier_user_name(char specifier, void *data, void *userdata) { r = get_user_creds(&username, &uid, NULL, NULL, NULL); if (r < 0) - return NULL; + return r; if (asprintf(&printed, "%d", uid) < 0) - return NULL; + return -ENOMEM; break; }} - return printed; + + *ret = printed; + return 0; } -char *install_full_printf(InstallInfo *i, const char *format) { +int install_full_printf(InstallInfo *i, const char *format, char **ret) { /* This is similar to unit_full_printf() but does not support * anything path-related. @@ -129,6 +150,7 @@ char *install_full_printf(InstallInfo *i, const char *format) { assert(i); assert(format); + assert(ret); - return specifier_printf(format, table, i); + return specifier_printf(format, table, i, ret); } |