Don't infinite loop when prompting if no terminal is available.
This commit is contained in:
parent
2dfe0f78b0
commit
eef82f7ed4
@ -24,6 +24,7 @@
|
|||||||
#define MP_ENV_algorithm "MP_ALGORITHM"
|
#define MP_ENV_algorithm "MP_ALGORITHM"
|
||||||
#define MP_ENV_format "MP_FORMAT"
|
#define MP_ENV_format "MP_FORMAT"
|
||||||
|
|
||||||
|
/** Output the program's usage documentation. */
|
||||||
static void usage() {
|
static void usage() {
|
||||||
|
|
||||||
inf( ""
|
inf( ""
|
||||||
@ -108,12 +109,16 @@ static void usage() {
|
|||||||
exit( 0 );
|
exit( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Read the value of an environment variable.
|
||||||
|
* @return A newly allocated string or NULL if the variable doesn't exist. */
|
||||||
static const char *mpw_getenv(const char *variableName) {
|
static const char *mpw_getenv(const char *variableName) {
|
||||||
|
|
||||||
char *envBuf = getenv( variableName );
|
char *envBuf = getenv( variableName );
|
||||||
return envBuf? strdup( envBuf ): NULL;
|
return envBuf? strdup( envBuf ): NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Ask the user a question.
|
||||||
|
* @return A newly allocated string or NULL if an error occurred trying to read from the user. */
|
||||||
static const char *mpw_getline(const char *prompt) {
|
static const char *mpw_getline(const char *prompt) {
|
||||||
|
|
||||||
fprintf( stderr, "%s ", prompt );
|
fprintf( stderr, "%s ", prompt );
|
||||||
@ -131,6 +136,8 @@ static const char *mpw_getline(const char *prompt) {
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Ask the user for a password.
|
||||||
|
* @return A newly allocated string or NULL if an error occurred trying to read from the user. */
|
||||||
static const char *mpw_getpass(const char *prompt) {
|
static const char *mpw_getpass(const char *prompt) {
|
||||||
|
|
||||||
char *passBuf = getpass( prompt );
|
char *passBuf = getpass( prompt );
|
||||||
@ -142,6 +149,10 @@ static const char *mpw_getpass(const char *prompt) {
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the absolute path to the mpw configuration file with the given prefix name and file extension.
|
||||||
|
* Resolves the file <prefix.extension> as located in the <.mpw.d> directory inside the user's home directory
|
||||||
|
* or current directory if it couldn't be resolved.
|
||||||
|
* @return A newly allocated string. */
|
||||||
static const char *mpw_path(const char *prefix, const char *extension) {
|
static const char *mpw_path(const char *prefix, const char *extension) {
|
||||||
|
|
||||||
// Resolve user's home directory.
|
// Resolve user's home directory.
|
||||||
@ -184,13 +195,16 @@ static const char *mpw_path(const char *prefix, const char *extension) {
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** mkdir all the directories up to the directory of the given file path.
|
||||||
|
* @return true if the file's path exists. */
|
||||||
static bool mpw_mkdirs(const char *filePath) {
|
static bool mpw_mkdirs(const char *filePath) {
|
||||||
|
|
||||||
if (!filePath)
|
if (!filePath)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// The path to mkdir is the filePath without the last path component.
|
||||||
char *pathEnd = strrchr( filePath, '/' );
|
char *pathEnd = strrchr( filePath, '/' );
|
||||||
char *path = pathEnd? strndup( filePath, pathEnd - filePath ): strdup( filePath );
|
char *path = pathEnd? strndup( filePath, (size_t)(pathEnd - filePath) ): NULL;
|
||||||
if (!path)
|
if (!path)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -216,6 +230,8 @@ static bool mpw_mkdirs(const char *filePath) {
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Read the file contents of a given file.
|
||||||
|
* @return A newly allocated string or NULL the read buffer couldn't be allocated. */
|
||||||
static char *mpw_read_file(FILE *file) {
|
static char *mpw_read_file(FILE *file) {
|
||||||
|
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
@ -227,6 +243,8 @@ static char *mpw_read_file(FILE *file) {
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** ========================================================================
|
||||||
|
* MAIN */
|
||||||
int main(const int argc, char *const argv[]) {
|
int main(const int argc, char *const argv[]) {
|
||||||
|
|
||||||
// CLI defaults.
|
// CLI defaults.
|
||||||
@ -322,8 +340,15 @@ int main(const int argc, char *const argv[]) {
|
|||||||
const char *fullName = NULL, *masterPassword = NULL, *siteName = NULL;
|
const char *fullName = NULL, *masterPassword = NULL, *siteName = NULL;
|
||||||
if ((!fullName || !strlen( fullName )) && fullNameArg)
|
if ((!fullName || !strlen( fullName )) && fullNameArg)
|
||||||
fullName = strdup( fullNameArg );
|
fullName = strdup( fullNameArg );
|
||||||
while (!fullName || !strlen( fullName ))
|
if (!fullName || !strlen( fullName ))
|
||||||
|
do {
|
||||||
fullName = mpw_getline( "Your full name:" );
|
fullName = mpw_getline( "Your full name:" );
|
||||||
|
} while (fullName && !strlen( fullName ));
|
||||||
|
if (!fullName || !strlen( fullName )) {
|
||||||
|
ftl( "Missing full name.\n" );
|
||||||
|
mpw_free_strings( &fullName, &masterPassword, &siteName, NULL );
|
||||||
|
return EX_DATAERR;
|
||||||
|
}
|
||||||
if ((!masterPassword || !strlen( masterPassword )) && masterPasswordFDArg) {
|
if ((!masterPassword || !strlen( masterPassword )) && masterPasswordFDArg) {
|
||||||
FILE *masterPasswordFile = fdopen( atoi( masterPasswordFDArg ), "r" );
|
FILE *masterPasswordFile = fdopen( atoi( masterPasswordFDArg ), "r" );
|
||||||
if (!masterPasswordFile)
|
if (!masterPasswordFile)
|
||||||
@ -336,12 +361,26 @@ int main(const int argc, char *const argv[]) {
|
|||||||
}
|
}
|
||||||
if ((!masterPassword || !strlen( masterPassword )) && masterPasswordArg)
|
if ((!masterPassword || !strlen( masterPassword )) && masterPasswordArg)
|
||||||
masterPassword = strdup( masterPasswordArg );
|
masterPassword = strdup( masterPasswordArg );
|
||||||
while (!masterPassword || !strlen( masterPassword ))
|
if (!masterPassword || !strlen( masterPassword ))
|
||||||
|
do {
|
||||||
masterPassword = mpw_getpass( "Your master password: " );
|
masterPassword = mpw_getpass( "Your master password: " );
|
||||||
|
} while (masterPassword && !strlen( masterPassword ));
|
||||||
|
if (!masterPassword || !strlen( masterPassword )) {
|
||||||
|
ftl( "Missing master password.\n" );
|
||||||
|
mpw_free_strings( &fullName, &masterPassword, &siteName, NULL );
|
||||||
|
return EX_DATAERR;
|
||||||
|
}
|
||||||
if ((!siteName || !strlen( siteName )) && siteNameArg)
|
if ((!siteName || !strlen( siteName )) && siteNameArg)
|
||||||
siteName = strdup( siteNameArg );
|
siteName = strdup( siteNameArg );
|
||||||
while (!siteName || !strlen( siteName ))
|
if (!siteName || !strlen( siteName ))
|
||||||
|
do {
|
||||||
siteName = mpw_getline( "Site name:" );
|
siteName = mpw_getline( "Site name:" );
|
||||||
|
} while (siteName && !strlen( siteName ));
|
||||||
|
if (!siteName || !strlen( siteName )) {
|
||||||
|
ftl( "Missing site name.\n" );
|
||||||
|
mpw_free_strings( &fullName, &masterPassword, &siteName, NULL );
|
||||||
|
return EX_DATAERR;
|
||||||
|
}
|
||||||
MPMarshallFormat sitesFormat = MPMarshallFormatDefault;
|
MPMarshallFormat sitesFormat = MPMarshallFormatDefault;
|
||||||
if (sitesFormatArg) {
|
if (sitesFormatArg) {
|
||||||
sitesFormat = mpw_formatWithName( sitesFormatArg );
|
sitesFormat = mpw_formatWithName( sitesFormatArg );
|
||||||
|
Loading…
Reference in New Issue
Block a user