/* This is a helper for the `set logging' command. */ static void handle_redirections (int from_tty) { struct ui_file *output; if (saved_filename != NULL) { fprintf_unfiltered (gdb_stdout, "Already logging to %s.\n", saved_filename); return; } output = gdb_fopen (logging_filename, logging_overwrite ? "w" : "a"); if (output == NULL) perror_with_name ("set logging"); /* Redirects everything to gdb_stdout while this is running. */ if (!logging_redirect) { output = tee_file_new (gdb_stdout, 0, output, 1); if (output == NULL) perror_with_name ("set logging"); if (from_tty) fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n", logging_filename); } else if (from_tty) fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", logging_filename); saved_filename = xstrdup (logging_filename); saved_output.out = gdb_stdout; saved_output.err = gdb_stderr; saved_output.log = gdb_stdlog; saved_output.targ = gdb_stdtarg; gdb_stdout = output; gdb_stderr = output; gdb_stdlog = output; gdb_stdtarg = output; if (ui_out_redirect (uiout, gdb_stdout) < 0) warning ("Current output protocol does not support redirection"); }
struct serial * serial_open (const char *name) { struct serial *scb; const struct serial_ops *ops; const char *open_name = name; if (strcmp (name, "pc") == 0) ops = serial_interface_lookup ("pc"); else if (startswith (name, "lpt")) ops = serial_interface_lookup ("parallel"); else if (startswith (name, "|")) { ops = serial_interface_lookup ("pipe"); /* Discard ``|'' and any space before the command itself. */ ++open_name; open_name = skip_spaces_const (open_name); } /* Check for a colon, suggesting an IP address/port pair. Do this *after* checking for all the interesting prefixes. We don't want to constrain the syntax of what can follow them. */ else if (strchr (name, ':')) ops = serial_interface_lookup ("tcp"); else ops = serial_interface_lookup ("hardwire"); if (!ops) return NULL; scb = XNEW (struct serial); scb->ops = ops; scb->bufcnt = 0; scb->bufp = scb->buf; scb->error_fd = -1; scb->refcnt = 1; /* `...->open (...)' would get expanded by the open(2) syscall macro. */ if ((*scb->ops->open) (scb, open_name)) { xfree (scb); return NULL; } scb->name = xstrdup (name); scb->next = scb_base; scb->debug_p = 0; scb->async_state = 0; scb->async_handler = NULL; scb->async_context = NULL; scb_base = scb; if (serial_logfile != NULL) { serial_logfp = gdb_fopen (serial_logfile, "w"); if (serial_logfp == NULL) perror_with_name (serial_logfile); } return scb; }
struct serial * serial_open (const char *name) { struct serial *scb; struct serial_ops *ops; const char *open_name = name; for (scb = scb_base; scb; scb = scb->next) if (scb->name && strcmp (scb->name, name) == 0) { scb->refcnt++; return scb; } if (strcmp (name, "pc") == 0) ops = serial_interface_lookup ("pc"); else if (strchr (name, ':')) ops = serial_interface_lookup ("tcp"); else if (strncmp (name, "lpt", 3) == 0) ops = serial_interface_lookup ("parallel"); else if (strncmp (name, "|", 1) == 0) { ops = serial_interface_lookup ("pipe"); open_name = name + 1; /* discard ``|'' */ } else ops = serial_interface_lookup ("hardwire"); if (!ops) return NULL; scb = XMALLOC (struct serial); scb->ops = ops; scb->bufcnt = 0; scb->bufp = scb->buf; if (scb->ops->open (scb, open_name)) { xfree (scb); return NULL; } scb->name = xstrdup (name); scb->next = scb_base; scb->refcnt = 1; scb->debug_p = 0; scb->async_state = 0; scb->async_handler = NULL; scb->async_context = NULL; scb_base = scb; last_serial_opened = scb; if (serial_logfile != NULL) { serial_logfp = gdb_fopen (serial_logfile, "w"); if (serial_logfp == NULL) perror_with_name (serial_logfile); } return scb; }