]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/shared/install-printf.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / shared / install-printf.c
index c2cbf348e2fff860425cd4806dc02e8a07fb5f65..d2143beda3a05a5364b7f25389791910d5956000 100644 (file)
@@ -1,9 +1,4 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
-/***
-  This file is part of systemd.
-
-  Copyright 2013 Zbigniew JÄ™drzejewski-Szmek
-***/
 
 #include <errno.h>
 #include <stdio.h>
@@ -19,7 +14,7 @@
 #include "unit-name.h"
 #include "user-util.h"
 
-static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
+static int specifier_prefix_and_instance(char specifier, const void *data, const void *userdata, char **ret) {
         const UnitFileInstallInfo *i = userdata;
         _cleanup_free_ char *prefix = NULL;
         int r;
@@ -43,7 +38,7 @@ static int specifier_prefix_and_instance(char specifier, void *data, void *userd
         return 0;
 }
 
-static int specifier_name(char specifier, void *data, void *userdata, char **ret) {
+static int specifier_name(char specifier, const void *data, const void *userdata, char **ret) {
         const UnitFileInstallInfo *i = userdata;
         char *ans;
 
@@ -59,7 +54,7 @@ static int specifier_name(char specifier, void *data, void *userdata, char **ret
         return 0;
 }
 
-static int specifier_prefix(char specifier, void *data, void *userdata, char **ret) {
+static int specifier_prefix(char specifier, const void *data, const void *userdata, char **ret) {
         const UnitFileInstallInfo *i = userdata;
 
         assert(i);
@@ -67,7 +62,7 @@ static int specifier_prefix(char specifier, void *data, void *userdata, char **r
         return unit_name_to_prefix(i->name, ret);
 }
 
-static int specifier_instance(char specifier, void *data, void *userdata, char **ret) {
+static int specifier_instance(char specifier, const void *data, const void *userdata, char **ret) {
         const UnitFileInstallInfo *i = userdata;
         char *instance;
         int r;
@@ -88,8 +83,28 @@ static int specifier_instance(char specifier, void *data, void *userdata, char *
         return 0;
 }
 
-int install_full_printf(UnitFileInstallInfo *i, const char *format, char **ret) {
+static int specifier_last_component(char specifier, const void *data, const void *userdata, char **ret) {
+        _cleanup_free_ char *prefix = NULL;
+        char *dash;
+        int r;
+
+        r = specifier_prefix(specifier, data, userdata, &prefix);
+        if (r < 0)
+                return r;
+
+        dash = strrchr(prefix, '-');
+        if (dash) {
+                dash = strdup(dash + 1);
+                if (!dash)
+                        return -ENOMEM;
+                *ret = dash;
+        } else
+                *ret = TAKE_PTR(prefix);
+
+        return 0;
+}
 
+int install_full_printf(const UnitFileInstallInfo *i, const char *format, char **ret) {
         /* This is similar to unit_full_printf() but does not support
          * anything path-related.
          *
@@ -111,7 +126,10 @@ int install_full_printf(UnitFileInstallInfo *i, const char *format, char **ret)
                 { 'N', specifier_prefix_and_instance, NULL },
                 { 'p', specifier_prefix,              NULL },
                 { 'i', specifier_instance,            NULL },
+                { 'j', specifier_last_component,      NULL },
 
+                { 'g', specifier_group_name,          NULL },
+                { 'G', specifier_group_id,            NULL },
                 { 'U', specifier_user_id,             NULL },
                 { 'u', specifier_user_name,           NULL },