Passwd-Solaris

 view release on metacpan or  search on metacpan

Solaris.pm  view on Meta::CPAN

    $/ = $save_separator; # restore original input separator
    return %entries;
}

sub _write_and_release (%) {
    my %entries = @_;
    my $info;
    my $err;
    my $err2;
    
    # verify we have the lock?
    if ($have_lock == 0) {
        croak "_write_and_release called and we didn't have the lock, how did that happen?"
    }
    
    if (exists($entries{':ORDER:'})) {
        $info = $entries{':ORDER:'};
    } else {
        xs_releaselock();
        croak "_write_and_release called with no entry order info";
    }
    
    rename "/etc/passwd", "/etc/opasswd" or do {
        xs_releaselock();
        croak "Couldn't rename /etc/passwd";
    };
    
    rename "/etc/shadow", "/etc/oshadow" or do {
        $err = rename "/etc/opasswd", "/etc/passwd";
        xs_releaselock();
        if ($err == 0) {
            croak "/etc/passwd may not exist, /etc/opasswd contains the correct entries";
        }
        croak "Couldn't rename /etc/shadow";
    };
    
    open(PASS, ">/etc/passwd") or do {
        $err = rename "/etc/opasswd", "/etc/passwd";
        $err2 = rename "/etc/oshadow", "/etc/shadow";
        xs_releaselock();
        if (($err == 0) || ($err2 == 0)) {
            croak "/etc/passwd or /etc/shadow may not exist, /etc/opasswd and /etc/oshadow contain the correct entries";
        }
        croak "Couldn't open /etc/passwd for writing";
    };
    chmod 0644, "/etc/passwd";

    open(SHAD, ">/etc/shadow") or do {
        $err = rename "/etc/opasswd", "/etc/passwd";
        $err2 = rename "/etc/oshadow", "/etc/shadow";
        xs_releaselock();
        if (($err == 0) || ($err2 == 0)) {
            croak "/etc/passwd or /etc/shadow may not exist, /etc/opasswd and /etc/oshadow contain the correct entries";
        }
        croak "Couldn't open /etc/passwd for writing";
    };

    # if a shadow group exists give it read permissions
    my @sgrp = getgrnam("shadow");
    if (@sgrp > 1) {
        chown 0, $sgrp[2], "/etc/shadow";
        chmod 0640, "/etc/shadow";
    } else {
        chmod 0600, "/etc/shadow";
    }

    my $save_separator = $/; # just in case the program using this has changed it
    $/ = "\n";
    foreach my $user (@{$info}) {
        if (exists($entries{$user})) {
            my @data = @{$entries{$user}};
            my $pentry = join(":", $data[0], "x", @data[2..6]);
            my $sentry = join(":", @data[0..1], @data[7..$#data]);
            print PASS "$pentry\n";
            chomp $sentry;
            print SHAD "$sentry\n";
        } # else skip, its a deleted entry
    }
    $/ = $save_separator;

    close(SHAD);
    close(PASS);
    
    my $lock = xs_releaselock();
    if ($lock != 0) {
        croak "Couldn't release lock on password files";
    }
    $have_lock = 0;
    return 0;
}

sub _set_user ($$) {
    my %entries = %{$_[0]};
    my @info = @{$_[1]};
    my $days = int(time()/86400);
    my @data;

    $info[7] = $days;
    if (exists($entries{$info[0]})) {
        @data = @{$entries{$info[0]}};
    } else {
        push @{$entries{":ORDER:"}}, $info[0];
    }
    for (my $i = 0; $i <= $#info; $i++) {
        $data[$i] = $info[$i];
    }
    $entries{$info[0]} = \@data;

    if (eval { _write_and_release(%entries); } ) {
        print $@;
        return 1;
    }
    return 0;
}

sub modpwinfo {
    my @info = @_;
    my @user;

    if (($#info < 1) || ($#info > 13)) {
        croak "modpwinfo: (name, crypted_pass, [uid, gid, gecos, home, shell, stuff from shadow file] )";



( run in 0.569 second using v1.01-cache-2.11-cpan-5511b514fd6 )