1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main (int argn, char **argv) {
int valid_change;
int pfd; /* Integer for file descriptor returned by open(). */
FILE *fpfd; /* File pointer for use in putpwent(). */
struct passwd *p;
char *user;
char *newpasswd;
char savepasswd[100];
if (argn < 3) {
printf ("Three argumets are required: file username passwd\n");
exit (1);
} else {
pfd = open (argv[1], O_RDWR | O_CREAT, 0600);
fpfd = fdopen (pfd, "r+");
user = argv[2];
newpasswd = argv[3];
}
valid_change = 0; long pos = ftell (fpfd);
while ((p = fgetpwent(fpfd)) != NULL) {
/* Change entry if found. */
if (strcmp(p->pw_name, user) == 0) {
strncpy(savepasswd, (char*)crypt(newpasswd, user), 100);
savepasswd[99] = '\0';
p->pw_passwd = savepasswd;
p->pw_uid = 100;
p->pw_gid = 100;
p->pw_gecos = "Dcap User" ;
p->pw_dir = "/tmp";
p->pw_shell = "/bin/false";
valid_change = 1;
printf ("User %s found -- changin password \n", p->pw_name);
/* Put passwd entry into ptmp. */
fseek (fpfd, pos, SEEK_SET);
putpwent(p, fpfd);
} else {
pos = ftell (fpfd);
}
}
if (valid_change == 0) {
printf ("User not found -- adding \n");
p = (struct passwd *) malloc (sizeof (struct passwd));
p->pw_name = user;
strncpy(savepasswd, (char*)crypt(newpasswd, user), 100);
savepasswd[99] = '\0';
p->pw_passwd = savepasswd;
p->pw_uid = 100;
p->pw_gid = 100;
p->pw_gecos = "Dcap User" ;
p->pw_dir = "/tmp";
p->pw_shell = "/bin/false";
putpwent(p, fpfd);
free (p);
}
fclose (fpfd); close (pfd);
return 0;
}
|