summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-04-04 19:23:47 -0400
committerRich Felker <dalias@aerifal.cx>2013-04-04 19:23:47 -0400
commitddfb267b0e72499f6022981733264a063ec881f0 (patch)
tree854193fad4a1c8ba4dac7816a4bac90e16f15654
parent771c6cead0684487a0699750ff740e3d3894200a (diff)
downloadmusl-ddfb267b0e72499f6022981733264a063ec881f0.tar.gz
add put*ent functions for passwd/group files and similar for shadow
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.
-rw-r--r--include/grp.h1
-rw-r--r--include/pwd.h1
-rw-r--r--src/passwd/fgetspent.c11
-rw-r--r--src/passwd/putgrent.c14
-rw-r--r--src/passwd/putpwent.c9
5 files changed, 36 insertions, 0 deletions
diff --git a/include/grp.h b/include/grp.h
index 8e2e1f20..b331d326 100644
--- a/include/grp.h
+++ b/include/grp.h
@@ -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)
diff --git a/include/pwd.h b/include/pwd.h
index 91fe426f..55d9d42d 100644
--- a/include/pwd.h
+++ b/include/pwd.h
@@ -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
index 00000000..a9a3c970
--- /dev/null
+++ b/src/passwd/fgetspent.c
@@ -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
index 00000000..d7847b15
--- /dev/null
+++ b/src/passwd/putgrent.c
@@ -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
index 00000000..80fbf384
--- /dev/null
+++ b/src/passwd/putpwent.c
@@ -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;
+}