passwd-util: add conversion for passwd entries to sysusers
Adds initial implementation of converting passwd entries(read from /etc/passwd file) into sysuser_ent structs. The converted sysuser_ent struct will then get tracked inside a pointer array. Closes: #1519 Approved by: cgwalters
This commit is contained in:
parent
e752b5aec1
commit
69cd195c3a
@ -186,6 +186,17 @@ conv_group_ent_free (void *vptr)
|
||||
g_free (ptr);
|
||||
}
|
||||
|
||||
static void
|
||||
sysuser_ent_free (void *vptr)
|
||||
{
|
||||
struct sysuser_ent *ptr = vptr;
|
||||
g_free (ptr->name);
|
||||
g_free (ptr->id);
|
||||
g_free (ptr->gecos);
|
||||
g_free (ptr->dir);
|
||||
g_free (ptr->shell);
|
||||
}
|
||||
|
||||
GPtrArray *
|
||||
rpmostree_passwd_data2groupents (const char *data)
|
||||
{
|
||||
@ -217,6 +228,47 @@ compare_group_ents (gconstpointer a, gconstpointer b)
|
||||
return strcmp ((*sa)->name, (*sb)->name);
|
||||
}
|
||||
|
||||
gboolean
|
||||
rpmostree_passwdents2sysusers (GPtrArray *passwd_ents,
|
||||
GPtrArray **out_sysusers_entries,
|
||||
GError **error)
|
||||
{
|
||||
/* Do the assignment inside the function so we don't need to expose sysuser_ent
|
||||
* to other files */
|
||||
GPtrArray *sysusers_array = NULL;
|
||||
sysusers_array = *out_sysusers_entries ?: g_ptr_array_new_with_free_func (sysuser_ent_free);
|
||||
|
||||
for (int counter = 0; counter < passwd_ents->len; counter++)
|
||||
{
|
||||
struct conv_passwd_ent *convent = passwd_ents->pdata[counter];
|
||||
struct sysuser_ent *sysent = g_new (struct sysuser_ent, 1);
|
||||
|
||||
/* Systemd-sysusers also supports uid:gid format. That case was used
|
||||
* when creating user and group pairs with different numeric UID and GID values.*/
|
||||
if (convent->uid != convent->gid)
|
||||
sysent->id = g_strdup_printf ("%u:%u", convent->uid, convent->gid);
|
||||
else
|
||||
sysent->id = g_strdup_printf ("%u", convent->uid);
|
||||
|
||||
sysent->type = "u";
|
||||
sysent->name = g_strdup (convent->name);
|
||||
|
||||
/* Gecos may contain multiple words, thus adding a quote here to make it as a 'word' */
|
||||
sysent->gecos = (g_str_equal (convent->pw_gecos, "")) ? NULL :
|
||||
g_strdup_printf ("\"%s\"", convent->pw_gecos);
|
||||
sysent->dir = (g_str_equal (convent->pw_dir, ""))? NULL :
|
||||
g_steal_pointer (&convent->pw_dir);
|
||||
sysent->shell = g_steal_pointer (&convent->pw_shell);
|
||||
|
||||
g_ptr_array_add (sysusers_array, sysent);
|
||||
}
|
||||
/* Do the assignment at the end if the sysusers_table was not initialized */
|
||||
if (*out_sysusers_entries == NULL)
|
||||
*out_sysusers_entries = g_steal_pointer (&sysusers_array);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* See "man 5 passwd" We just make sure the name and uid/gid match,
|
||||
and that none are missing. don't care about GECOS/dir/shell.
|
||||
*/
|
||||
|
@ -117,3 +117,8 @@ rpmostree_passwd_data2passwdents (const char *data);
|
||||
|
||||
GPtrArray *
|
||||
rpmostree_passwd_data2groupents (const char *data);
|
||||
|
||||
gboolean
|
||||
rpmostree_passwdents2sysusers (GPtrArray *passwd_ents,
|
||||
GPtrArray **out_sysusers_entries,
|
||||
GError **error);
|
||||
|
Loading…
Reference in New Issue
Block a user