1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
5 #include "install-printf.h"
7 #include "string-util.h"
10 static int specifier_prefix_and_instance(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
11 const InstallInfo
*i
= ASSERT_PTR(userdata
);
12 _cleanup_free_
char *prefix
= NULL
;
15 r
= unit_name_to_prefix_and_instance(i
->name
, &prefix
);
19 if (endswith(prefix
, "@") && i
->default_instance
) {
22 ans
= strjoin(prefix
, i
->default_instance
);
27 *ret
= TAKE_PTR(prefix
);
32 static int specifier_name(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
33 const InstallInfo
*i
= ASSERT_PTR(userdata
);
35 if (unit_name_is_valid(i
->name
, UNIT_NAME_TEMPLATE
) && i
->default_instance
)
36 return unit_name_replace_instance(i
->name
, i
->default_instance
, ret
);
38 return strdup_to(ret
, i
->name
);
41 static int specifier_prefix(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
42 const InstallInfo
*i
= ASSERT_PTR(userdata
);
44 return unit_name_to_prefix(i
->name
, ret
);
47 static int specifier_instance(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
48 const InstallInfo
*i
= ASSERT_PTR(userdata
);
52 r
= unit_name_to_instance(i
->name
, &instance
);
56 if (isempty(instance
)) {
57 r
= free_and_strdup(&instance
, strempty(i
->default_instance
));
66 static int specifier_last_component(char specifier
, const void *data
, const char *root
, const void *userdata
, char **ret
) {
67 _cleanup_free_
char *prefix
= NULL
;
73 r
= specifier_prefix(specifier
, data
, root
, userdata
, &prefix
);
77 dash
= strrchr(prefix
, '-');
79 return strdup_to(ret
, dash
+ 1);
81 *ret
= TAKE_PTR(prefix
);
85 int install_name_printf(
87 const InstallInfo
*info
,
90 /* This is similar to unit_name_printf() */
92 const Specifier table
[] = {
93 { 'i', specifier_instance
, NULL
},
94 { 'j', specifier_last_component
, NULL
},
95 { 'n', specifier_name
, NULL
},
96 { 'N', specifier_prefix_and_instance
, NULL
},
97 { 'p', specifier_prefix
, NULL
},
99 COMMON_SYSTEM_SPECIFIERS
,
101 COMMON_CREDS_SPECIFIERS(scope
),
109 return specifier_printf(format
, UNIT_NAME_MAX
, table
, info
->root
, info
, ret
);