utils: implement issue #73 (only pay attention to the first char).

The answer can now just be 'y/Y' to accept it or 'n/N' to deny it.
Close #73
This commit is contained in:
Juan RP 2015-01-11 16:52:04 +01:00
parent 91b7b2fd5a
commit f7142412c9
2 changed files with 10 additions and 33 deletions

4
NEWS
View File

@ -1,5 +1,9 @@
xbps-0.44 (???): xbps-0.44 (???):
* Change the xbps utils to just check for the first character when it
asks for confirmation, rather than "yes" or "no". This implements issue #73.
https://github.com/voidlinux/xbps/issues/73
* libxbps: use a sane umask(2) while unpacking package files from * libxbps: use a sane umask(2) while unpacking package files from
binary packages (see https://github.com/voidlinux/void-packages/issues/835) binary packages (see https://github.com/voidlinux/void-packages/issues/835)

View File

@ -1,5 +1,5 @@
/*- /*-
* Copyright (c) 2008-2010 Juan Romero Pardines. * Copyright (c) 2008-2015 Juan Romero Pardines.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -37,51 +37,24 @@
#pragma clang diagnostic ignored "-Wformat-nonliteral" #pragma clang diagnostic ignored "-Wformat-nonliteral"
#endif #endif
static char *
strtrim(char *str)
{
char *pch = str;
if (str == NULL || *str == '\0')
return str;
while (isspace((unsigned char)*pch))
pch++;
if (pch != str)
memmove(str, pch, (strlen(pch) + 1));
if (*str == '\0')
return str;
pch = (str + (strlen(str) - 1));
while (isspace((unsigned char)*pch))
pch--;
*++pch = '\0';
return str;
}
static bool static bool
question(bool preset, const char *fmt, va_list ap) question(bool preset, const char *fmt, va_list ap)
{ {
char response[32]; char response[4];
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
if (preset) if (preset)
fprintf(stderr, " %s ", "[YES/no]"); fprintf(stderr, " %s ", "[Y/n]");
else else
fprintf(stderr, " %s ", "[yes/NO]"); fprintf(stderr, " %s ", "[y/N]");
if (fgets(response, sizeof(response), stdin)) { if (fgets(response, sizeof(response), stdin)) {
(void)strtrim(response);
if (strlen(response) == 0) if (strlen(response) == 0)
return preset; return preset;
if (strcasecmp(response, "yes") == 0) if (response[0] == 'y' || response[0] == 'Y')
return true; return true;
else if (strcasecmp(response, "no") == 0) if (response[0] == 'n' || response[0] == 'N')
return false; return false;
} }
return false; return false;