version 1.23, 2002/06/27 19:02:40 |
version 1.24, 2002/06/27 19:16:50 |
|
|
#include "chpass.h" |
#include "chpass.h" |
#include "pathnames.h" |
#include "pathnames.h" |
|
|
char tempname[] = __CONCAT(_PATH_VARTMP,"pw.XXXXXXXX"); |
|
enum { NEWSH, LOADENTRY, EDITENTRY } op; |
enum { NEWSH, LOADENTRY, EDITENTRY } op; |
uid_t uid; |
uid_t uid; |
|
|
|
|
#endif |
#endif |
|
|
void baduser(void); |
void baduser(void); |
void tempcleanup(void); |
|
void kbintr(int); |
void kbintr(int); |
void usage(void); |
void usage(void); |
|
|
|
|
|
|
/* Edit the user passwd information if requested. */ |
/* Edit the user passwd information if requested. */ |
if (op == EDITENTRY) { |
if (op == EDITENTRY) { |
|
char tempname[] = __CONCAT(_PATH_VARTMP,"pw.XXXXXXXX"); |
|
|
dfd = mkstemp(tempname); |
dfd = mkstemp(tempname); |
if (dfd == -1 || fcntl(dfd, F_SETFD, 1) == -1) |
if (dfd == -1 || fcntl(dfd, F_SETFD, 1) == -1) |
pw_error(tempname, 1, 1); |
pw_error(tempname, 1, 1); |
atexit(tempcleanup); |
|
display(tempname, dfd, pw); |
display(tempname, dfd, pw); |
edit(tempname, pw); |
edit(tempname, pw); |
|
close(dfd); |
|
unlink(tempname); |
} |
} |
|
|
/* Drop user's real uid and block all signals to avoid a DoS. */ |
/* Drop user's real uid and block all signals to avoid a DoS. */ |
|
|
} |
} |
|
|
void |
void |
tempcleanup(void) |
|
{ |
|
|
|
unlink(tempname); |
|
} |
|
|
|
void |
|
kbintr(int signo) |
kbintr(int signo) |
{ |
{ |
struct iovec iv[5]; |
struct iovec iv[5]; |
|
|
iv[4].iov_base = " unchanged\n"; |
iv[4].iov_base = " unchanged\n"; |
iv[4].iov_len = 11; |
iv[4].iov_len = 11; |
writev(STDERR_FILENO, iv, 5); |
writev(STDERR_FILENO, iv, 5); |
|
|
if (op == EDITENTRY) |
|
unlink(tempname); |
|
|
|
_exit(1); |
_exit(1); |
} |
} |