Interim commit to be able to load key from file descriptor (fd 0 for example).

This commit is contained in:
Franck Joncourt
2013-06-01 23:14:56 +02:00
parent 05585cab8a
commit f3af0d48c5
4 changed files with 39 additions and 25 deletions
+4 -3
View File
@@ -1395,7 +1395,7 @@ set_defaults(fko_cli_options_t *options)
options->spa_icmp_type = ICMP_ECHOREPLY; /* only used in '-P icmp' mode */
options->spa_icmp_code = 0; /* only used in '-P icmp' mode */
options->input_fd = NULL;
options->input_fd = -1;
return;
}
@@ -1786,10 +1786,11 @@ config_init(fko_cli_options_t *options, int argc, char **argv)
options->force_save_rc_stanza = 1;
break;
case FD_SET_STDIN:
options->input_fd = stdin;
options->input_fd = STDIN_FILENO;
break;
case FD_SET:
options->input_fd = stdin;
options->input_fd = strtol_wrapper(optarg, 0,
65535, EXIT_UPON_ERR, &is_err);;
break;
default:
usage();
+2 -1
View File
@@ -161,7 +161,8 @@ typedef struct fko_cli_options
unsigned char save_rc_stanza;
unsigned char force_save_rc_stanza;
FILE* input_fd;
int input_fd;
//char config_file[MAX_PATH_LEN];
} fko_cli_options_t;
+32 -20
View File
@@ -42,7 +42,6 @@
#define PW_BUFSIZE 128 /*!< Maximum number of chars an encryption key or a password can contain */
/* TODO Wrong BS char 0x08 insteaf od 0x7F */
#define PW_BREAK_CHAR 0x03 /*!< Ascii code for the Ctrl-C char */
#define PW_BS_CHAR 0x08 /*!< Ascii code for the backspace char */
#define PW_LF_CHAR 0x0A /*!< Ascii code for the \n char */
@@ -53,26 +52,25 @@
#define ARRAY_LAST_ELT_ADR(t) &((t)[sizeof(t)-1]) /*!< Macro to get the last element of an array */
/**
* @brief Read a password from a file descriptor
* @brief Read a password from a stream object
*
* @param fd File descriptor to read the password from
* @param stream Pointer to a FILE object that identifies an input stream.
*
* @return The password buffer or NULL if not set
*/
static char *
read_passwd_from_fd(FILE *fd)
read_passwd_from_stream(FILE *stream)
{
static char password[PW_BUFSIZE] = {0};
int c;
char *ptr;
/* TODO check fd validity */
ptr = ARRAY_FIRST_ELT_ADR(password);
#ifdef WIN32
while((c = _getch()) != PW_CR_CHAR)
#else
while( ((c = getc(fd)) != EOF) && (c != PW_LF_CHAR) && (c != PW_BREAK_CHAR) )
while( ((c = getc(stream)) != EOF) && (c != PW_LF_CHAR) && (c != PW_BREAK_CHAR) )
#endif
{
/* Handle a backspace without backing up too far. */
@@ -116,21 +114,36 @@ read_passwd_from_fd(FILE *fd)
*
* @param prompt String displayed on the terminal to prompt the user for a password
* or an encryption key
* @param fp File descriptor to use as terminal
* @param fd File descriptor
*
* @return NULL if a problem occured or the user killed the terminal (Ctrl-C)\n
* otherwise the password - empty password is accepted.
*/
char*
getpasswd(const char *prompt, FILE *fp)
getpasswd(const char *prompt, int fd)
{
char *ptr;
#ifndef WIN32
sigset_t sig, old_sig;
struct termios ts, old_ts;
FILE *fp;
int use_ext_fd = 0;
if (fp == NULL)
if (fd >= 0)
{
fp = fdopen(fd, "r");
if (fp == NULL)
{
log_msg(LOG_VERBOSITY_ERROR, "getpasswd() - "
"Unable to create a stream from file descriptor : %s",
strerror(errno));
exit(EXIT_FAILURE);
}
use_ext_fd = 1;
}
if (use_ext_fd == 0)
{
if((fp = fopen(ctermid(NULL), "r+")) == NULL)
return(NULL);
@@ -163,22 +176,22 @@ getpasswd(const char *prompt, FILE *fp)
#endif
/* Read the password */
ptr = read_passwd_from_fd(fp);
ptr = read_passwd_from_stream(fp);
#ifndef WIN32
if (fp != stdin)
if (use_ext_fd == 0)
{
/* we can go ahead and echo out a newline.
*/
putc(PW_LF_CHAR, fp);
/* we can go ahead and echo out a newline.
*/
putc(PW_LF_CHAR, fp);
/* Restore our tty state and signal handlers.
*/
tcsetattr(fileno(fp), TCSAFLUSH, &old_ts);
sigprocmask(SIG_BLOCK, &old_sig, NULL);
/* Restore our tty state and signal handlers.
*/
tcsetattr(fileno(fp), TCSAFLUSH, &old_ts);
sigprocmask(SIG_BLOCK, &old_sig, NULL);
fclose(fp);
fclose(fp);
}
#else
/* In Windows, it would be a CR-LF
@@ -187,7 +200,6 @@ getpasswd(const char *prompt, FILE *fp)
_putch(PW_LF_CHAR);
#endif
printf("PAssword = %s\n",ptr);
return (ptr);
}
+1 -1
View File
@@ -33,7 +33,7 @@
/* Prototypes
*/
char* getpasswd(const char *prompt, FILE* fp);
char* getpasswd(const char *prompt, int fd);
/* This can be used to acquire an encryption key or HMAC key
*/