1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include <libintl.h>
#include <sys/select.h>
#include <unistd.h>
#include "incore.h"
#include "libgfs.h"
#define _(String) gettext(String)
struct log_state {
int print_level;
};
static struct log_state _state = {MSG_NOTICE};
void increase_verbosity(void)
{
_state.print_level++;
}
void decrease_verbosity(void)
{
_state.print_level--;
}
static void __attribute__((format(printf, 4, 0)))
print_msg(int priority, const char *file, int line, const char *format, va_list args) {
switch (priority) {
case MSG_DEBUG:
printf("(%s:%d)\t", file, line);
vprintf(format, args);
break;
case MSG_INFO:
case MSG_NOTICE:
case MSG_WARN:
vprintf(format, args);
break;
case MSG_ERROR:
case MSG_CRITICAL:
default:
vfprintf(stderr, format, args);
break;
}
return;
}
void __attribute__((format(printf, 5, 6)))
print_log_level(int iif, int priority, const char *file, int line, const char *format, ...)
{
va_list args;
const char *transform;
va_start(args, format);
transform = _(format);
if((_state.print_level == priority) ||
(!iif && (_state.print_level >= priority)))
print_msg(priority, file, line, transform, args);
va_end(args);
}
int __attribute__((format(printf, 2, 3)))
query(struct options *opts, const char *format, ...)
{
va_list args;
const char *transform;
char response;
fd_set rfds;
struct timeval tv;
int err = 0;
int ret = 0;
va_start(args, format);
transform = _(format);
if(opts->yes)
return 1;
if(opts->no)
return 0;
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
/* Make sure there isn't extraneous input before asking the
* user the question */
while((err = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv))) {
if(err < 0) {
log_debug("Error in select() on stdin\n");
break;
}
err = read(STDIN_FILENO, &response, sizeof(char));
}
query:
vprintf(transform, args);
/* Make sure query is printed out */
fflush(NULL);
rescan:
err = read(STDIN_FILENO, &response, sizeof(char));
if(tolower(response) == 'y') {
ret = 1;
} else if (tolower(response) == 'n') {
ret = 0;
} else if ((response == ' ') || (response == '\t')) {
goto rescan;
} else {
while(response != '\n')
err = read(STDIN_FILENO, &response, sizeof(char));
printf("Bad response, please type 'y' or 'n'.\n");
goto query;
}
/* Clip the input */
while((err = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv))) {
if(err < 0) {
log_debug("Error in select() on stdin\n");
break;
}
err = read(STDIN_FILENO, &response, sizeof(char));
}
return ret;
}
|