Print this page
4956 zonecfg won't use a valid pager
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Gary Mills
*/
/*
* zonecfg is a lex/yacc based command interpreter used to manage zone
* configurations. The lexer (see zonecfg_lex.l) builds up tokens, which
*** 907,950 ****
/* NOTREACHED */
return (NULL);
}
/*
! * Called with verbose TRUE when help is explicitly requested, FALSE for
! * unexpected errors.
*/
! void
! usage(boolean_t verbose, uint_t flags)
{
! FILE *fp = verbose ? stdout : stderr;
FILE *newfp;
- boolean_t need_to_close = B_FALSE;
char *pager, *space;
- int i;
- struct stat statbuf;
! /* don't page error output */
! if (verbose && interactive_mode) {
! if ((pager = getenv("PAGER")) == NULL)
pager = PAGER;
space = strchr(pager, ' ');
if (space)
*space = '\0';
! if (stat(pager, &statbuf) == 0) {
if (space)
*space = ' ';
! if ((newfp = popen(pager, "w")) != NULL) {
! need_to_close = B_TRUE;
! fp = newfp;
! }
} else {
zerr(gettext("PAGER %s does not exist (%s)."),
pager, strerror(errno));
}
}
if (flags & HELP_META) {
(void) fprintf(fp, gettext("More help is available for the "
"following:\n"));
(void) fprintf(fp, "\n\tcommands ('%s commands')\n",
--- 908,1035 ----
/* NOTREACHED */
return (NULL);
}
/*
! * Return the input filename appended to each component of the path
! * or the filename itself if it is absolute.
! * Parameters: path string, file name, output string.
*/
+ /* Copied almost verbatim from libtnfctl/prb_findexec.c */
+ static const char *
+ exec_cat(const char *s1, const char *s2, char *si)
+ {
+ char *s;
+ /* Number of remaining characters in s */
+ int cnt = PATH_MAX + 1;
! s = si;
! while (*s1 && *s1 != ':') { /* Copy first component of path to si */
! if (cnt > 0) {
! *s++ = *s1++;
! cnt--;
! } else {
! s1++;
! }
! }
! if (si != s && cnt > 0) { /* Add slash if s2 is not absolute */
! *s++ = '/';
! cnt--;
! }
! while (*s2 && cnt > 0) { /* Copy s2 to si */
! *s++ = *s2++;
! cnt--;
! }
! *s = '\0'; /* Terminate the output string */
! return (*s1 ? ++s1 : NULL); /* Return next path component or NULL */
! }
!
! /* Determine that a name exists in PATH */
! /* Copied with changes from libtnfctl/prb_findexec.c */
! static int
! path_find(const char *name)
{
! const char *pathstr;
! char fname[PATH_MAX + 2];
! const char *cp;
! struct stat stat_buf;
!
! if ((pathstr = getenv("PATH")) == NULL) {
! if (geteuid() == 0 || getuid() == 0)
! pathstr = "/usr/sbin:/usr/bin";
! else
! pathstr = "/usr/bin:";
! }
! cp = strchr(name, '/') ? (const char *) "" : pathstr;
!
! do {
! cp = exec_cat(cp, name, fname);
! if (stat(fname, &stat_buf) != -1) {
! /* successful find of the file */
! return (0);
! }
! } while (cp != NULL);
!
! return (-1);
! }
!
! static FILE *
! pager_open(void) {
FILE *newfp;
char *pager, *space;
! pager = getenv("PAGER");
! if (pager == NULL || *pager == '\0')
pager = PAGER;
space = strchr(pager, ' ');
if (space)
*space = '\0';
! if (path_find(pager) == 0) {
if (space)
*space = ' ';
! if ((newfp = popen(pager, "w")) == NULL)
! zerr(gettext("PAGER open failed (%s)."),
! strerror(errno));
! return (newfp);
} else {
zerr(gettext("PAGER %s does not exist (%s)."),
pager, strerror(errno));
}
+ return (NULL);
+ }
+
+ static void
+ pager_close(FILE *fp) {
+ int status;
+
+ status = pclose(fp);
+ if (status == -1)
+ zerr(gettext("PAGER close failed (%s)."),
+ strerror(errno));
+ }
+
+ /*
+ * Called with verbose TRUE when help is explicitly requested, FALSE for
+ * unexpected errors.
+ */
+
+ void
+ usage(boolean_t verbose, uint_t flags)
+ {
+ FILE *fp = verbose ? stdout : stderr;
+ FILE *newfp;
+ boolean_t need_to_close = B_FALSE;
+ int i;
+
+ /* don't page error output */
+ if (verbose && interactive_mode) {
+ if ((newfp = pager_open()) != NULL) {
+ need_to_close = B_TRUE;
+ fp = newfp;
}
+ }
if (flags & HELP_META) {
(void) fprintf(fp, gettext("More help is available for the "
"following:\n"));
(void) fprintf(fp, "\n\tcommands ('%s commands')\n",
*** 1272,1282 ****
pt_to_str(PT_LOCKED));
(void) fprintf(fp, "\t%s\t\t%s, %s\n", rt_to_str(RT_ADMIN),
pt_to_str(PT_USER), pt_to_str(PT_AUTHS));
}
if (need_to_close)
! (void) pclose(fp);
}
static void
zone_perror(char *prefix, int err, boolean_t set_saw)
{
--- 1357,1367 ----
pt_to_str(PT_LOCKED));
(void) fprintf(fp, "\t%s\t\t%s, %s\n", rt_to_str(RT_ADMIN),
pt_to_str(PT_USER), pt_to_str(PT_AUTHS));
}
if (need_to_close)
! (void) pager_close(fp);
}
static void
zone_perror(char *prefix, int err, boolean_t set_saw)
{
*** 5341,5380 ****
void
info_func(cmd_t *cmd)
{
FILE *fp = stdout;
boolean_t need_to_close = B_FALSE;
- char *pager, *space;
int type;
int res1, res2;
uint64_t swap_limit;
uint64_t locked_limit;
- struct stat statbuf;
assert(cmd != NULL);
if (initialize(B_TRUE) != Z_OK)
return;
/* don't page error output */
if (interactive_mode) {
! if ((pager = getenv("PAGER")) == NULL)
! pager = PAGER;
! space = strchr(pager, ' ');
! if (space)
! *space = '\0';
! if (stat(pager, &statbuf) == 0) {
! if (space)
! *space = ' ';
! if ((fp = popen(pager, "w")) != NULL)
need_to_close = B_TRUE;
else
fp = stdout;
- } else {
- zerr(gettext("PAGER %s does not exist (%s)."),
- pager, strerror(errno));
- }
setbuf(fp, NULL);
}
if (!global_scope) {
--- 5426,5451 ----
void
info_func(cmd_t *cmd)
{
FILE *fp = stdout;
boolean_t need_to_close = B_FALSE;
int type;
int res1, res2;
uint64_t swap_limit;
uint64_t locked_limit;
assert(cmd != NULL);
if (initialize(B_TRUE) != Z_OK)
return;
/* don't page error output */
if (interactive_mode) {
! if ((fp = pager_open()) != NULL)
need_to_close = B_TRUE;
else
fp = stdout;
setbuf(fp, NULL);
}
if (!global_scope) {
*** 5560,5570 ****
B_TRUE);
}
cleanup:
if (need_to_close)
! (void) pclose(fp);
}
/*
* Helper function for verify-- checks that a required string property
* exists.
--- 5631,5641 ----
B_TRUE);
}
cleanup:
if (need_to_close)
! (void) pager_close(fp);
}
/*
* Helper function for verify-- checks that a required string property
* exists.