diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-09-28 18:30:02 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-09-28 18:30:43 +0200 |
commit | a7d3cc26f9694053712458615006ea79cd7a7cb4 (patch) | |
tree | 44ced9874d781d1374d6da19ab37ab22af2bc32e /src | |
parent | 15917fb09b669021d1f20ddc1f468d156b05a8e0 (diff) |
service: when resolving sysv names drop leading $
Diffstat (limited to 'src')
-rw-r--r-- | src/service.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/src/service.c b/src/service.c index 021bc86766..cf5edd2b9b 100644 --- a/src/service.c +++ b/src/service.c @@ -252,48 +252,62 @@ static char *sysv_translate_name(const char *name) { static int sysv_translate_facility(const char *name, char **_r) { + /* We silently ignore the $ prefix here. According to the LSB + * spec it simply indicates whether something is a + * standardized name or a distribution-specific one. Since we + * just follow what already exists and do not introduce new + * uses or names we don't care who introduced a new name. */ + static const char * const table[] = { /* LSB defined facilities */ - "$local_fs", SPECIAL_LOCAL_FS_TARGET, - "$network", SPECIAL_NETWORK_TARGET, - "$named", SPECIAL_NSS_LOOKUP_TARGET, - "$portmap", SPECIAL_RPCBIND_TARGET, - "$remote_fs", SPECIAL_REMOTE_FS_TARGET, - "$syslog", SPECIAL_SYSLOG_TARGET, - "$time", SPECIAL_RTC_SET_TARGET, + "local_fs", SPECIAL_LOCAL_FS_TARGET, + "network", SPECIAL_NETWORK_TARGET, + "named", SPECIAL_NSS_LOOKUP_TARGET, + "portmap", SPECIAL_RPCBIND_TARGET, + "remote_fs", SPECIAL_REMOTE_FS_TARGET, + "syslog", SPECIAL_SYSLOG_TARGET, + "time", SPECIAL_RTC_SET_TARGET, /* Debian extensions */ #ifdef TARGET_DEBIAN - "$mail-transport-agent", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, + "mail-transport-agent", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, #endif - "$mail-transfer-agent", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, - "$x-display-manager", SPECIAL_DISPLAY_MANAGER_SERVICE, + "mail-transfer-agent", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, + "x-display-manager", SPECIAL_DISPLAY_MANAGER_SERVICE, #ifdef TARGET_FEDORA - /* Fedora extensions, lacking the $ prefix */ - "MTA", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, - "smtpdaemon", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, - "httpd", SPECIAL_HTTP_DAEMON_TARGET, + /* Fedora extensions */ + "MTA", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, + "smtpdaemon", SPECIAL_MAIL_TRANSFER_AGENT_TARGET, + "httpd", SPECIAL_HTTP_DAEMON_TARGET, #endif + + /* SuSE extensions */ + "null", NULL + }; unsigned i; char *r; - /* SuSE insserv extension */ - if (streq(name, "$null")) - return 0; - for (i = 0; i < ELEMENTSOF(table); i += 2) - if (streq(table[i], name)) { + + if (streq(table[i], name) || + (*name == '$' && streq(table[i], name+1))) { + + if (!table[i+1]) + return 0; + if (!(r = strdup(table[i+1]))) return -ENOMEM; goto finish; } + /* If we don't know this name, fallback heuristics to figure + * out whether something is a target or an service alias. */ + if (*name == '$') - /* This is a heuristic. */ r = unit_name_build(name+1, NULL, ".target"); else r = sysv_translate_name(name); |