static void conescape(void) { char b; if (G.gotsig) /* came from line mode... go raw */ rawmode(); WriteCS(1, "\r\nConsole escape. Commands are:\r\n\n" " l go to line mode\r\n" " c go to character mode\r\n" " z suspend telnet\r\n" " e exit telnet\r\n"); if (read(0, &b, 1) <= 0) doexit(1); switch (b) { case 'l': if (!G.gotsig) { do_linemode(); goto rrturn; } break; case 'c': if (G.gotsig) { will_charmode(); goto rrturn; } break; case 'z': cookmode(); kill(0, SIGTSTP); rawmode(); break; case 'e': doexit(0); } WriteCS(1, "continuing...\r\n"); if (G.gotsig) cookmode(); rrturn: G.gotsig = 0; }
static void con_escape(void) { char b; if (bb_got_signal) /* came from line mode... go raw */ rawmode(); write_str(1, "\r\nConsole escape. Commands are:\r\n\n" " l go to line mode\r\n" " c go to character mode\r\n" " z suspend telnet\r\n" " e exit telnet\r\n"); if (read(STDIN_FILENO, &b, 1) <= 0) doexit(EXIT_FAILURE); switch (b) { case 'l': if (!bb_got_signal) { do_linemode(); goto ret; } break; case 'c': if (bb_got_signal) { will_charmode(); goto ret; } break; case 'z': cookmode(); kill(0, SIGTSTP); rawmode(); break; case 'e': doexit(EXIT_SUCCESS); } write_str(1, "continuing...\r\n"); if (bb_got_signal) cookmode(); ret: bb_got_signal = 0; }
static void setConMode(void) { if (G.telflags & UF_ECHO) { if (G.charmode == CHM_TRY) { G.charmode = CHM_ON; printf("\r\nEntering character mode%s'^]'.\r\n", escapecharis); rawmode(); } } else { if (G.charmode != CHM_OFF) { G.charmode = CHM_OFF; printf("\r\nEntering line mode%s'^C'.\r\n", escapecharis); cookmode(); } } }
static void setConMode(void) { if (G.telflags & UF_ECHO) { if (G.charmode == CHM_TRY) { G.charmode = CHM_ON; printf("\r\nEntering %s mode" "\r\nEscape character is '^%c'.\r\n", "character", ']'); rawmode(); } } else { if (G.charmode != CHM_OFF) { G.charmode = CHM_OFF; printf("\r\nEntering %s mode" "\r\nEscape character is '^%c'.\r\n", "line", 'C'); cookmode(); } } }
int init_sh(char **env, t_sh **sh) { set_static_tty(env); my_signals(); gbgc_init(); init_open(); if (((*sh) = gbgc_calloc(sizeof(t_sh))) == NULL) return (false); if (((*sh)->env = convert_envtab(env)) == NULL) return (my_perror("env return null")); (*sh)->rdl.prompt = "Such prompt $> "; if (isatty(STDIN_FILENO) && env[0] != NULL) { (*sh)->tty = false; if ((getent_term(env)) == false) return (false); if (!rawmode()) return (false); (*sh)->tty = true; } else (*sh)->tty = false; return (true); }
void con_init(FILE *input) { atexit(con_term); rawmode(input); trapctlc(); }
int main (int argc, char *argv[], char *environ[]) { int n = 1; int valid = -1; char iobuf[BUFSIZ]; char sysconfdir[BUFSIZ]; char c_str[BUFSIZ]; char c_command[BUFSIZ]; char *p = NULL; char *rand = rand2str (16); time_t now = time ((time_t *) NULL); struct stat s; struct sigaction saterm; struct sigaction sawinch; struct sigaction sachild; struct timeval tv; double oldtime, newtime; struct stat ttybuf; int c; char argtest[BUFSIZ]; user.vshell = NULL; user.shell.ptr = NULL; user.home.ptr = NULL; user.term.ptr = NULL; progname = argv[0]; if ((p = (char *) strrchr (progname, '/')) != NULL) progname = p + 1; if (*progname == '-') loginshell = 1; /* Who are you? */ user.pw = getpwuid ((uid_t) getuid ()); if (user.pw == NULL) { fprintf (stderr, "I do not know who you are. Stopping.\n"); perror ("getpwuid"); exit (EXIT_FAILURE); } strncpy (user.to, user.pw->pw_name, BUFSIZ - 1); user.term.ptr = getenv ("TERM"); if (user.term.ptr == NULL) user.term.ptr = "dumb"; if (strlen (user.term.ptr) < 1) user.term.ptr = "dumb"; snprintf (sysconfdir, BUFSIZ - 1, "%s/sudosh.conf", SYSCONFDIR); parse (&sudosh_option, sysconfdir); while ((c = getopt (argc, argv, "c:hivV")) != EOF) { switch (c) { case 'c': // fprintf(stderr,"optarg is [%s]\n",optarg); strncpy (user.from, user.pw->pw_name, BUFSIZ - 1); strncpy (c_str, optarg, BUFSIZ - 1); strncpy (c_command, optarg, BUFSIZ - 1); p = strchr (c_str, ' '); if (p) { p[0] = 0; // fprintf(stderr,"args=%s\n",c_args); } if (c_str[0] != 0) { // Test for methods of escape if (strchr (c_command, ';') != NULL || strchr (c_command, '&') != NULL || strchr (c_command, '|') != NULL || strchr (c_command, '<') != NULL || strchr (c_command, '>') != NULL || strchr (c_command, '`') != NULL) { fprintf (stderr, "\"%s\" isn't allowed to be executed with process or redirect controls.\n", c_command); exit (EXIT_FAILURE); } // fprintf(stderr,"Testing c\n"); // Make sure that c_str is in argallow sprintf (argtest, "$%.100s$", c_str); // fprintf(stderr,"Testing for %s\n",argtest); if (strstr (sudosh_option.argallow, argtest) != NULL || strchr(sudosh_option.argallow, '*')!=NULL) { FILE *f; snprintf (script.name, (size_t) BUFSIZ - 1, "%s/%s%c%s%cinteractive%c%i%c%s", sudosh_option.logdir, user.from, sudosh_option.fdl, user.to, sudosh_option.fdl, sudosh_option.fdl, (int) now, sudosh_option.fdl, rand); f = fopen (script.name, "w"); if (f == (FILE *) 0) { fprintf (stderr, "%.100s: %.100s (%i)\n", script.name, strerror (errno), errno); exit (EXIT_FAILURE); } fprintf (f, "%.256s\n", c_str); fclose (f); execl ("/bin/sh", "sh", "-c", c_command, (char *) 0); exit (EXIT_SUCCESS); break; } else { fprintf (stderr, "\"%s\" isn't allowed to be executed.\n", c_str); exit (EXIT_FAILURE); break; } } break; case 'h': case '?': fprintf (stdout, "Usage: sudosh\n" "sudo shell that supports input and output logging to syslog\n" "\n" "-h, --help display this help and exit\n" "-i, --init initialize logdir (mkdir and chmod) (ignored for compatibility)\n" "-v, --version output version information and exit\n" "\n" "Report bugs to <%s>\n", PACKAGE_BUGREPORT); exit (EXIT_SUCCESS); break; case 'i': fprintf (stdout, "Ignoring initialize option, this is done automatically\n"); exit (EXIT_SUCCESS); break; case 'v': case 'V': fprintf (stdout, "%s version %s\n", PACKAGE_NAME, VERSION); exit (EXIT_SUCCESS); break; default: fputs ("Try `sudosh -h' for more information.\n", stderr); exit (EXIT_FAILURE); break; } } if (ttyname (0) != NULL) { if (stat (ttyname (0), &ttybuf) == 0) { if ((getpwuid (ttybuf.st_uid)->pw_name) == NULL) { fprintf (stderr, "I have no idea who you are.\n"); exit (EXIT_FAILURE); } strncpy (user.from, getpwuid (ttybuf.st_uid)->pw_name, BUFSIZ - 1); } else { fprintf (stderr, "Couldn't stat %s\n", ttyname (0)); exit (EXIT_FAILURE); } } else { fprintf (stderr, "%s: couldn't get your controlling terminal.\n", progname); exit (EXIT_FAILURE); } user.pw = getpwuid ((uid_t) getuid ()); snprintf (user.home.str, BUFSIZ - 1, "HOME=%s", user.pw->pw_dir); strncpy (user.to_home.str, user.pw->pw_dir, BUFSIZ - 1); snprintf (user.term.str, BUFSIZ - 1, "TERM=%s", user.term.ptr); #ifdef HAVE_GETUSERSHELL if ((user.shell.ptr = getenv ("SHELL")) == NULL) user.shell.ptr = user.pw->pw_shell; /* check against /etc/shells to make sure it's a real shell */ setusershell (); while ((user.vshell = (char *) getusershell ()) != (char *) 0) { if (strcmp (user.shell.ptr, user.vshell) == 0) valid = 1; } endusershell (); if (valid != 1) { if (user.shell.ptr == NULL) { fprintf (stderr, "Could not determine a valid shell.\n"); if (sudosh_option.priority != -1) mysyslog (sudosh_option.priority, "Could not determine a valid shell"); exit (EXIT_FAILURE); } else { fprintf (stderr, "%s is not in /etc/shells\n", user.shell.ptr); mysyslog (sudosh_option.priority, "%s,%s: %s is not in /etc/shells", user.from, ttyname (0), user.shell.ptr); exit (EXIT_FAILURE); } } if (stat ((const char *) user.shell.ptr, &s) == -1) { fprintf (stderr, "Shell %s doesn't exist.\n", user.shell.ptr); if (sudosh_option.priority != -1) mysyslog (sudosh_option.priority, "%s,%s: shell %s doesn't exist.", user.from, ttyname (0), user.shell.ptr); exit (EXIT_FAILURE); } #else user.shell.ptr = user.pw->pw_shell; #endif /* HAVE_GETUSERSHELL */ if (loginshell) user.shell.ptr = sudosh_option.defshell; snprintf (script.name, (size_t) BUFSIZ - 1, "%s/%s%c%s%cscript%c%i%c%s", sudosh_option.logdir, user.from, sudosh_option.fdl, user.to, sudosh_option.fdl, sudosh_option.fdl, (int) now, sudosh_option.fdl, rand); snprintf (timing.name, (size_t) BUFSIZ - 1, "%s/%s%c%s%ctime%c%i%c%s", sudosh_option.logdir, user.from, sudosh_option.fdl, user.to, sudosh_option.fdl, sudosh_option.fdl, (int) now, sudosh_option.fdl, rand); #ifdef RECORDINPUT snprintf (input.name, (size_t) BUFSIZ - 1, "%s/%s%c%s%cinput%c%i%c%s", sudosh_option.logdir, user.from, sudosh_option.fdl, user.to, sudosh_option.fdl, sudosh_option.fdl, (int) now, sudosh_option.fdl, rand); #endif snprintf (start_msg, BUFSIZ - 1, "starting session for %s as %s, tty %s, shell %s", user.from, user.to, ttyname (0), user.shell.ptr); set_perms_and_open_file(&script); set_perms_and_open_file(&timing); #ifdef RECORDINPUT set_perms_and_open_file(&input); #endif if (sudosh_option.priority != -1) mysyslog (sudosh_option.priority, start_msg); rawmode (0); if (findms (&pspair) < 0) { perror ("open pty failed"); bye (EXIT_FAILURE); } switch (fork ()) { case 0: close (pspair.mfd); prepchild (&pspair); case -1: perror ("fork failed"); bye (EXIT_FAILURE); default: close (pspair.sfd); } orig_euid = geteuid(); if (seteuid (getuid ()) != 0) { perror ("setuid failed"); bye (EXIT_FAILURE); } memset (&sawinch, 0, sizeof sawinch); sawinch.sa_handler = newwinsize; sawinch.sa_flags = SA_RESTART; sigaction (SIGWINCH, &sawinch, (struct sigaction *) 0); memset (&saterm, 0, sizeof saterm); saterm.sa_handler = bye; sigaction (SIGTERM, &sawinch, (struct sigaction *) 0); memset (&sachild, 0, sizeof sachild); sachild.sa_handler = bye; sigaction (SIGCHLD, &sachild, (struct sigaction *) 0); oldtime = time (NULL); while (n > 0) { fd_set readfds; FD_ZERO (&readfds); FD_SET (pspair.mfd, &readfds); FD_SET (0, &readfds); gettimeofday ((struct timeval *) &tv, NULL); if (select (pspair.mfd + 1, &readfds, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0) < 0) { if (errno == EINTR) continue; perror ("select"); bye (EXIT_FAILURE); } if (FD_ISSET (pspair.mfd, &readfds)) { if ((n = read (pspair.mfd, iobuf, sizeof (iobuf))) > 0) { DO_WRITE (1, iobuf, n); script.bytes += DO_WRITE (script.fd, iobuf, n); } newtime = tv.tv_sec + (double) tv.tv_usec / 1000000; snprintf (timing.str, BUFSIZ - 1, "%f %i\n", newtime - oldtime, n); timing.bytes += DO_WRITE (timing.fd, &timing.str, strlen (timing.str)); oldtime = newtime; } if (FD_ISSET (0, &readfds)) { if ((n = read (0, iobuf, BUFSIZ)) > 0) { DO_WRITE (pspair.mfd, iobuf, n); #ifdef RECORDINPUT switch (*iobuf) { case '\r': snprintf (input.str, BUFSIZ - 1, "\n"); break; case 0x003: snprintf (input.str, BUFSIZ - 1, "(CTRL-C)"); break; case 0x004: snprintf (input.str, BUFSIZ - 1, "(CTRL-D)\n"); break; case 0x1a: snprintf (input.str, BUFSIZ - 1, "(CTRL-Z)\n"); break; case 0x1b: snprintf (input.str, BUFSIZ - 1, "(ESC)"); break; default: DO_WRITE (input.fd, iobuf, 1); written = 1; break; } if (written == 0) { DO_WRITE (input.fd, &input.str, strlen (input.str)); } #endif } } } bye (EXIT_SUCCESS); return (0); }
//main entry int main(int argc, char **argv) { unsigned int key = 0; signal(SIGINT, sig_handler); signal(SIGHUP, sig_handler); signal(SIGTERM, sig_handler); signal(SIGKILL, sig_handler); get_term_width_height(0, &gs.w, &gs.h); rawmode(); gs.buf = (char *)malloc(gs.w * gs.h+ gs.w); if( gs.buf == NULL ) goto EXIT; memset(gs.buf, 0, gs.w * gs.h+ gs.w); draw_start(); //start edit while(1) { key = get_key(); if( key == 'q' || key == 'Q' ) break; switch( key ) { case 's': case 'S': sc_cls(); break; case 'u': case 'U': sc_up(); break; case 'd': case 'D': sc_down(); break; case 'l': case 'L': sc_left(); break; case 'R': case 'r': sc_right(); break; default: sc_put_char(key); break; } } //free then exit free(gs.buf); normalmode(); EXIT: return 0; }
int main(int argc, char *argv[]) { void *ram; int opt, ret, fd; int malloc_size = CONFIG_MALLOC_SIZE; int fdno = 0, envno = 0, option_index = 0; while (1) { option_index = 0; opt = getopt_long(argc, argv, optstring, long_options, &option_index); if (opt == -1) break; switch (opt) { case 'h': print_usage(basename(argv[0])); exit(0); case 'm': malloc_size = strtoul(optarg, NULL, 0); break; case 'i': break; case 'e': break; case 'd': ret = add_dtb(optarg); if (ret) { printf("Failed to load dtb: '%s'\n", optarg); exit(1); } break; case 'O': fd = open(optarg, O_WRONLY); if (fd < 0) { perror("open"); exit(1); } barebox_register_console("cout", -1, fd); break; case 'I': fd = open(optarg, O_RDWR); if (fd < 0) { perror("open"); exit(1); } barebox_register_console("cin", fd, -1); break; case 'x': sdl_xres = strtoul(optarg, NULL, 0); break; case 'y': sdl_yres = strtoul(optarg, NULL, 0); break; default: exit(1); } } ram = malloc(malloc_size); if (!ram) { printf("unable to get malloc space\n"); exit(1); } mem_malloc_init(ram, ram + malloc_size - 1); /* * Reset getopt. * We need to run a second getopt to count -i parameters. * This is for /dev/fd# devices. */ optind = 1; while (1) { option_index = 0; opt = getopt_long(argc, argv, optstring, long_options, &option_index); if (opt == -1) break; switch (opt) { case 'i': ret = add_image(optarg, "fd%d", &fdno); if (ret) exit(1); break; case 'e': ret = add_image(optarg, "env%d", &envno); if (ret) exit(1); break; default: break; } } barebox_register_console("console", fileno(stdin), fileno(stdout)); rawmode(); start_barebox(); /* never reached */ return 0; }