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 >
C/C++ Source or Header  |  1988-03-10  |  2KB  |  113 lines

  1. #include <stdio.h>
  2. #include <strings.h>
  3. #include <sgstat.h>
  4. #include <pwd.h>
  5.  
  6. #define pwfile  "/dd/SYS/password"
  7. #define pwtmp   "/dd/SYS/passwdXXXXXX"
  8.  
  9. char sh[80],ch[80];
  10.  
  11.  
  12. main(argc,argv)
  13. int argc;
  14. char *argv[];
  15. {
  16.     FILE *f,*g;
  17.     char *who, *my_name(), *s, *getpw(), *conf,st[256];
  18.     int gid,try=3;
  19.     struct passwd *p;
  20.  
  21.     who = my_name();
  22.     setuid(0);
  23.     if((p=getpwnam(who))==NULL) {
  24.         fprintf(stderr,"can't open /dd/SYS/password\n");
  25.         exit(1);
  26.     }
  27.     endpwent();
  28.     if(argc > 1) usage();
  29.     
  30.     printf("Changing password for %s\n",who);
  31.     if(strlen(p->pw_passwd)) {  /* if user has an old password, ask for it */
  32.         if(strcmp(p->pw_passwd,getpw("Old password",sh))) {
  33.             fprintf(stderr,"Sorry.\n");
  34.             exit(1);
  35.         }
  36.     }
  37.     if(argc==1) {
  38.         do {
  39.             s = getpw("New password",sh);
  40.             if(strlen(s)>3) break;
  41.             if(--try) printf("Password is too short\n");
  42.             else {
  43.                 printf("Try later. bye\n");
  44.                 exit(1);
  45.             }
  46.         } while(try);
  47.         conf = getpw("Retype new password",ch);
  48.         if(strcmp(s,conf)) {   /* you don't know how to write the password */
  49.             printf("Mismatch - password unchanged.\n");
  50.             exit(1);
  51.         }
  52.     }
  53.     else 
  54.         s = argv[1];
  55.     
  56.     f=fopen(pwfile,"r");
  57.     if((g=fopen(pwtmp,"w"))==NULL) {
  58.         printf("can't make copy of passwordfile\n");
  59.         exit(1);
  60.     }
  61.     while(fgets(st,255,f)) {   /* copy /dd/SYS/password to temporary file */
  62.         if(strncmp(p->pw_name,st,strlen(p->pw_name))) fputs(st,g);
  63.         else     /* change user entry to the one with the new password */
  64.             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);
  65.         }
  66.     fclose(f);
  67.     fclose(g);
  68.     sprintf(st,"copy -r %s %s",pwtmp,pwfile);
  69.     system(st);
  70.     unlink(pwtmp);
  71. }
  72.  
  73.  
  74. usage()
  75. {
  76.     fprintf(stderr,"Syntax: passwd \n");
  77.     fprintf(stderr,"Function: get new password\n");
  78.     fprintf(stderr,"Options: none\n");
  79.     exit(1);
  80. }
  81.  
  82.  
  83. char *getpw(t,s)   /* ask with t for password without echo !! */
  84. char *t,*s;
  85. {
  86.     struct sgbuf buffer;
  87.     int try,echo;
  88.     
  89.     _gs_opt(fileno(stdin),&buffer);
  90.     echo=buffer.sg_echo;
  91.     buffer.sg_echo=0;
  92.     _ss_opt(fileno(stdin),&buffer);
  93.     
  94.         printf("%s: ",t); 
  95.         fflush(stdout);
  96.         s = gets(s);
  97.     
  98.     buffer.sg_echo=echo;
  99.     _ss_opt(fileno(stdin),&buffer);
  100.     printf("\n");
  101.     return(s);
  102. }
  103.  
  104. char *my_name()
  105. {
  106.     int i;
  107.     char *temp, *getenv();
  108.     
  109.     temp = getenv("USER");
  110.     return (temp);
  111. }
  112.  
  113.