#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/gen/readpassphrase.c,v 1.6 2002/03/09 03:16:41 green Exp $");
+#include "xlocale_private.h"
+
#include "namespace.h"
#include <ctype.h>
#include <errno.h>
struct termios term, oterm;
struct sigaction sa, saveint, savehup, savequit, saveterm;
struct sigaction savetstp, savettin, savettou;
+ locale_t loc = __current_locale();
/* I suppose we could alloc on demand in this case (XXX). */
if (bufsiz == 0) {
if (p < end) {
if ((flags & RPP_SEVENBIT))
ch &= 0x7f;
- if (isalpha(ch)) {
+ if (isalpha_l(ch, loc)) {
if ((flags & RPP_FORCELOWER))
- ch = tolower(ch);
+ ch = tolower_l(ch, loc);
if ((flags & RPP_FORCEUPPER))
- ch = toupper(ch);
+ ch = toupper_l(ch, loc);
}
*p++ = ch;
}
char *
getpass(const char *prompt)
{
- static char buf[_PASSWORD_LEN + 1];
+ const size_t bufsiz = _PASSWORD_LEN + 1;
+ static char *buf = NULL;
- if (readpassphrase(prompt, buf, sizeof(buf), RPP_ECHO_OFF) == NULL)
+ if (buf == NULL) {
+ buf = malloc(bufsiz);
+ if (buf == NULL) {
+ return NULL;
+ }
+ }
+
+ if (readpassphrase(prompt, buf, bufsiz, RPP_ECHO_OFF) == NULL) {
buf[0] = '\0';
- return(buf);
+ }
+ return buf;
}
static void handler(int s)