📄 ecosynth.c
字号:
//============================================================================//// ecosynth.c//// The eCos synthetic target I/O auxiliary////============================================================================//####COPYRIGHTBEGIN####// // ----------------------------------------------------------------------------// Copyright (C) 2002 Bart Veer//// This file is part of the eCos host tools.//// This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version.// // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details.// // You should have received a copy of the GNU General Public License along with// this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.//// ----------------------------------------------------------------------------// //####COPYRIGHTEND####//============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): bartv// Contact(s): bartv// Date: 2002-08-05// Version: 0.01// Description://// The main module for the eCos synthetic target auxiliary. This// program is fork'ed and execve'd during the initialization phase of// any synthetic target application, and is primarily responsible for// I/O operations. This program should never be run directly by a// user.////####DESCRIPTIONEND####//============================================================================#include <stdio.h>#include <stdlib.h>#include <string.h>#include <signal.h>#include <limits.h>#include <unistd.h>#include <assert.h>#include <fcntl.h>#include <sys/param.h>#include <sys/types.h>// Avoid compatibility problems with Tcl 8.4 vs. earlier#define USE_NON_CONST#include <tcl.h>#include <tk.h>// The protocol between host and target is defined by a private// target-side header.#include "../src/synth_protocol.h"// ----------------------------------------------------------------------------// Statics etc.#define PROGNAME "Synthetic target auxiliary"static int no_windows = 0; // -nw argstatic pid_t parent_pid;// ----------------------------------------------------------------------------// Overview.//// When a synthetic target application is executed, whether directly// or from inside gdb, it can fork() and execve() the synthetic// target auxiliary: this program, ecosynth. For now this is disabled// by default but can be enabled using a --io option on the command line.// In future it may be enabled by default, but can be suppressed using// --nio.//// stdin, stdout, and stderr will be inherited from the eCos application, so// that attempts to use printf() or fprintf(stderr, ) from inside the// auxiliary or its helper applications work as expected. In addition file// descriptor 3 will be a pipe from the eCos application, and file descriptor// 4 will be a pipe to the application. The protocol defined in// ../src/synth_protocol.h runs over these pip//// argv[] and environ are also as per the application, with the exception// of argv[0] which is the full path to this application.//// The bulk of the hard work is done inside Tcl. The C++ code is// responsible only for initialization and for implementing some// additional commands, for example to send a SIGIO signal to the// parent when there is a new pending interrupt. The primary script is// ecosynth.tcl which should be installed alongside the executable.//// This code makes use of the standard Tcl initialization facilities://// 1) main() calls Tcl_Main() with the command-line arguments and an// application-specific initialization routine ecosynth_appinit().//// 2) Tcl_Main() goes through the initialization sequence in generic/tclMain.c.// There is one slight complication: Tcl_main() interprets arguments in// a way that makes sense for tclsh, but not for ecosynth. Specially if// argv[1] exists and does not begin with a - then it will be interpreted// as a script to be executed. Hence argv[] is re-allocated and the name// of a suitable script is inserted.//// 3) ecosynth_appinit() initializes the Tcl interpreter, and optionally// the Tk interpreter as well. This is controlled by the presence of// a -nw argument on the command line. This initialization routine// also takes care of adding some commands to the Tcl interpreter.//// 4) Tcl_Main() will now proceed to execute the startup script, which// is eccentric.tcl installed in the libexec directory.static int ecosynth_appinit(Tcl_Interp*);intmain(int argc, char** argv){ char ecosynth_tcl_path[_POSIX_PATH_MAX]; char** new_argv; int i; parent_pid = getppid(); // The various core Tcl scripts are installed in the same // directory as ecosynth. The Tcl script itself will check whether // there is a newer version of itself in the source tree and // switch to that instead. assert((strlen(LIBEXECDIR) + strlen(PACKAGE_INSTALL) + 20) < _POSIX_PATH_MAX); strcpy(ecosynth_tcl_path, LIBEXECDIR); strcat(ecosynth_tcl_path, "/ecos/"); strcat(ecosynth_tcl_path, PACKAGE_INSTALL); strcat(ecosynth_tcl_path, "/ecosynth.tcl"); // Installation sanity checks. if (0 != access(ecosynth_tcl_path, F_OK)) { fprintf(stderr, PROGNAME ": error, a required Tcl script has not been installed.\n"); fprintf(stderr, " The script is \"%s\"\n", ecosynth_tcl_path); exit(EXIT_FAILURE); } if (0 != access(ecosynth_tcl_path, R_OK)) { fprintf(stderr, PROGNAME ": error, no read access to a required Tcl script.\n"); fprintf(stderr, " The script is \"%s\"\n", ecosynth_tcl_path); exit(EXIT_FAILURE); } // Look for options -nw and -w. This information is needed by the appinit() routine. no_windows = 0; for (i = 1; i < argc; i++) { if ((0 == strcmp("-nw", argv[i])) || (0 == strcmp("--nw", argv[i])) || (0 == strcmp("-no-windows", argv[i])) || (0 == strcmp("--no-windows", argv[i]))) { no_windows = 1; } else if ((0 == strcmp("-w", argv[i])) || (0 == strcmp("--w", argv[i])) || (0 == strcmp("-windows", argv[i])) || (0 == strcmp("--windows", argv[i]))) { no_windows = 0; } } new_argv = malloc((argc+2) * sizeof(char*)); if (NULL == new_argv) { fprintf(stderr, PROGNAME ": internal error, out of memory.\n"); exit(EXIT_FAILURE); } new_argv[0] = argv[0]; new_argv[1] = ecosynth_tcl_path; for (i = 1; i < argc; i++) { new_argv[i+1] = argv[i]; } new_argv[i+1] = NULL; // Ignore SIGINT requests. Those can happen if e.g. the application is // ctrl-C'd or if a gdb session is interrupted because this process is // a child of the eCos application. Instead the normal code for handling // application termination needs to run. signal(SIGINT, SIG_IGN);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -