diff options
author | Dexuan Cui <dexuan.cui@intel.com> | 2011-07-21 21:25:58 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-07-25 12:38:41 +0100 |
commit | ae7bf72292de3db370373eee6c8084af63d788b5 (patch) | |
tree | 9cec92bd658215a0fca36ced95936bc1204a265c /meta/recipes-devtools/tcf-agent | |
parent | 3a3c69a1bc3cf0b6f6a3b13d86c12ed21798d48e (diff) | |
download | openembedded-core-ae7bf72292de3db370373eee6c8084af63d788b5.tar.gz openembedded-core-ae7bf72292de3db370373eee6c8084af63d788b5.tar.bz2 openembedded-core-ae7bf72292de3db370373eee6c8084af63d788b5.zip |
tcf-agent: upgrade to the latest stable revision 0.0+svnr1855
Signed-off-by: Lianhao Lu <lianhao.lu@intel.com>
Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
Diffstat (limited to 'meta/recipes-devtools/tcf-agent')
4 files changed, 44 insertions, 1043 deletions
diff --git a/meta/recipes-devtools/tcf-agent/tcf-agent/fix_ranlib.patch b/meta/recipes-devtools/tcf-agent/tcf-agent/fix_ranlib.patch new file mode 100644 index 0000000000..5d704567c8 --- /dev/null +++ b/meta/recipes-devtools/tcf-agent/tcf-agent/fix_ranlib.patch @@ -0,0 +1,14 @@ +Upstream-Status: Inappropriate [poky-specific fix] + +--- a/Makefile.inc ++++ b/Makefile.inc +@@ -57,6 +57,9 @@ + ifeq ($(NO_UUID),) + LIBS += -luuid + endif ++ ifneq ($(RANLIB),) ++ RANLIB += $@ ++ endif + endif + + ifneq ($(OPSYS),Windows) diff --git a/meta/recipes-devtools/tcf-agent/tcf-agent/fix_tcf-agent.init.patch b/meta/recipes-devtools/tcf-agent/tcf-agent/fix_tcf-agent.init.patch index 60b0b2728e..fefaf040bb 100644 --- a/meta/recipes-devtools/tcf-agent/tcf-agent/fix_tcf-agent.init.patch +++ b/meta/recipes-devtools/tcf-agent/tcf-agent/fix_tcf-agent.init.patch @@ -2,15 +2,15 @@ Upstream-Status: Inappropriate [poky-specific script] --- a/Makefile +++ b/Makefile -@@ -32,7 +32,7 @@ - install -d -m 755 $(INSTALLROOT)$(SBIN) - install -d -m 755 $(INSTALLROOT)$(INIT) +@@ -64,7 +64,7 @@ + install -d -m 755 $(INSTALLROOT)$(INCLUDE)/tcf/services install -c $(BINDIR)/agent -m 755 $(INSTALLROOT)$(SBIN)/tcf-agent -- install -c $(TCF_AGENT_DIR)/main/tcf-agent.init -m 755 $(INSTALLROOT)$(INIT)/tcf-agent + install -c $(BINDIR)/client -m 755 $(INSTALLROOT)$(SBIN)/tcf-client +- install -c main/tcf-agent.init -m 755 $(INSTALLROOT)$(INIT)/tcf-agent + install -c tcf-agent.init -m 755 $(INSTALLROOT)$(INIT)/tcf-agent - - clean: - rm -rf $(BINDIR) + install -c config.h -m 755 $(INSTALLROOT)$(INCLUDE)/tcf/config.h + install -c -t $(INSTALLROOT)$(INCLUDE)/tcf/framework -m 644 framework/*.h + install -c -t $(INSTALLROOT)$(INCLUDE)/tcf/services -m 644 services/*.h --- /dev/null +++ b/tcf-agent.init @@ -0,0 +1,78 @@ diff --git a/meta/recipes-devtools/tcf-agent/tcf-agent/terminals_agent.patch b/meta/recipes-devtools/tcf-agent/tcf-agent/terminals_agent.patch deleted file mode 100644 index aed62fad84..0000000000 --- a/meta/recipes-devtools/tcf-agent/tcf-agent/terminals_agent.patch +++ /dev/null @@ -1,1027 +0,0 @@ -Upstream-Status: Inappropriate [source code; we'll remove it when upgrading tcf-agent in future] - -Index: org.eclipse.tm.tcf.terminals.agent/terminals.c -=================================================================== ---- org.eclipse.tm.tcf.terminals.agent/terminals.c (revision 0) -+++ org.eclipse.tm.tcf.terminals.agent/terminals.c (revision 0) -@@ -0,0 +1,846 @@ -+/******************************************************************************* -+ * Copyright (c) 2008 Wind River Systems, Inc. and others. -+ * All rights reserved. This program and the accompanying materials -+ * are made available under the terms of the Eclipse Public License v1.0 -+ * and Eclipse Distribution License v1.0 which accompany this distribution. -+ * The Eclipse Public License is available at -+ * http://www.eclipse.org/legal/epl-v10.html -+ * and the Eclipse Distribution License is available at -+ * http://www.eclipse.org/org/documents/edl-v10.php. -+ * -+ * Contributors: -+ * Wind River Systems - initial API and implementation -+ *******************************************************************************/ -+ -+/* -+ * Sample TCF service implementation. -+ */ -+ -+#include <config.h> -+#include <stdlib.h> -+#include <stdio.h> -+#include <string.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <signal.h> -+#include <assert.h> -+#include <termios.h> -+#ifndef TIOCGWINSZ -+#include <sys/ioctl.h> -+#endif -+#include <framework/myalloc.h> -+#include <framework/protocol.h> -+#include <framework/trace.h> -+#include <framework/context.h> -+#include <framework/json.h> -+#include <framework/asyncreq.h> -+#include <framework/exceptions.h> -+#include <framework/waitpid.h> -+#include <framework/signames.h> -+#include <services/streamsservice.h> -+#include <terminals.h> -+ -+#define TERMINALS_DEBUG 1 -+ -+#define TERMINALS_NO_LOGIN 0 -+ -+static const char * TERMINALS = "Terminals"; -+ -+#if defined(WIN32) -+# include <tlhelp32.h> -+# ifdef _MSC_VER -+# pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union (in winternl.h) */ -+# include <winternl.h> -+# else -+# include <ntdef.h> -+# endif -+# ifndef STATUS_INFO_LENGTH_MISMATCH -+# define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) -+# endif -+# ifndef SystemHandleInformation -+# define SystemHandleInformation 16 -+# endif -+# error("unsupported WIN32!") -+#elif defined(_WRS_KERNEL) -+# include <symLib.h> -+# include <sysSymTbl.h> -+# include <ioLib.h> -+# include <ptyDrv.h> -+# include <taskHookLib.h> -+# error("unsupported WRS!") -+#else -+# include <sys/stat.h> -+# include <unistd.h> -+# include <dirent.h> -+# if TERMINALS_NO_LOGIN -+# define TERM_LAUNCH_EXEC "/bin/bash" -+# define TERM_LAUNCH_ARGS {TERM_LAUNCH_EXEC, NULL} -+# else -+# define TERM_LAUNCH_EXEC "/bin/login" -+# define TERM_LAUNCH_ARGS {TERM_LAUNCH_EXEC, "-p", NULL} -+# endif -+#endif -+ -+#define PIPE_SIZE 0x1000 -+#define TERM_PROP_DEF_SIZE 256 -+ -+typedef struct Terminal -+{ -+ LINK link; -+ int pid; /*pid of the login process of the terminal*/ -+ TCFBroadcastGroup * bcg; -+ int inp; -+ int out; -+ int err; -+ struct TerminalInput * inp_struct; -+ struct TerminalOutput * out_struct; -+ struct TerminalOutput * err_struct; -+ char inp_id[256]; -+ char out_id[256]; -+ char err_id[256]; -+ -+ char pty_type[TERM_PROP_DEF_SIZE]; -+ char encoding[TERM_PROP_DEF_SIZE]; -+ unsigned long width; -+ unsigned long height; -+ long exit_code; -+ -+ Channel *channel; -+} Terminal; -+ -+typedef struct TerminalOutput -+{ -+ Terminal * prs; -+ AsyncReqInfo req; -+ int req_posted; -+ char buf[PIPE_SIZE]; -+ size_t buf_pos; -+ int eos; -+ VirtualStream * vstream; -+} TerminalOutput; -+ -+typedef struct TerminalInput -+{ -+ Terminal * prs; -+ AsyncReqInfo req; -+ int req_posted; -+ char buf[PIPE_SIZE]; -+ size_t buf_pos; -+ size_t buf_len; -+ int eos; -+ VirtualStream * vstream; -+} TerminalInput; -+ -+#define link2term(A) ((Terminal *)((char *)(A) - offsetof(Terminal, link))) -+ -+static LINK terms_list; -+#if defined(_WRS_KERNEL) -+static SEM_ID prs_list_lock = NULL; -+#endif -+ -+static Terminal * find_terminal(int pid) -+{ -+ LINK * qhp = &terms_list; -+ LINK * qp = qhp->next; -+ -+ while (qp != qhp) { -+ Terminal * prs = link2term(qp); -+ if (prs->pid == pid) -+ return prs; -+ qp = qp->next; -+ } -+ return NULL; -+} -+ -+static char * tid2id(int tid) -+{ -+ static char s[64]; -+ char * p = s + sizeof(s); -+ unsigned long n = (long) tid; -+ *(--p) = 0; -+ do { -+ *(--p) = (char) (n % 10 + '0'); -+ n = n / 10; -+ } while (n != 0); -+ -+ *(--p) = 'T'; -+ return p; -+} -+ -+static int id2tid(const char * id) -+{ -+ int tid = 0; -+ if (id == NULL) -+ return 0; -+ if (id[0] != 'T') -+ return 0; -+ if (id[1] == 0) -+ return 0; -+ tid = (unsigned) strtol(id + 1, (char **) &id, 10); -+ if (id[0] != 0) -+ return 0; -+ return tid; -+} -+ -+static void write_context(OutputStream * out, int tid) -+{ -+ Terminal * prs = find_terminal(tid); -+ -+ write_stream(out, '{'); -+ -+ if (prs != NULL) { -+ if (*prs->pty_type) { -+ json_write_string(out, "PtyType"); -+ write_stream(out, ':'); -+ json_write_string(out, prs->pty_type); -+ write_stream(out, ','); -+ } -+ -+ if (*prs->encoding) { -+ json_write_string(out, "Encoding"); -+ write_stream(out, ':'); -+ json_write_string(out, prs->encoding); -+ write_stream(out, ','); -+ } -+ -+ json_write_string(out, "Width"); -+ write_stream(out, ':'); -+ json_write_ulong(out, prs->width); -+ write_stream(out, ','); -+ -+ json_write_string(out, "Height"); -+ write_stream(out, ':'); -+ json_write_ulong(out, prs->height); -+ write_stream(out, ','); -+ -+ if (*prs->inp_id) { -+ json_write_string(out, "StdInID"); -+ write_stream(out, ':'); -+ json_write_string(out, prs->inp_id); -+ write_stream(out, ','); -+ } -+ if (*prs->out_id) { -+ json_write_string(out, "StdOutID"); -+ write_stream(out, ':'); -+ json_write_string(out, prs->out_id); -+ write_stream(out, ','); -+ } -+ if (*prs->err_id) { -+ json_write_string(out, "StdErrID"); -+ write_stream(out, ':'); -+ json_write_string(out, prs->err_id); -+ write_stream(out, ','); -+ } -+ } -+ -+ json_write_string(out, "ID"); -+ write_stream(out, ':'); -+ json_write_string(out, tid2id(tid)); -+ -+ write_stream(out, '}'); -+} -+ -+static void send_event_terminal_exited(OutputStream * out, Terminal * prs) -+{ -+ write_stringz(out, "E"); -+ write_stringz(out, TERMINALS); -+ write_stringz(out, "exited"); -+ -+ json_write_string(out, tid2id(prs->pid)); -+ write_stream(out, 0); -+ -+ json_write_ulong(out, prs->exit_code); -+ write_stream(out, 0); -+ -+ write_stream(out, MARKER_EOM); -+} -+ -+static void send_event_terminal_win_size_changed(OutputStream * out, -+ Terminal * prs) -+{ -+ write_stringz(out, "E"); -+ write_stringz(out, TERMINALS); -+ write_stringz(out, "winSizeChanged"); -+ -+ json_write_string(out, tid2id(prs->pid)); -+ write_stream(out, 0); -+ -+ json_write_long(out, prs->width); -+ write_stream(out, 0); -+ -+ json_write_long(out, prs->height); -+ write_stream(out, 0); -+ -+ write_stream(out, MARKER_EOM); -+} -+ -+static int kill_term(Terminal *term) -+{ -+ int err = 0; -+ -+#if defined(WIN32) -+ HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, term->pid); -+ if (h == NULL) -+ { -+ err = set_win32_errno(GetLastError()); -+ } -+ else -+ { -+ if (!TerminateProcess(h, 1)) err = set_win32_errno(GetLastError()); -+ if (!CloseHandle(h) && !err) err = set_win32_errno(GetLastError()); -+ } -+#else -+ if (kill(term->pid, SIGTERM) < 0) -+ err = errno; -+#endif -+ return err; -+} -+ -+static void command_exit(char * token, Channel * c) -+{ -+ int err = 0; -+ char id[256]; -+ unsigned tid; -+ Terminal *term = NULL; -+ -+ json_read_string(&c->inp, id, sizeof(id)); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ if (read_stream(&c->inp) != MARKER_EOM) -+ exception(ERR_JSON_SYNTAX); -+ -+ tid = id2tid(id); -+ write_stringz(&c->out, "R"); -+ write_stringz(&c->out, token); -+ -+ if (tid == 0) { -+ err = ERR_INV_CONTEXT; -+ } else { -+ term = find_terminal(tid); -+ if (term == NULL) { -+ err = ERR_INV_CONTEXT; -+ } else { -+ err = kill_term(term); -+ } -+ } -+ -+ write_errno(&c->out, err); -+ write_stream(&c->out, MARKER_EOM); -+} -+ -+static void terminal_exited(Terminal * prs) -+{ -+ Trap trap; -+ -+ if (set_trap(&trap)) { -+ send_event_terminal_exited(&prs->bcg->out, prs); -+ clear_trap(&trap); -+ } else { -+ trace(LOG_ALWAYS, "Exception sending terminal exited event: %d %s", -+ trap.error, errno_to_str(trap.error)); -+ } -+ -+#if defined(_WRS_KERNEL) -+ semTake(prs_list_lock, WAIT_FOREVER); -+#endif -+ list_remove(&prs->link); -+ close(prs->inp); -+ close(prs->out); -+ if (prs->out != prs->err) -+ close(prs->err); -+ if (prs->inp_struct) { -+ TerminalInput * inp = prs->inp_struct; -+ if (!inp->req_posted) { -+ virtual_stream_delete(inp->vstream); -+ loc_free(inp); -+ } else { -+ inp->prs = NULL; -+ } -+ } -+ if (prs->out_struct) -+ prs->out_struct->prs = NULL; -+ if (prs->err_struct) -+ prs->err_struct->prs = NULL; -+ loc_free(prs); -+#if defined(_WRS_KERNEL) -+ semGive(prs_list_lock); -+#endif -+} -+ -+static void terminal_input_streams_callback(VirtualStream * stream, -+ int event_code, void * args) -+{ -+ TerminalInput * inp = (TerminalInput *) args; -+ -+ assert(inp->vstream == stream); -+ if (!inp->req_posted) { -+ if (inp->buf_pos >= inp->buf_len && !inp->eos) { -+ inp->buf_pos = inp->buf_len = 0; -+ virtual_stream_get_data(stream, inp->buf, sizeof(inp->buf), -+ &inp->buf_len, &inp->eos); -+ } -+ if (inp->buf_pos < inp->buf_len) { -+ inp->req.u.fio.bufp = inp->buf + inp->buf_pos; -+ inp->req.u.fio.bufsz = inp->buf_len - inp->buf_pos; -+ inp->req_posted = 1; -+ async_req_post(&inp->req); -+ } -+ } -+} -+ -+static void write_terminal_input_done(void * x) -+{ -+ AsyncReqInfo * req = (AsyncReqInfo *) x; -+ TerminalInput * inp = (TerminalInput *) req->client_data; -+ -+ inp->req_posted = 0; -+ if (inp->prs == NULL) { -+ /* Process has exited */ -+ virtual_stream_delete(inp->vstream); -+ loc_free(inp); -+ } else { -+ int wr = inp->req.u.fio.rval; -+ -+ if (wr < 0) { -+ int err = inp->req.error; -+ trace(LOG_ALWAYS, "Can't write terminal input stream: %d %s", err, -+ errno_to_str(err)); -+ inp->buf_pos = inp->buf_len = 0; -+ } else { -+ inp->buf_pos += wr; -+ } -+ -+ terminal_input_streams_callback(inp->vstream, 0, inp); -+ } -+} -+ -+static void write_terminal_input(Terminal * prs) -+{ -+ TerminalInput * inp = prs->inp_struct = (TerminalInput *) loc_alloc_zero( -+ sizeof(TerminalInput)); -+ inp->prs = prs; -+ inp->req.client_data = inp; -+ inp->req.done = write_terminal_input_done; -+ inp->req.type = AsyncReqWrite; -+ inp->req.u.fio.fd = prs->inp; -+ virtual_stream_create(TERMINALS, tid2id(prs->pid), PIPE_SIZE, -+ VS_ENABLE_REMOTE_WRITE, terminal_input_streams_callback, inp, -+ &inp->vstream); -+ virtual_stream_get_id(inp->vstream, prs->inp_id, sizeof(prs->inp_id)); -+} -+ -+static void terminal_output_streams_callback(VirtualStream * stream, -+ int event_code, void * args) -+{ -+ TerminalOutput * out = (TerminalOutput *) args; -+ -+ assert(out->vstream == stream); -+ if (!out->req_posted) { -+ int buf_len = out->req.u.fio.rval; -+ int err = 0; -+ int eos = 0; -+ -+ if (buf_len < 0) { -+ buf_len = 0; -+ err = out->req.error; -+ } -+ if (buf_len == 0) -+ eos = 1; -+ if (out->prs == NULL) { -+ eos = 1; -+ err = 0; -+ } -+ -+ assert(buf_len <= (int)sizeof(out->buf)); -+ assert(out->buf_pos <= (size_t)buf_len); -+ assert(out->req.u.fio.bufp == out->buf); -+#ifdef __linux__ -+ if (err == EIO) -+ err = 0; -+#endif -+ if (err) -+ trace(LOG_ALWAYS, "Can't read terminal output stream: %d %s", err, -+ errno_to_str(err)); -+ -+ if (out->buf_pos < (size_t) buf_len || out->eos != eos) { -+ size_t done = 0; -+ virtual_stream_add_data(stream, out->buf + out->buf_pos, buf_len -+ - out->buf_pos, &done, eos); -+ out->buf_pos += done; -+ if (eos) -+ out->eos = 1; -+ } -+ -+ if (out->buf_pos >= (size_t) buf_len) { -+ if (!eos) { -+ out->req_posted = 1; -+ async_req_post(&out->req); -+ } else if (virtual_stream_is_empty(stream)) { -+ if (out->prs != NULL) { -+ if (out == out->prs->out_struct) -+ out->prs->out_struct = NULL; -+ if (out == out->prs->err_struct) -+ out->prs->err_struct = NULL; -+ } -+ virtual_stream_delete(stream); -+ loc_free(out); -+ } -+ } -+ } // end if(!out->req_posted) -+} -+ -+static void read_terminal_output_done(void * x) -+{ -+ AsyncReqInfo * req = (AsyncReqInfo *) x; -+ TerminalOutput * out = (TerminalOutput *) req->client_data; -+ -+ out->buf_pos = 0; -+ out->req_posted = 0; -+ terminal_output_streams_callback(out->vstream, 0, out); -+} -+ -+static TerminalOutput * read_terminal_output(Terminal * prs, int fd, char * id, -+ size_t id_size) -+{ -+ TerminalOutput * out = (TerminalOutput *) loc_alloc_zero( -+ sizeof(TerminalOutput)); -+ out->prs = prs; -+ out->req.client_data = out; -+ out->req.done = read_terminal_output_done; -+ out->req.type = AsyncReqRead; -+ out->req.u.fio.bufp = out->buf; -+ out->req.u.fio.bufsz = sizeof(out->buf); -+ out->req.u.fio.fd = fd; -+ virtual_stream_create(TERMINALS, tid2id(prs->pid), PIPE_SIZE, -+ VS_ENABLE_REMOTE_READ, terminal_output_streams_callback, out, -+ &out->vstream); -+ virtual_stream_get_id(out->vstream, id, id_size); -+ out->req_posted = 1; -+ async_req_post(&out->req); -+ return out; -+} -+ -+static char **envp_add(char **old_envp, int old_envp_len, char *env) -+{ -+ char **new_envp = NULL; -+ int i; -+ int env_size; -+ int old_envp_size; -+ -+ assert(old_envp || (old_envp==NULL && old_envp_len==0)); -+ assert(env); -+ assert(*env); -+ -+ for (i = 0, old_envp_size = 0; i < old_envp_len; i++) { -+ old_envp_size += sizeof(char *); //size of env pointer -+ old_envp_size += strlen(old_envp[i]) + 1; //size of env string, including trailing '\0' -+ } -+ assert((old_envp && old_envp[i]==NULL) || (old_envp==NULL)); -+ old_envp_size += sizeof(char *);//last null pointer -+ -+ env_size = strlen(env); //new env string size -+ -+ new_envp = loc_alloc(old_envp_size + sizeof(char *) + env_size + 1); -+ if (new_envp != NULL) { -+ new_envp[0] = (char *) new_envp + old_envp_size + sizeof(char *); //setting new env ptr -+ strcpy(new_envp[0], env); //copy new env string -+ if (old_envp) { -+ memcpy(&new_envp[1], old_envp, old_envp_size); //copy old envp -+ } else { -+ new_envp[1] = NULL; -+ } -+ } -+ return new_envp; -+} -+ -+static int start_terminal(Channel * c, char *pty_type, char *encoding, -+ char ** envp, int envp_len, char * exe, char ** args, int *pid, -+ Terminal ** prs) -+{ -+ int err = 0; -+ int fd_tty_master = -1; -+ char * tty_slave_name = NULL; -+ struct winsize size; -+ char **newenvp = envp; -+ -+ memset(&size, 0, sizeof(struct winsize)); -+ fd_tty_master = posix_openpt(O_RDWR | O_NOCTTY); -+ if (fd_tty_master < 0 || grantpt(fd_tty_master) < 0 || unlockpt( -+ fd_tty_master) < 0) -+ err = errno; -+ if (!err) { -+ tty_slave_name = ptsname(fd_tty_master); -+ if (tty_slave_name == NULL) -+ err = EINVAL; -+ } -+ -+ if (ioctl(fd_tty_master, TIOCGWINSZ, (char *) &size) < 0) -+ err = errno; -+ -+ if (!err && fd_tty_master < 3) { -+ int fd0 = fd_tty_master; -+ if ((fd_tty_master = dup(fd_tty_master)) < 0 || close(fd0)) -+ err = errno; -+ } -+ -+ if (!err) { -+ *pid = fork(); -+ if (*pid < 0) -+ err = errno; -+ if (*pid == 0) { -+ int fd = -1; -+ int fd_tty_slave = -1; -+ -+ if (*pty_type) { -+ char env_term[TERM_PROP_DEF_SIZE]; -+ snprintf(env_term, sizeof(env_term), "TERM=%s", pty_type); -+ newenvp = envp_add(envp, envp_len, env_term); -+ if (newenvp == NULL) { -+ err = ENOMEM; -+ } else if (envp) { -+ loc_free(envp); -+ envp = NULL; -+ } -+ } -+ -+ setsid(); -+ -+ if (!err && (fd = sysconf(_SC_OPEN_MAX)) < 0) -+ err = errno; -+ if (!err && (fd_tty_slave = open(tty_slave_name, O_RDWR)) < 0) -+ err = errno; -+#if defined(TIOCSCTTY) -+ if (!err && (ioctl(fd_tty_slave, TIOCSCTTY, (char *) 0)) < 0) -+ err = errno; -+#endif -+ if (!err && dup2(fd_tty_slave, 0) < 0) -+ err = errno; -+ if (!err && dup2(fd_tty_slave, 1) < 0) -+ err = errno; -+ if (!err && dup2(fd_tty_slave, 2) < 0) -+ err = errno; -+ while (!err && fd > 3) -+ close(--fd); -+ if (!err) { -+ execve(exe, args, newenvp); -+ err = errno; -+ } -+ if (newenvp) -+ loc_free(newenvp); -+ err = 1; -+ if (err < 1) -+ err = EINVAL; -+ else if (err > 0xff) -+ err = EINVAL; -+ exit(err); -+ } -+ } -+ -+ if (!err) { -+ *prs = (Terminal *) loc_alloc_zero(sizeof(Terminal)); -+ (*prs)->inp = fd_tty_master; -+ (*prs)->out = fd_tty_master; -+ (*prs)->err = fd_tty_master; -+ (*prs)->pid = *pid; -+ (*prs)->bcg = c->bcg; -+ (*prs)->channel = c; -+ if (*pty_type) -+ snprintf((*prs)->pty_type, sizeof((*prs)->pty_type), "%s", pty_type); -+ if (*encoding) -+ snprintf((*prs)->encoding, sizeof((*prs)->encoding), "%s", encoding); -+ (*prs)->width = size.ws_row; -+ (*prs)->height = size.ws_col; -+ list_add_first(&(*prs)->link, &terms_list); -+ } -+ -+ if (!err) -+ return 0; -+ errno = err; -+ return -1; -+} -+ -+static void command_get_context(char * token, Channel * c) -+{ -+ int err = 0; -+ char id[256]; -+ int tid; -+ Terminal *term; -+ -+ json_read_string(&c->inp, id, sizeof(id)); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ if (read_stream(&c->inp) != MARKER_EOM) -+ exception(ERR_JSON_SYNTAX); -+ -+ tid = id2tid(id); -+ write_stringz(&c->out, "R"); -+ write_stringz(&c->out, token); -+ -+ if (tid == 0) { -+ err = ERR_INV_CONTEXT; -+ } else { -+ term = find_terminal(tid); -+ if (term == NULL) { -+ err = ERR_INV_CONTEXT; -+ } else { -+ write_context(&c->out, tid); -+ write_stream(&c->out, 0); -+ } -+ } -+ -+ write_errno(&c->out, err); -+ write_stream(&c->out, MARKER_EOM); -+} -+ -+static void command_launch(char * token, Channel * c) -+{ -+ int pid = 0; -+ int err = 0; -+ char encoding[TERM_PROP_DEF_SIZE]; -+ char pty_type[TERM_PROP_DEF_SIZE]; -+ char *args[] = TERM_LAUNCH_ARGS; -+ -+ char ** envp = NULL; -+ int envp_len = 0; -+ -+ Terminal * prs = NULL; -+ Trap trap; -+ -+ if (set_trap(&trap)) { -+ json_read_string(&c->inp, pty_type, sizeof(pty_type)); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ json_read_string(&c->inp, encoding, sizeof(encoding)); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ envp = json_read_alloc_string_array(&c->inp, &envp_len); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ if (read_stream(&c->inp) != MARKER_EOM) -+ exception(ERR_JSON_SYNTAX); -+ -+ if (err == 0 && start_terminal(c, pty_type, encoding, envp, envp_len, -+ TERM_LAUNCH_EXEC, args, &pid, &prs) < 0) -+ err = errno; -+ if (prs != NULL) { -+ write_terminal_input(prs); -+ prs->out_struct = read_terminal_output(prs, prs->out, prs->out_id, -+ sizeof(prs->out_id)); -+ if (prs->out != prs->err) -+ prs->err_struct = read_terminal_output(prs, prs->err, -+ prs->err_id, sizeof(prs->err_id)); -+ } -+ if (!err) { -+ add_waitpid_process(pid); -+ } -+ //write result back -+ { -+ write_stringz(&c->out, "R"); -+ write_stringz(&c->out, token); -+ write_errno(&c->out, err); -+ if (err || pid == 0) { -+ write_stringz(&c->out, "null"); -+ } else { -+ write_context(&c->out, pid); -+ write_stream(&c->out, 0); -+ } -+ write_stream(&c->out, MARKER_EOM); -+ } -+ clear_trap(&trap); -+ } -+ -+ loc_free(envp); -+ -+ if (trap.error) -+ exception(trap.error); -+} -+ -+static void command_set_win_size(char * token, Channel * c) -+{ -+ int err = 0; -+ struct winsize size; -+ char id[256]; -+ unsigned tid; -+ Terminal *term = NULL; -+ -+ json_read_string(&c->inp, id, sizeof(id)); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ size.ws_col=json_read_ulong(&c->inp); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ size.ws_row=json_read_ulong(&c->inp); -+ if (read_stream(&c->inp) != 0) -+ exception(ERR_JSON_SYNTAX); -+ if (read_stream(&c->inp) != MARKER_EOM) -+ exception(ERR_JSON_SYNTAX); -+ -+ tid = id2tid(id); -+ -+ if(tid==0 || (term=find_terminal(tid))==NULL) { -+ err=ERR_INV_CONTEXT; -+ }else if (term->width != size.ws_col || term->height != size.ws_row) { -+ if(ioctl(term->inp,TIOCSWINSZ,&size)<0) { -+ err=errno; -+ } -+ if(!err) { -+ term->width=size.ws_col; -+ term->height=size.ws_row; -+ send_event_terminal_win_size_changed(&term->channel->out,term); -+ } -+ } -+ -+ write_stringz(&c->out, "R"); -+ write_stringz(&c->out, token); -+ write_errno(&c->out, err); -+ write_stream(&c->out, MARKER_EOM); -+ -+} -+ -+static void waitpid_listener(int pid, int exited, int exit_code, int signal, -+ int event_code, int syscall, void * args) -+{ -+ if (exited) { -+ Terminal * prs = find_terminal(pid); -+ if (prs) { -+ if (signal != 0) -+ prs->exit_code = -signal; -+ else -+ prs->exit_code = exit_code; -+ terminal_exited(prs); -+ } -+ } -+} -+ -+static void channel_close_listener(Channel * c) -+{ -+ LINK * l = NULL; -+ -+ for (l = terms_list.next; l != &terms_list;) { -+ Terminal * term = link2term(l); -+ l = l->next; -+ if (term->channel == c) { -+ trace(LOG_ALWAYS, "Terminal is left launched: T%d", term->pid); -+ kill_term(term); -+ } -+ } -+} -+ -+void ini_terminals_service(Protocol * proto) -+{ -+#if defined(_WRS_KERNEL) -+ prs_list_lock = semMCreate(SEM_Q_PRIORITY); -+ if (prs_list_lock == NULL) check_error(errno); -+ if (taskCreateHookAdd((FUNCPTR)task_create_hook) != OK) check_error(errno); -+ if (taskDeleteHookAdd((FUNCPTR)task_delete_hook) != OK) check_error(errno); -+#endif -+ list_init(&terms_list); -+ -+ add_waitpid_listener(waitpid_listener, NULL); -+ add_channel_close_listener(channel_close_listener); -+ -+ add_command_handler(proto, TERMINALS, "getContext", command_get_context); -+ add_command_handler(proto, TERMINALS, "launch", command_launch); -+ add_command_handler(proto, TERMINALS, "exit", command_exit); -+ add_command_handler(proto, TERMINALS, "setWinSize", command_set_win_size); -+} -Index: org.eclipse.tm.tcf.terminals.agent/main/services-ext.h -=================================================================== ---- org.eclipse.tm.tcf.terminals.agent/main/services-ext.h (revision 0) -+++ org.eclipse.tm.tcf.terminals.agent/main/services-ext.h (revision 0) -@@ -0,0 +1,25 @@ -+/******************************************************************************* -+ * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others. -+ * All rights reserved. This program and the accompanying materials -+ * are made available under the terms of the Eclipse Public License v1.0 -+ * and Eclipse Distribution License v1.0 which accompany this distribution. -+ * The Eclipse Public License is available at -+ * http://www.eclipse.org/legal/epl-v10.html -+ * and the Eclipse Distribution License is available at -+ * http://www.eclipse.org/org/documents/edl-v10.php. -+ * -+ * Contributors: -+ * Wind River Systems - initial API and implementation -+ *******************************************************************************/ -+ -+/* -+ * Services initialization code extension point. -+ * If the agent is built with additional user-defined services, -+ * a customized version of services-ext.h file can be added to compiler headers search paths. -+ */ -+ -+#include "terminals.h" -+ -+static void ini_ext_services(Protocol * proto, TCFBroadcastGroup * bcg) { -+ ini_terminals_service(proto); -+} -Index: org.eclipse.tm.tcf.terminals.agent/terminals.h -=================================================================== ---- org.eclipse.tm.tcf.terminals.agent/terminals.h (revision 0) -+++ org.eclipse.tm.tcf.terminals.agent/terminals.h (revision 0) -@@ -0,0 +1,27 @@ -+/******************************************************************************* -+ * Copyright (c) 2008 Wind River Systems, Inc. and others. -+ * All rights reserved. This program and the accompanying materials -+ * are made available under the terms of the Eclipse Public License v1.0 -+ * and Eclipse Distribution License v1.0 which accompany this distribution. -+ * The Eclipse Public License is available at -+ * http://www.eclipse.org/legal/epl-v10.html -+ * and the Eclipse Distribution License is available at -+ * http://www.eclipse.org/org/documents/edl-v10.php. -+ * -+ * Contributors: -+ * Wind River Systems - initial API and implementation -+ *******************************************************************************/ -+ -+/* -+ * Sample TCF service header file. -+ */ -+ -+#ifndef TERMINALS_H_ -+#define TERMINALS_H_ -+ -+#include <config.h> -+#include <framework/protocol.h> -+ -+extern void ini_terminals_service(Protocol * proto); -+ -+#endif /*TERMINALS_H_*/ -Index: org.eclipse.tm.tcf.terminals.agent/config.h -=================================================================== ---- org.eclipse.tm.tcf.terminals.agent/config.h (revision 0) -+++ org.eclipse.tm.tcf.terminals.agent/config.h (revision 0) -@@ -0,0 +1,63 @@ -+/******************************************************************************* -+ * Copyright (c) 2008 Wind River Systems, Inc. and others. -+ * All rights reserved. This program and the accompanying materials -+ * are made available under the terms of the Eclipse Public License v1.0 -+ * and Eclipse Distribution License v1.0 which accompany this distribution. -+ * The Eclipse Public License is available at -+ * http://www.eclipse.org/legal/epl-v10.html -+ * and the Eclipse Distribution License is available at -+ * http://www.eclipse.org/org/documents/edl-v10.php. -+ * -+ * Contributors: -+ * Wind River Systems - initial API and implementation -+ *******************************************************************************/ -+ -+/* -+ * This file contains "define" statements that control agent configuration. -+ * SERVICE_* definitions control which service implementations are included into the agent. -+ * -+ * This is example agent configuration. It includes only few standard services, -+ * and one example service: Day Time. -+ */ -+ -+#ifndef D_config -+#define D_config -+ -+#include <framework/mdep.h> -+ -+#if defined(WIN32) || defined(__CYGWIN__) -+# define TARGET_UNIX 0 -+#elif defined(_WRS_KERNEL) -+# define TARGET_UNIX 0 -+#else -+# define TARGET_UNIX 1 -+#endif -+ -+#define SERVICE_Locator 1 -+#define SERVICE_Processes 1 -+#define SERVICE_Streams 1 -+#define SERVICE_FileSystem 1 -+#define SERVICE_SysMonitor TARGET_UNIX -+ -+#define ENABLE_ZeroCopy 1 -+ -+#if !defined(ENABLE_Splice) -+# if ENABLE_ZeroCopy -+# include <fcntl.h> -+# if defined(SPLICE_F_MOVE) -+# define ENABLE_Splice 1 -+# else -+# define ENABLE_Splice 0 -+# endif -+# else -+# define ENABLE_Splice 0 -+# endif -+#endif -+ -+#define ENABLE_SSL 0 -+ -+#define ENABLE_Trace 1 -+#define ENABLE_Discovery 1 -+ -+ -+#endif /* D_config */ -Index: org.eclipse.tm.tcf.terminals.agent/Makefile -=================================================================== ---- org.eclipse.tm.tcf.terminals.agent/Makefile (revision 0) -+++ org.eclipse.tm.tcf.terminals.agent/Makefile (revision 0) -@@ -0,0 +1,39 @@ -+TCF_AGENT_DIR=../agent -+ -+include $(TCF_AGENT_DIR)/Makefile.inc -+ -+override CFLAGS += $(foreach dir,$(INCDIRS),-I$(dir)) $(OPTS) -+ -+HFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.h)) $(HFILES) -+CFILES := $(sort $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c)) $(CFILES)) -+ -+#no using SSL -+LIBS = -lpthread -lrt -+ -+EXECS = $(BINDIR)/agent$(EXTEXE) -+ -+all: $(EXECS) -+ -+$(BINDIR)/libtcf$(EXTLIB) : $(OFILES) -+ $(AR) rcs $@ $^ -+ -+$(BINDIR)/agent$(EXTEXE): $(BINDIR)/main/main$(EXTOBJ) $(BINDIR)/libtcf$(EXTLIB) -+ $(CC) $(CFLAGS) -o $@ $(BINDIR)/main/main$(EXTOBJ) $(BINDIR)/libtcf$(EXTLIB) $(LIBS) -+ -+$(BINDIR)/%$(EXTOBJ): %.c $(HFILES) Makefile -+ @mkdir -p $(dir $@) -+ $(CC) $(CFLAGS) -c -o $@ $< -+ -+$(BINDIR)/%$(EXTOBJ): $(TCF_AGENT_DIR)/%.c $(HFILES) Makefile -+ @mkdir -p $(dir $@) -+ $(CC) $(CFLAGS) -c -o $@ $< -+ -+install: all -+ install -d -m 755 $(INSTALLROOT)$(SBIN) -+ install -d -m 755 $(INSTALLROOT)$(INIT) -+ install -c $(BINDIR)/agent -m 755 $(INSTALLROOT)$(SBIN)/tcf-agent -+ install -c $(TCF_AGENT_DIR)/main/tcf-agent.init -m 755 $(INSTALLROOT)$(INIT)/tcf-agent -+ -+clean: -+ rm -rf $(BINDIR) -+ diff --git a/meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb b/meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb index 96b4ce0c51..3f97f69526 100644 --- a/meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb +++ b/meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb @@ -1,20 +1,28 @@ DESCRIPTION = "Target Communication Framework" -HOMEPAGE = "http://dsdp.eclipse.org/dsdp/tm/" +HOMEPAGE = "http://wiki.eclipse.org/TCF" BUGTRACKER = "https://bugs.eclipse.org/bugs/" LICENSE = "EPL-1 | EDLv1.0" LIC_FILES_CHKSUM = "file://../epl-v10.html;md5=7aa4215a330a0a4f6a1cbf8da1a0879f \ - file://../agent/edl-v10.html;md5=522a390a83dc186513f0500543ad3679" + file://edl-v10.html;md5=522a390a83dc186513f0500543ad3679" -SRCREV = "1078" -PV = "0.3.0+svnr${SRCPV}" +SRCREV = "1855" +PV = "0.0+svnr${SRCPV}" PR = "r0" -SRC_URI = "svn://dev.eclipse.org/svnroot/dsdp/org.eclipse.tm.tcf/;module=tags/0.3.0/;proto=http \ - file://terminals_agent.patch \ - file://fix_tcf-agent.init.patch" +SRC_URI = "svn://dev.eclipse.org/svnroot/dsdp/org.eclipse.tm.tcf/trunk;module=agent;proto=http \ + http://dev.eclipse.org/svnroot/dsdp/org.eclipse.tm.tcf/trunk/epl-v10.html;name=epl \ + file://fix_ranlib.patch \ + file://fix_tcf-agent.init.patch \ + " -S = "${WORKDIR}/tags/0.3.0/tcf-agent" +SRC_URI[epl.md5sum] = "7aa4215a330a0a4f6a1cbf8da1a0879f" +SRC_URI[epl.sha256sum] = "4fd64aeed340d62a64a8da4b371efe0f6d0d745f4d2dbefacba86c646d36bc72" + +DEPENDS = "util-linux" +RDEPENDS_${PN} = "bash" + +S = "${WORKDIR}/agent" inherit update-rc.d @@ -23,10 +31,16 @@ INITSCRIPT_PARAMS = "start 999 3 5 . stop 20 0 1 2 6 ." # mangling needed for make MAKE_ARCH = `echo ${TARGET_ARCH} | sed s,i.86,i686,` -MAKE_OS = `echo ${TARGET_OS} | sed s,linux,GNU/Linux,` +MAKE_OS = `echo ${TARGET_OS} | sed s,^linux.*,GNU/Linux,` EXTRA_OEMAKE = "MACHINE=${MAKE_ARCH} OPSYS=${MAKE_OS} 'CC=${CC}' 'AR=${AR}'" +# They don't build on ARM and we don't need them actually. +CFLAGS += "-DSERVICE_RunControl=0 -DSERVICE_Breakpoints=0 \ + -DSERVICE_Memory=0 -DSERVICE_Registers=0 -DSERVICE_MemoryMap=0 \ + -DSERVICE_StackTrace=0 -DSERVICE_Symbols=0 -DSERVICE_LineNumbers=0 \ + -DSERVICE_Expressions=0" + do_compile() { oe_runmake } |