home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include <pwd.h>
-
- struct passwd *getpwnam(char *name)
- {
- static struct passwd pw;
- static char buffer[256];
- char *ptr;
- FILE *passwd;
- int found = 0;
-
- if ((ptr = getenv("ETC")) == NULL)
- return NULL;
-
- strcpy(buffer, ptr);
- strcat(buffer, "/passwd");
-
- if ( (passwd = fopen(buffer, "r")) == NULL )
- return NULL;
-
- while ( fgets(buffer, sizeof(buffer), passwd) != NULL )
- {
- if (buffer[strlen(buffer) - 1] == '\n')
- buffer[strlen(buffer) - 1] = 0;
-
- if ( buffer[0] == '#' )
- continue;
-
- pw.pw_name = buffer;
-
- if ( (ptr = strchr(buffer, ':')) != NULL )
- *ptr++ = 0;
- else
- continue;
-
- if ( strcmp(name, pw.pw_name) == 0 )
- {
- pw.pw_passwd = ptr;
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- continue;
-
- pw.pw_uid = atoi(ptr);
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- continue;
-
- pw.pw_gid = atoi(ptr);
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- continue;
-
- pw.pw_gecos = ptr;
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- continue;
-
- pw.pw_dir = ptr;
-
- if ( ptr[0] && ptr[1] && (ptr = strchr(ptr + 2, ':')) != NULL )
- *ptr++ = 0; /* skip drive: */
-
- found = 1;
-
- break;
- }
- }
-
- fclose(passwd);
-
- if ( !found )
- return NULL;
-
- return &pw;
- }
-
- int setpwnam(char *name, char *crypted)
- {
- static struct passwd pw;
- static char old[256], new[256], bak[256], line[256], buffer[256];
- char *ptr;
- FILE *passwd, *newpasswd;
- int found = 0;
-
- if ((ptr = getenv("ETC")) == NULL)
- return NULL;
-
- strcpy(old, ptr);
- strcat(old, "/passwd");
- strcpy(new, old);
- strcat(new, ".new");
- strcpy(bak, old);
- strcat(bak, ".bak");
-
- if ( (passwd = fopen(old, "r")) == NULL )
- return -1;
-
- if ( (newpasswd = fopen(new, "w")) == NULL )
- return -1;
-
- while ( fgets(line, sizeof(line), passwd) != NULL )
- {
- strcpy(buffer, line);
-
- if (buffer[strlen(buffer) - 1] == '\n')
- buffer[strlen(buffer) - 1] = 0;
-
- if ( buffer[0] == '#' )
- goto done;
-
- pw.pw_name = buffer;
-
- if ( (ptr = strchr(buffer, ':')) != NULL )
- *ptr++ = 0;
- else
- goto done;
-
- if (strcmp(name, pw.pw_name) == 0)
- {
- pw.pw_passwd = ptr;
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- goto done;
-
- pw.pw_uid = atoi(ptr);
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- goto done;
-
- pw.pw_gid = atoi(ptr);
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- goto done;
-
- pw.pw_gecos = ptr;
-
- if ( (ptr = strchr(ptr, ':')) != NULL )
- *ptr++ = 0;
- else
- goto done;
-
- pw.pw_dir = ptr;
-
- if ( ptr[0] && ptr[1] && (ptr = strchr(ptr + 2, ':')) != NULL )
- *ptr++ = 0; /* skip drive: */
-
- found = 1;
-
- sprintf(line, "%s:%s:%d:%d:%s:%s:\n", pw.pw_name, crypted,
- pw.pw_uid, pw.pw_gid, pw.pw_gecos, pw.pw_dir);
- }
-
- done:
- fputs(line, newpasswd);
- }
-
- fclose(passwd);
- fclose(newpasswd);
-
- if ( !found )
- {
- unlink(new);
- return -1;
- }
-
- unlink(bak);
- if (rename(old, bak))
- return -1;
- if (rename(new, old))
- return -1;
-
- return 0;
- }
-