]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/offline-passwd.c
8ac5431c66da8545ec480c5c3c85d86e17803bb2
1 /* SPDX-License-Identifier: LGPL-2.1+ */
4 #include "offline-passwd.h"
8 DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(uid_gid_hash_ops
, char, string_hash_func
, string_compare_func
, free
);
10 int name_to_uid_offline(
24 _cleanup_(hashmap_freep
) Hashmap
*uid_by_name
= NULL
;
25 _cleanup_fclose_
FILE *f
= NULL
;
27 const char *passwd_path
;
29 passwd_path
= prefix_roota(root
, "/etc/passwd");
30 f
= fopen(passwd_path
, "re");
32 return errno
== ENOENT
? -ESRCH
: -errno
;
34 uid_by_name
= hashmap_new(&uid_gid_hash_ops
);
38 while ((r
= fgetpwent_sane(f
, &pw
)) > 0) {
39 _cleanup_free_
char *n
= NULL
;
41 n
= strdup(pw
->pw_name
);
45 r
= hashmap_put(uid_by_name
, n
, UID_TO_PTR(pw
->pw_uid
));
47 log_warning_errno(r
, "Duplicate entry in %s for %s: %m", passwd_path
, pw
->pw_name
);
56 *cache
= TAKE_PTR(uid_by_name
);
59 found
= hashmap_get(*cache
, user
);
63 *ret_uid
= PTR_TO_UID(found
);
67 int name_to_gid_offline(
81 _cleanup_(hashmap_freep
) Hashmap
*gid_by_name
= NULL
;
82 _cleanup_fclose_
FILE *f
= NULL
;
84 const char *group_path
;
86 group_path
= prefix_roota(root
, "/etc/group");
87 f
= fopen(group_path
, "re");
89 return errno
== ENOENT
? -ESRCH
: -errno
;
91 gid_by_name
= hashmap_new(&uid_gid_hash_ops
);
95 while ((r
= fgetgrent_sane(f
, &gr
)) > 0) {
96 _cleanup_free_
char *n
= NULL
;
98 n
= strdup(gr
->gr_name
);
102 r
= hashmap_put(gid_by_name
, n
, GID_TO_PTR(gr
->gr_gid
));
104 log_warning_errno(r
, "Duplicate entry in %s for %s: %m", group_path
, gr
->gr_name
);
113 *cache
= TAKE_PTR(gid_by_name
);
116 found
= hashmap_get(*cache
, group
);
120 *ret_gid
= PTR_TO_GID(found
);