Exemple #1
0
//hash的初始化
int
load_ucache()
{
	int i;
	int lockfd;

	lockfd = lock_passwd();
	bzero(binfo->ucachehashshm, sizeof (struct UCACHEHASH));

	if (ucache_hashinit() < 0) {
		unlock_passwd(lockfd);
		return -1;
	}

	for (i = 0; i < MAXUSERS; i++) {
		if (passwdptr[i].userid[0]
		    && finduseridhash(passwdptr[i].userid) > 0) {
			unlock_passwd(lockfd);
			errlog("duplicate user %s", passwdptr[i].userid);
			return -1;
		}
		insertuseridhash(passwdptr[i].userid, i + 1, 0);
	}
	unlock_passwd(lockfd);
	return 0;
}
Exemple #2
0
int
create_account(char *username)
{
    struct passwd *pw;
    int	   opt, type;
    char   pwbuf[PWLEN + 1];
    int ret;

    type = 0;
    if ((pw=newacc(username)) == 0) {
        fprintf(stderr, "Account not created\n");
        return EXIT_FAILURE;
    }
    initdir(pw->pw_dir, pw->pw_uid, pw->pw_gid);

    if ((ret = get_passwd(pwbuf, type)) == -1)
        return EXIT_FAILURE;
    pw->pw_passwd = ret ? passwd_stub : nil_passwd;

    if (!lock_passwd()) {
        fprintf(stderr,"unable to lock password database (%s)\n",strerror(errno));
        return PasswdBusy;
    }
    if ((opt = addpwent(pw)) == 0) {
        if (pw->pw_passwd && *pw->pw_passwd) {
            struct spwd	spw;
            spw.sp_namp	= pw->pw_name;
            spw.sp_pwdp	= pwbuf;
            spw.sp_lstchg	= time(0);
            spw.sp_max	= 0;
            spw.sp_min	= 0;
            spw.sp_warn	= 0;
            spw.sp_inact	= 0;
            spw.sp_expire	= 0;
            spw.sp_flag	= 0;
            if ((opt = addshent(&spw))) {
                fputs("cannot create shadow entry\n",stderr);
                delpw_name(pw->pw_name);
            }
        }
    } else {
        fputs("cannot create password entry\n", stderr);
    }
    unlock_passwd();
    return opt;
}
Exemple #3
0
main (int ac, char *av[]) {
  FILE *temp;
  char lock[20];
  strcpy(lock,av[1]);
  strcat(lock,".LCK");
  if (ac == 3) {
    int delay,done;
    delay = 0;
    done = 0;
    
    while (delay<=3 && done==0) {
      puts("here");
      if (lock_passwd(av[1],lock)==0) {
	temp=fopen(av[1],"a");
	fputs(strcat(av[2],"\n"),temp);
	fclose(temp);	
	//	int temp = open(av[1],O_APPEND);
	//fprintf(temp,"%s",av[2]);
	//close(temp);
	done++;
	sleep(2);
	unlock_passwd(lock);
	
      } else {
	delay++;
	sleep(1);
      }
    }
    if (done!=0) {
      oops("delay time","");
    }

  } else {
    oops("Too many arguments","");
  }
}
Exemple #4
0
int change_passwd(struct passwd * pw) {
    struct	spwd *sp = NULL;
    struct  spwd	spw;
    char	pwbuf[PWLEN];
    int		opt, ret;

    printf("changing password for %s\n", pw->pw_name);

    if (pw->pw_passwd && *pw->pw_passwd) sp=getspnam(pw->pw_name);

    ret = 0;
    if (getuid() != 0) {
        if ((ret = chk_passwd(pw, sp)) == -1) {
            fputs("Sorry!\n",stderr);
            return EXIT_FAILURE;
        }
    }
    if (get_passwd(pwbuf, ret) == -1)
        return EXIT_FAILURE;
    if (!lock_passwd()) {
        fprintf(stderr,"unable to lock password database (%s)\n",strerror(errno));
        return PasswdBusy;
    }
    /*-
     * there are 4 normal cases covered here:
     * 1: user did not previously have a password and now does.
     * 2: user did not previously have a password and still doesn't.
     * 3: user previously had a password and now doesn't.
     * 4: user previously had a password and still does.
     *
     * plus the additional user should have had a password but
     * there was none in /etc/shadow!
     *
     * #1 -- update password & shadow files.
     * #2 -- do nothing.
     * #3 -- update password & shadow files.
     * #4 -- update shadow only.
     * in #1, the shadow file must be updated first for consistency.
     * in #3, the password file must be updated first for consistency.
     */
    opt = Success;
    if (*pwbuf) {	/* user put a password in */
        if (!sp) {
            spw.sp_namp	= pw->pw_name;
            spw.sp_pwdp	= pwbuf;
            spw.sp_lstchg	= time(0);
            spw.sp_max	= 0;
            spw.sp_min	= 0;
            spw.sp_warn	= 0;
            spw.sp_inact	= 0;
            spw.sp_expire	= 0;
            spw.sp_flag	= 0;
            sp = &spw;
        } else {
            sp->sp_pwdp = pwbuf;
            sp->sp_lstchg = time(0);
        }
        if (!(pw->pw_passwd && *pw->pw_passwd)) {
            if ((opt=addshent(&spw)) != Success) {
                unlock_passwd();
                return opt;
            }
            pw->pw_passwd = passwd_stub;
            opt = chgpw_name(pw->pw_name,pw);
        } else {
            sp->sp_pwdp = pwbuf;
            opt = addshent(sp);
        }
    } else if (pw->pw_passwd && *pw->pw_passwd) {
        if ((opt=delsh_name(pw->pw_name)) != Success) {
            fputs("Warning: password,shadow files may be inconsistant\n",stderr);
            //		unlock_passwd();
            //		return opt;
        }
        pw->pw_passwd = nil_passwd;
        opt=chgpw_name(pw->pw_name,pw);
    }
    unlock_passwd();
    return opt;
}