/* * Simply display the preformatted page. */ static int display_cat_file (const char *file) { int found; if (preformat) return 1; /* nothing to do - preformat only */ found = 0; if (access (file, R_OK) == 0 && different_cat_file(file)) { char *command = NULL; const char *expander = get_expander (file); if (expander != NULL && expander[0] != 0) { if (isatty(1)) command = my_xsprintf("%s %S | %s", expander, file, pager); else command = my_xsprintf("%s %S", expander, file); } else { if (isatty(1)) { command = my_xsprintf("%s %S", pager, file); } else { const char *cat = getval("CAT"); command = my_xsprintf("%s %S", cat[0] ? cat : "cat", file); } } found = !do_system_command (command, 0); } return found; }
/* * Handle the whatis option. Cheat by using another program. */ static int do_whatis (char *name) { char *command; command = my_xsprintf("'%s' '%Q'", getval("WHATIS"), name); return do_system_command (command, 0); }
/* * Handle the apropos option. Cheat by using another program. */ static int do_apropos (char *name) { char *command; command = my_xsprintf("'%s' '%Q'", getval("APROPOS"), name); return do_system_command (command, 0); }
static int display_man_file(const char *path, const char *man_file) { char *roff_command; char *command; if (!different_man_file (man_file)) return 0; roff_command = make_roff_command (path, man_file); if (roff_command == NULL) return 0; if (do_troff) command = my_xsprintf ("(cd \"%S\" && %s)", path, roff_command); else command = my_xsprintf ("(cd \"%S\" && %s | %s)", path, roff_command, pager); return !do_system_command (command, 0); }
void send_drop(void) { char cmd[CMD_LENGTH] = {0}; char cmd1[CMD_LENGTH] = {0}; int ret = 0; //FILE *pp; snprintf(cmd1, sizeof(cmd1), "/usr/local/sbin/nf-hipac -I GLOBALIP0 --source 0.0.0.0/0 -d 0.0.0.0/0 -j DROP 2>/dev/null"); snprintf(cmd,sizeof(cmd), "%s \n echo \"%s \" >> /flash/etc/check.sh", cmd1, cmd1); do_system_command(cmd); //pp = popen(cmd, "r"); //if (pp == NULL) //{ // return; //} //pclose(pp); return ; }
/* * Simply display the preformatted page. */ static int display_html_file (const char *file) { int found; found = 0; if (access (file, R_OK) == 0 && different_cat_file(file)) { char *command = NULL; if (isatty(1)) { command = my_xsprintf("%s %S", browser, file); } else { command = my_xsprintf("%s %S", htmlpager, file); } found = !do_system_command (command, 0); } return found; return 1; }
/* * Try to format the man page source and save it, then display it. If * that's not possible, try to format the man page source and display * it directly. */ static int format_and_display (const char *man_file) { const char *path; if (access (man_file, R_OK) != 0) return 0; path = mandir_of(man_file); if (path == NULL) return 0; /* first test for contents .so man1/xyzzy.1 */ /* (in that case we do not want to make a cat file identical to cat1/xyzzy.1) */ man_file = ultimate_source (man_file); if (man_file == NULL) return 0; if (do_troff) { char *command; char *roff_command = make_roff_command (path, man_file); if (roff_command == NULL) return 0; command = my_xsprintf("(cd \"%S\" && %s)", path, roff_command); return !do_system_command (command, 0); } if (can_use_cache && make_and_display_cat_file (path, man_file)) return 1; /* line length was wrong or could not display cat_file */ if (print_where) { printf ("%s\n", man_file); return 1; } return display_man_file (path, man_file); }
/* * Try to format the man page and create a new formatted file. Return * 1 for success and 0 for failure. */ static int make_cat_file (const char *path, const char *man_file, const char *cat_file) { int mode; FILE *fp; char *roff_command; char *command = NULL; struct stat statbuf; /* _Before_ first, make sure we will write to a regular file. */ if (stat(cat_file, &statbuf) == 0) { if(!S_ISREG(statbuf.st_mode)) { if (debug) gripe (CAT_OPEN_ERROR, cat_file); return 0; } } /* First make sure we can write the file; create an empty file. */ /* If we are suid it must get mode 0666. */ if ((fp = fopen (cat_file, "w")) == NULL) { if (errno == ENOENT) /* directory does not exist */ return 0; /* If we cannot write the file, maybe we can delete it */ if(unlink (cat_file) != 0 || (fp = fopen (cat_file, "w")) == NULL) { if (errno == EROFS) /* possibly a CDROM */ return 0; if (debug) gripe (CAT_OPEN_ERROR, cat_file); if (!suid) return 0; /* maybe the real user can write it */ /* note: just doing "> %s" gives the wrong exit status */ command = my_xsprintf("cp /dev/null %S 2>/dev/null", cat_file); if (do_system_command(command, 1)) { if (debug) gripe (USER_CANNOT_OPEN_CAT); return 0; } if (debug) gripe (USER_CAN_OPEN_CAT); } } else { /* we can write it - good */ fclose (fp); /* but maybe the real user cannot - let's allow everybody */ /* the mode is reset below */ if (suid) { if (chmod (cat_file, 0666)) { /* probably we are sgid but not owner; just delete the file and create it again */ if(unlink(cat_file) != 0) { command = my_xsprintf("rm %S", cat_file); (void) do_system_command (command, 1); } if ((fp = fopen (cat_file, "w")) != NULL) fclose (fp); } } } roff_command = make_roff_command (path, man_file); if (roff_command == NULL) return 0; if (do_compress) /* The cd is necessary, because of .so commands, like .so man1/bash.1 in bash_builtins.1. But it changes the meaning of man_file and cat_file, if these are not absolute. */ command = my_xsprintf("(cd %S && %s | %S > %S)", path, roff_command, getval("COMPRESS"), cat_file); else command = my_xsprintf ("(cd %S && %s > %S)", path, roff_command, cat_file); /* * Don't let the user interrupt the system () call and screw up * the formatted man page if we're not done yet. */ signal (SIGINT, SIG_IGN); gripe (PLEASE_WAIT); if (!do_system_command (command, 0)) { /* success */ mode = ((ruid != euid) ? 0644 : (rgid != egid) ? 0464 : 0444); if(chmod (cat_file, mode) != 0 && suid) { command = my_xsprintf ("chmod 0%o %S", mode, cat_file); (void) do_system_command (command, 1); } /* be silent about the success of chmod - it is not important */ if (debug) gripe (CHANGED_MODE, cat_file, mode); } else { /* something went wrong - remove garbage */ if(unlink(cat_file) != 0 && suid) { command = my_xsprintf ("rm %S", cat_file); (void) do_system_command (command, 1); } } signal (SIGINT, SIG_DFL); return 1; }
/* return 0 when all was OK */ static int do_global_apropos (char *name, char *section) { char **dp, **gf; char *pathname; char *command; int status, res; status = 0; init_manpath(); if (mandirlist) for (dp = mandirlist; *dp; dp++) { if (debug) gripe(SEARCHING, *dp); pathname = my_xsprintf("%s/man%s/*", *dp, section ? section : "*"); gf = glob_filename (pathname); free(pathname); if (gf != (char **) -1 && gf != NULL) { for( ; *gf; gf++) { const char *expander = get_expander (*gf); if (expander) command = my_xsprintf("%s %S | grep '%Q'" "> /dev/null 2> /dev/null", expander, *gf, name); else command = my_xsprintf("grep '%Q' %S" "> /dev/null 2> /dev/null", name, *gf); res = do_system_command (command, 1); status |= res; free (command); if (res == 0) { if (print_where) printf("%s\n", *gf); else { /* should read LOCALE, but libc 4.6.27 doesn't seem to handle LC_RESPONSE yet */ int answer, c; char path[BUFSIZE]; printf("%s? [ynq] ", *gf); fflush(stdout); answer = c = getchar(); while (c != '\n' && c != EOF) c = getchar(); if(index("QqXx", answer)) exit(0); if(index("YyJj", answer)) { char *ri; strcpy(path, *gf); ri = rindex(path, '/'); if (ri) *ri = 0; format_and_display(*gf); } } } } } } return status; }