/* TUI readline command. Switch the output mode between TUI/standard gdb. */ static int tui_rl_switch_mode (int notused1, int notused2) { if (tui_active) { tui_disable (); rl_prep_terminal (0); } else { rl_deprep_terminal (); tui_enable (); } /* Clear the readline in case switching occurred in middle of something. */ if (rl_end) rl_kill_text (0, rl_end); /* Since we left the curses mode, the terminal mode is restored to some previous state. That state may not be suitable for readline to work correctly (it may be restored in line mode). We force an exit of the current readline so that readline is re-entered and it will be able to setup the terminal for its needs. By re-entering in readline, we also redisplay its prompt in the non-curses mode. */ rl_newline (1, '\n'); /* Make sure the \n we are returning does not repeat the last command. */ dont_repeat (); return 0; }
/* * Class: org_tzi_use_util_input_GNUReadline * Method: prepareClose * Signature: ()V */ JNIEXPORT void JNICALL Java_org_tzi_use_util_input_GNUReadline_close(JNIEnv *env, jobject obj) { rl_done = 1; rl_free_line_state(); rl_deprep_terminal(); }
/* Restore the terminal's normal settings and modes. */ void jl_deprep_terminal () { FILE *rl_in = rl_instream; rl_instream = stdin; rl_deprep_terminal(); rl_instream = rl_in; #ifdef __WIN32__ if (jl_uv_stdin->type == UV_TTY) uv_tty_set_mode((uv_tty_t*)jl_uv_stdin,0); // cooked #endif }
/* save readline internal state in rl_state, redisplay the prompt (so that client output gets printed at the right place) */ void save_rl_state() { free(saved_rl_state.input_buffer); /* free(saved_rl_state.raw_prompt) */; saved_rl_state.input_buffer = mysavestring(rl_line_buffer); /* saved_rl_state.raw_prompt = mysavestring(rl_prompt); */ saved_rl_state.point = rl_point; /* and point */ rl_line_buffer[0] = '\0'; if (saved_rl_state.already_saved) return; saved_rl_state.already_saved = 1; rl_delete_text(0, rl_end); /* clear line (after prompt) */ rl_point = 0; my_redisplay(); /* and redisplay (this time without user input, cf the comments for the line_handler() function below) */ rl_callback_handler_remove(); /* restore original terminal settings */ rl_deprep_terminal(); }
// // Function: cmdInputCleanup // // Cleanup the input stream by free-ing the last malloc-ed data // and cleaning up the readline library interface // void cmdInputCleanup(cmdInput_t *cmdInput) { // Add previous read to history when applicable if (cmdInput->readMethod == CMD_INPUT_READLINELIB) { if (cmdInput->input != NULL && (cmdInput->input)[0] != '\0' && (cmdInput->input)[0] != '\n') add_history(cmdInput->input); } // Cleanup previous read if (cmdInput->input != NULL) { free(cmdInput->input); cmdInput->input = NULL; } // Cleanup the readline interface if (cmdInput->readMethod == CMD_INPUT_READLINELIB) { rl_deprep_terminal(); rl_reset_terminal(NULL); } }
void log_close() { fclose(logfile); rl_deprep_terminal(); }
void cli_exit(void) { rl_callback_handler_remove(); rl_deprep_terminal(); write_history(histfile); }
void cmd_getnum(const unsigned long int idx, const unsigned long int spice) { xmlNodePtr db_node = NULL; xmlChar *key = NULL, *value = NULL, *value_nl = NULL, *line = NULL, *line_randomed = NULL, *tmp = NULL; unsigned long int lines = 0, line_req = 1, value_len = 0, line_len = 0, line_randomed_len = 0, erase_len = 0, i = 0; char rc = 0; char *rand_str = NULL; char **fork_argv = NULL; int child; int pipefd[2]; db_node = find_key(idx); if (db_node) { key = xmlGetProp(db_node, BAD_CAST "name"); value = xmlGetProp(db_node, BAD_CAST "value"); value_nl = parse_newlines(value, 0); xmlFree(value); value = NULL; value_len = xmlStrlen(value_nl); /* count how many (new)lines are in the string */ for (i=0; i < value_len; i++) if (value_nl[i] == '\n') lines++; lines++; #ifndef _READLINE /* clear the prompt temporarily */ if (el_set(e, EL_PROMPT, el_prompt_null) != 0) { perror("ERROR: el_set(EL_PROMPT)"); } if (el_set(e, EL_UNBUFFERED, 1) != 0) { perror("ERROR: el_set(EL_UNBUFFERED)"); xmlFree(key); key = NULL; xmlFree(value_nl); value_nl = NULL; return; } #else rl_prep_terminal(1); #endif while (rc != 'q' && rc != 4) { /* quit for 'q' or EOT */ if (batchmode) puts(""); printf("[%s] ", key); /* print the key */ /* if multiline, prefix the line with a line number */ if (lines > 1) printf("[%lu/%lu] ", line_req, lines); /* get a line out from the value */ line = get_line(value_nl, line_req); line_len = xmlStrlen(line); if (spice > 0) { /* if random padding is requested */ line_randomed_len = line_len + line_len * spice + spice + 1; line_randomed = calloc(1, line_randomed_len); malloc_check(line_randomed); /* begin with the random string */ rand_str = get_random_str(spice, 1); if (!rand_str) { xmlFree(key); key = NULL; xmlFree(value_nl); value_nl = NULL; xmlFree(line); line = NULL; free(line_randomed); line_randomed = NULL; return; } (void) strlcat((char *)line_randomed, rand_str, line_randomed_len); free(rand_str); rand_str = NULL; for (i = 0; i < line_len; i++) { /* append a character from the line */ tmp = xmlUTF8Strsub(line, i, 1); (void) strlcat((char *)line_randomed, (const char *)tmp, line_randomed_len); xmlFree(tmp); tmp = NULL; /* append a random string */ rand_str = get_random_str(spice, 1); if (!rand_str) { xmlFree(key); key = NULL; xmlFree(value_nl); value_nl = NULL; xmlFree(line); line = NULL; free(line_randomed); line_randomed = NULL; return; } (void) strlcat((char *)line_randomed, rand_str, line_randomed_len); free(rand_str); rand_str = NULL; } line_randomed[line_randomed_len - 1] = '\0'; xmlFree(line); line = NULL; line = line_randomed; } printf("%s", line); #ifdef _READLINE rl_redisplay(); #endif if (batchmode) { rc = 'q'; puts(""); } else { /* this is the prompt, after displaying the value */ #ifndef _READLINE el_getc(e, &rc); #else rc = rl_read_key(); #endif /* erase (overwrite) the previously written value with spaces */ printf("\r"); erase_len = ERASE_LEN; for (i = 0; i < erase_len; i++) putchar(' '); printf("\r"); /* process the keypress */ switch (rc) { /* line forward */ case 'f': case 'n': case 'j': case '+': case ' ': case '>': case ']': case '}': case 10: /* editline */ case 13: /* readline */ if (line_req < lines) line_req++; break; /* line backward */ case 'b': case 'p': case 'k': case '-': case '<': case '[': case '{': case 8: if (line_req - 1 > 0) line_req--; break; /* jump to the requested line */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if ((unsigned char)(rc - 48) <= lines) line_req = rc - 48; break; case 't': /* This is duplicated in cmd_clipboard.c */ /* Copy value to tmux paste buffer */ switch (child = fork()) { case -1: perror("\nERROR: Couldn't fork(2) for tmux(1)"); break; case 0: /* Child */ close(0); /* This is also needed for Editline's UNBUFFERED mode to continue to work properly. */ close(1); if (bio_chain) BIO_free_all(bio_chain); if (db_params.db_file) { if (close(db_params.db_file) == -1) { perror("ERROR: child: close(database file)"); exit(EXIT_FAILURE); } else { db_params.db_file = -1; } } fork_argv = malloc(5 * sizeof(char *)); malloc_check(fork_argv); fork_argv[0] = "tmux"; fork_argv[1] = "set-buffer"; fork_argv[2] = "--"; fork_argv[3] = (char *) line; fork_argv[4] = NULL; if (execvp(fork_argv[0], fork_argv) == -1) dprintf(STDERR_FILENO, "ERROR: tmux: %s\n", strerror(errno)); quit(EXIT_FAILURE); break; default: /* Parent */ rc = 'q'; break; } break; case 'x': case 'X': /* This is duplicated in cmd_clipboard.c */ /* Copy value to X11 clipboard, using xclip(1) */ pipe(pipefd); switch (child = fork()) { case -1: perror("\nERROR: Couldn't fork(2) for xclip(1)"); break; case 0: /* Child */ close(0); /* This is also needed for Editline's UNBUFFERED mode to continue to work properly. */ close(1); close(pipefd[1]); if (bio_chain) BIO_free_all(bio_chain); if (db_params.db_file) { if (close(db_params.db_file) == -1) { perror("ERROR: child: close(database file)"); exit(EXIT_FAILURE); } else { db_params.db_file = -1; } } fork_argv = malloc(4 * sizeof(char *)); malloc_check(fork_argv); fork_argv[0] = "xclip"; fork_argv[1] = "-selection"; if (rc == 'x') { fork_argv[2] = "primary"; } else if (rc == 'X') { fork_argv[2] = "clipboard"; } fork_argv[3] = NULL; /* stdin becomes the read end of the pipe in the child, * and the exec'd process will have the same environment. */ dup2(pipefd[0], 0); if (execvp(fork_argv[0], fork_argv) == -1) dprintf(STDERR_FILENO, "ERROR: xclip: %s\n", strerror(errno)); quit(EXIT_FAILURE); break; default: /* Parent */ /* Write the value to the pipe's write end, which will * appear in the child's stdin (pipe's read end). */ close(pipefd[0]); write(pipefd[1], line, line_len); close(pipefd[1]); rc = 'q'; break; } break; default: break; } } xmlFree(line); line = NULL; } xmlFree(key); key = NULL; xmlFree(value_nl); value_nl = NULL; #ifndef _READLINE /* re-enable the default prompt */ if (el_set(e, EL_PROMPT, prompt_str) != 0) { perror("ERROR: el_set(EL_PROMPT)"); } el_set(e, EL_UNBUFFERED, 0); #else rl_deprep_terminal(); #endif } else puts("Invalid index!"); } /* cmd_getnum() */
int main(int argc, char* argv[]) { static struct option program_options[] = { {"silent", no_argument, NULL, 's'}, }; while(1) { int option_index = 0; int c = getopt_long(argc, argv, "s", program_options, &option_index); if(c == -1) break; switch(c) { case 's': silent = 1; break; }; } read_history(".oibc-history"); usb_init(); usb_find_busses(); usb_find_devices(); struct usb_bus *busses; struct usb_bus *bus; struct usb_device *dev; busses = usb_get_busses(); int found = 0; int c, i, a; for(bus = busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { /* Check if this device is a printer */ //if (dev->descriptor.idVendor != 0x05ac || dev->descriptor.idProduct != 0x1280) { if (dev->descriptor.idVendor != 0x0525 || dev->descriptor.idProduct != 0x1280) { continue; } /* Loop through all of the interfaces */ for (i = 0; i < dev->config[0].bNumInterfaces; i++) { for (a = 0; a < dev->config[0].interface[i].num_altsetting; a++) { if(dev->config[0].interface[i].altsetting[a].bInterfaceClass == 0xFF && dev->config[0].interface[i].altsetting[a].bInterfaceSubClass == 0xFF && dev->config[0].interface[i].altsetting[a].bInterfaceProtocol == 0x51) { goto done; } } } } } oibc_log("Failed to find a device in OpeniBoot mode.\n"); return 1; done: device = usb_open(dev); if(!device) { oibc_log("Failed to open OpeniBoot device.\n"); return 2; } if(usb_claim_interface(device, i) != 0) { oibc_log("Failed to claim OpeniBoot device.\n"); return 3; } pthread_t inputThread; pthread_t outputThread; oibc_log("OiB client connected:\n"); oibc_log("!<filename>[@<address>] to send a file, ~<filename>[@<address>]:<len> to receive a file\n"); oibc_log("---------------------------------------------------------------------------------------------------------\n"); pthread_create(&outputThread, NULL, doOutput, NULL); pthread_create(&inputThread, NULL, doInput, NULL); pthread_mutex_lock(&exitLock); pthread_cond_wait(&exitCond, &exitLock); pthread_mutex_unlock(&exitLock); pthread_cancel(inputThread); pthread_cancel(outputThread); rl_deprep_terminal(); // If we cancel readline, we must call this to not fsck up the terminal. usb_release_interface(device, i); usb_close(device); }