home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
forum5.lzh
/
SPRACHEN
/
C
/
PASSWD
/
passwd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-10
|
2KB
|
113 lines
#include <stdio.h>
#include <strings.h>
#include <sgstat.h>
#include <pwd.h>
#define pwfile "/dd/SYS/password"
#define pwtmp "/dd/SYS/passwdXXXXXX"
char sh[80],ch[80];
main(argc,argv)
int argc;
char *argv[];
{
FILE *f,*g;
char *who, *my_name(), *s, *getpw(), *conf,st[256];
int gid,try=3;
struct passwd *p;
who = my_name();
setuid(0);
if((p=getpwnam(who))==NULL) {
fprintf(stderr,"can't open /dd/SYS/password\n");
exit(1);
}
endpwent();
if(argc > 1) usage();
printf("Changing password for %s\n",who);
if(strlen(p->pw_passwd)) { /* if user has an old password, ask for it */
if(strcmp(p->pw_passwd,getpw("Old password",sh))) {
fprintf(stderr,"Sorry.\n");
exit(1);
}
}
if(argc==1) {
do {
s = getpw("New password",sh);
if(strlen(s)>3) break;
if(--try) printf("Password is too short\n");
else {
printf("Try later. bye\n");
exit(1);
}
} while(try);
conf = getpw("Retype new password",ch);
if(strcmp(s,conf)) { /* you don't know how to write the password */
printf("Mismatch - password unchanged.\n");
exit(1);
}
}
else
s = argv[1];
f=fopen(pwfile,"r");
if((g=fopen(pwtmp,"w"))==NULL) {
printf("can't make copy of passwordfile\n");
exit(1);
}
while(fgets(st,255,f)) { /* copy /dd/SYS/password to temporary file */
if(strncmp(p->pw_name,st,strlen(p->pw_name))) fputs(st,g);
else /* change user entry to the one with the new password */
fprintf(g,"%s,%s,%d.%d,%d,%s,%s,%s\n",p->pw_name,s,p->pw_gid,p->pw_uid,p->pw_prio,p->pw_xdir,p->pw_dir,p->pw_shell);
}
fclose(f);
fclose(g);
sprintf(st,"copy -r %s %s",pwtmp,pwfile);
system(st);
unlink(pwtmp);
}
usage()
{
fprintf(stderr,"Syntax: passwd \n");
fprintf(stderr,"Function: get new password\n");
fprintf(stderr,"Options: none\n");
exit(1);
}
char *getpw(t,s) /* ask with t for password without echo !! */
char *t,*s;
{
struct sgbuf buffer;
int try,echo;
_gs_opt(fileno(stdin),&buffer);
echo=buffer.sg_echo;
buffer.sg_echo=0;
_ss_opt(fileno(stdin),&buffer);
printf("%s: ",t);
fflush(stdout);
s = gets(s);
buffer.sg_echo=echo;
_ss_opt(fileno(stdin),&buffer);
printf("\n");
return(s);
}
char *my_name()
{
int i;
char *temp, *getenv();
temp = getenv("USER");
return (temp);
}