]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/pw_nis.c
PREFIX stuff
[pw-darwin.git] / pw / pw_nis.c
index 3b041a8dd693894b5a1bee375bd9e266c6b3c22c..4b70bc1de1f67995c566ada1b0f6d5501295a1f8 100644 (file)
@@ -1,4 +1,6 @@
 /*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
  * Copyright (C) 1996
  *     David L. Nugent.  All rights reserved.
  *
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: pw_nis.c,v 1.4 1997/10/10 06:23:38 charnier Exp $";
+  "$FreeBSD$";
 #endif /* not lint */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 #include <sys/types.h>
 
+#include <err.h>
+#include <pwd.h>
+#include <libutil.h>
+#include <unistd.h>
+
 #include "pw.h"
 
 static int
-pw_nisupdate(const char * path, struct passwd * pwd, char const * user, int mode)
+pw_nisupdate(const char * path, struct passwd * pwd, char const * user)
 {
-       char            pfx[32];
-       char            pwbuf[PWBUFSZ];
-       int             l = sprintf(pfx, "%s:", user);
+       int pfd, tfd;
+       struct passwd *pw = NULL;
+       struct passwd *old_pw = NULL;
+
+       printf("===> %s\n", path);
+       if (pwd != NULL)
+               pw = pw_dup(pwd);
+
+       if (user != NULL)
+               old_pw = GETPWNAM(user);
+
+       if (pw_init(NULL, path))
+               err(1,"pw_init()");
+       if ((pfd = pw_lock()) == -1) {
+               pw_fini();
+               err(1, "pw_lock()");
+       }
+       if ((tfd = pw_tmp(-1)) == -1) {
+               pw_fini();
+               err(1, "pw_tmp()");
+       }
+       if (pw_copy(pfd, tfd, pw, old_pw) == -1) {
+               pw_fini();
+               close(tfd);
+               err(1, "pw_copy()");
+       }
+       fsync(tfd);
+       close(tfd);
+       if (chmod(pw_tempname(), 0644) == -1)
+               err(1, "chmod()");
+       if (rename(pw_tempname(), path) == -1)
+               err(1, "rename()");
+
+       free(pw);
+       pw_fini();
 
-       /*
-        * Update the passwd file first
-        */
-       if (pwd == NULL)
-               *pwbuf = '\0';
-       else
-               fmtpwentry(pwbuf, pwd, PWF_MASTER);
-       return fileupdate(path, 0600, pwbuf, pfx, l, mode) != 0;
+       return (0);
 }
 
 int
 addnispwent(const char *path, struct passwd * pwd)
 {
-       return pw_nisupdate(path, pwd, pwd->pw_name, UPD_CREATE);
+       return pw_nisupdate(path, pwd, NULL);
 }
 
 int
 chgnispwent(const char *path, char const * login, struct passwd * pwd)
 {
-       return pw_nisupdate(path, pwd, login, UPD_REPLACE);
+       return pw_nisupdate(path, pwd, login);
 }
 
 int
 delnispwent(const char *path, const char *login)
 {
-       return pw_nisupdate(path, NULL, login, UPD_DELETE);
+       return pw_nisupdate(path, NULL, login);
 }