1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
7 #include "format-util.h"
8 #include "install-printf.h"
11 #include "specifier.h"
12 #include "string-util.h"
13 #include "unit-name.h"
14 #include "user-util.h"
16 static int specifier_prefix_and_instance(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
17 const InstallInfo
*i
= ASSERT_PTR(userdata
);
18 _cleanup_free_
char *prefix
= NULL
;
21 r
= unit_name_to_prefix_and_instance(i
->name
, &prefix
);
25 if (endswith(prefix
, "@") && i
->default_instance
) {
28 ans
= strjoin(prefix
, i
->default_instance
);
33 *ret
= TAKE_PTR(prefix
);
38 static int specifier_name(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
39 const InstallInfo
*i
= ASSERT_PTR(userdata
);
42 if (unit_name_is_valid(i
->name
, UNIT_NAME_TEMPLATE
) && i
->default_instance
)
43 return unit_name_replace_instance(i
->name
, i
->default_instance
, ret
);
45 ans
= strdup(i
->name
);
52 static int specifier_prefix(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
53 const InstallInfo
*i
= ASSERT_PTR(userdata
);
55 return unit_name_to_prefix(i
->name
, ret
);
58 static int specifier_instance(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
59 const InstallInfo
*i
= ASSERT_PTR(userdata
);
63 r
= unit_name_to_instance(i
->name
, &instance
);
67 if (isempty(instance
)) {
68 r
= free_and_strdup(&instance
, strempty(i
->default_instance
));
77 static int specifier_last_component(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
78 _cleanup_free_
char *prefix
= NULL
;
84 r
= specifier_prefix(specifier
, data
, root
, userdata
, &prefix
);
88 dash
= strrchr(prefix
, '-');
90 dash
= strdup(dash
+ 1);
95 *ret
= TAKE_PTR(prefix
);
100 int install_name_printf(
102 const InstallInfo
*info
,
105 /* This is similar to unit_name_printf() */
107 const Specifier table
[] = {
108 { 'i', specifier_instance
, NULL
},
109 { 'j', specifier_last_component
, NULL
},
110 { 'n', specifier_name
, NULL
},
111 { 'N', specifier_prefix_and_instance
, NULL
},
112 { 'p', specifier_prefix
, NULL
},
114 COMMON_SYSTEM_SPECIFIERS
,
116 COMMON_CREDS_SPECIFIERS(scope
),
124 return specifier_printf(format
, UNIT_NAME_MAX
, table
, info
->root
, info
, ret
);