diff options
| author | Florent Thoumie <flz@FreeBSD.org> | 2010-04-23 11:07:43 +0000 |
|---|---|---|
| committer | Florent Thoumie <flz@FreeBSD.org> | 2010-04-23 11:07:43 +0000 |
| commit | 762c7db2e8f714203a9766492a631d0ea310bd78 (patch) | |
| tree | 6be9bed7e8e47b70e4765242d3ba0b6144132981 /lib/libpkg/msg.c | |
| parent | f31e6c7f26cf0980192132d1b7bfdf743490f1ad (diff) | |
Notes
Diffstat (limited to 'lib/libpkg/msg.c')
| -rw-r--r-- | lib/libpkg/msg.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/libpkg/msg.c b/lib/libpkg/msg.c new file mode 100644 index 000000000000..0d25ad199007 --- /dev/null +++ b/lib/libpkg/msg.c @@ -0,0 +1,70 @@ +/* + * FreeBSD install - a package for the installation and maintainance + * of non-core utilities. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Jordan K. Hubbard + * 18 July 1993 + * + * Miscellaneous message routines. + * + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "pkg.h" +#include <err.h> +#include <paths.h> + +/* Die a relatively simple death */ +void +upchuck(const char *message) +{ + cleanup(0); + errx(1, "fatal error during execution: %s", message); +} + +/* + * As a yes/no question, prompting from the varargs string and using + * default if user just hits return. + */ +Boolean +y_or_n(Boolean def, const char *msg, ...) +{ + va_list args; + int ch = 0; + FILE *tty; + + va_start(args, msg); + /* + * Need to open /dev/tty because file collection may have been + * collected on stdin + */ + tty = fopen(_PATH_TTY, "r"); + if (!tty) { + cleanup(0); + errx(2, "can't open %s!", _PATH_TTY); + } + while (ch != 'Y' && ch != 'N') { + vfprintf(stderr, msg, args); + if (def) + fprintf(stderr, " [yes]? "); + else + fprintf(stderr, " [no]? "); + fflush(stderr); + ch = toupper(fgetc(tty)); + if (ch == '\n') + ch = (def) ? 'Y' : 'N'; + } + fclose(tty) ; + return (ch == 'Y') ? TRUE : FALSE; +} |
