add put*ent functions for passwd/group files and similar for shadow
authorRich Felker <dalias@aerifal.cx>
Thu, 4 Apr 2013 23:23:47 +0000 (19:23 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 4 Apr 2013 23:23:47 +0000 (19:23 -0400)
since shadow does not yet support enumeration (getspent), the
corresponding FILE-based get and put versions are also subbed out for
now. this is partly out of laziness and partly because it's not clear
how they should work in the presence of TCB shadow files. the stubs
should make it possible to compile some software that expects them to
exist, but such software still may not work properly.

include/grp.h
include/pwd.h
src/passwd/fgetspent.c [new file with mode: 0644]
src/passwd/putgrent.c [new file with mode: 0644]
src/passwd/putpwent.c [new file with mode: 0644]

index 8e2e1f20302cb90b3caaa791e0c8c43a1ade379c..b331d3264c0f1eb4a9844d8a54e4143e514d9609 100644 (file)
@@ -36,6 +36,7 @@ void           setgrent(void);
 
 #ifdef _GNU_SOURCE
 struct group  *fgetgrent(FILE *stream);
+int putgrent(const struct group *, FILE *);
 #endif
 
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
index 91fe426fe3205227d7576cb3a06b4bd6c4da008c..55d9d42d379e9146d12c8e8a2fcd6f2b15af9288 100644 (file)
@@ -39,6 +39,7 @@ int getpwnam_r (const char *, struct passwd *, char *, size_t, struct passwd **)
 
 #ifdef _GNU_SOURCE
 struct passwd *fgetpwent(FILE *);
+int putpwent(const struct passwd *, FILE *);
 #endif
 
 #ifdef __cplusplus
diff --git a/src/passwd/fgetspent.c b/src/passwd/fgetspent.c
new file mode 100644 (file)
index 0000000..a9a3c97
--- /dev/null
@@ -0,0 +1,11 @@
+#include "pwf.h"
+
+struct spwd *fgetspent(FILE *f)
+{
+       return 0;
+}
+
+int putspent(const struct spwd *sp, FILE *f)
+{
+       return -1;
+}
diff --git a/src/passwd/putgrent.c b/src/passwd/putgrent.c
new file mode 100644 (file)
index 0000000..d7847b1
--- /dev/null
@@ -0,0 +1,14 @@
+#include <grp.h>
+#include <stdio.h>
+
+int putgrent(const struct group *gr, FILE *f)
+{
+       int r;
+       size_t i;
+       flockfile(f);
+       r = fprintf(f, "%s:%s:%d:", gr->gr_name, gr->gr_passwd, gr->gr_gid);
+       if (gr->gr_mem) for (i=0; gr->gr_mem[i]; i++)
+               if (fprintf(f, "%s%s", i?",":"", gr->gr_mem[i])<0) r = -1;
+       funlockfile(f);
+       return r<0 ? -1 : 0;
+}
diff --git a/src/passwd/putpwent.c b/src/passwd/putpwent.c
new file mode 100644 (file)
index 0000000..80fbf38
--- /dev/null
@@ -0,0 +1,9 @@
+#include <pwd.h>
+#include <stdio.h>
+
+int putpwent(const struct passwd *pw, FILE *f)
+{
+       return fprintf(f, "%s:%s:%d:%d:%s:%s:%s\n",
+               pw->pw_name, pw->pw_passwd, pw->pw_uid, pw->pw_gid,
+               pw->pw_gecos, pw->pw_dir, pw->pw_shell)<0 ? -1 : 0;
+}