Passwd-Solaris
view release on metacpan or search on metacpan
$/ = $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 )