[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[SCM] GNU Inetutils branch, master, updated. release_1_5-187-g21e83dd
From: |
Giuseppe Scrivano |
Subject: |
[SCM] GNU Inetutils branch, master, updated. release_1_5-187-g21e83dd |
Date: |
Thu, 20 Aug 2009 10:39:39 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Inetutils ".
http://git.savannah.gnu.org/cgit/inetutils.git/commit/?id=21e83ddbb7f518d80618f5af212137cb60fcaed2
The branch, master has been updated
via 21e83ddbb7f518d80618f5af212137cb60fcaed2 (commit)
from 09cc6ce9657c85f9843c1c30279ec03ffbc6faf3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 21e83ddbb7f518d80618f5af212137cb60fcaed2
Author: Giuseppe Scrivano <address@hidden>
Date: Tue Jul 28 17:43:45 2009 +0200
rexec: new program
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 10 ++
Makefile.am | 2 +-
configure.ac | 2 +
doc/inetutils.texi | 38 +++++
{rexecd => rexec}/Makefile.am | 12 +-
rexec/rexec.c | 323 +++++++++++++++++++++++++++++++++++++++++
6 files changed, 380 insertions(+), 7 deletions(-)
copy {rexecd => rexec}/Makefile.am (78%)
create mode 100644 rexec/rexec.c
diff --git a/ChangeLog b/ChangeLog
index 0a01371..107bdd5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-08-20 Giuseppe Scrivano <address@hidden>
+
+ rexec: new program.
+
+ * configure.ac: Build rexec.
+ * Makefile.am: Ditto.
+ * doc/inetutils.texi: Document the new program.
+ * rexec/Makefile.am: New file.
+ * rexec/rexec.c: New file.
+
2009-08-18 Sergey Poznyakoff <address@hidden>
Fix possible array overflow in ping.
diff --git a/Makefile.am b/Makefile.am
index 061af2b..7d2d1b8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -25,7 +25,7 @@ EXTRA_DIST = README-alpha paths ChangeLog.0
SUBDIRS = lib headers libinetutils libtelnet \
hostname inetd telnetd libls ftpd rshd rlogind uucpd rexecd syslogd \
tftpd talkd telnet ftp rsh rcp rlogin tftp logger gwhois talk \
- libicmp ping doc ifconfig traceroute tests
+ libicmp ping doc ifconfig traceroute rexec tests
DISTCLEANFILES = pathdefs.make paths.defs
diff --git a/configure.ac b/configure.ac
index fdff8d3..0b8ebb5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -108,6 +108,7 @@ IU_ENABLE_CLIENT(hostname)
IU_ENABLE_CLIENT(ping)
IU_ENABLE_CLIENT(ping6)
IU_ENABLE_CLIENT(rcp)
+IU_ENABLE_CLIENT(rexec)
IU_ENABLE_CLIENT(rlogin)
IU_ENABLE_CLIENT(rsh)
IU_ENABLE_CLIENT(logger)
@@ -820,6 +821,7 @@ ftpd/Makefile
hostname/Makefile
inetd/Makefile
rcp/Makefile
+rexec/Makefile
rexecd/Makefile
rlogin/Makefile
rlogind/Makefile
diff --git a/doc/inetutils.texi b/doc/inetutils.texi
index 86360fd..ec011ee 100644
--- a/doc/inetutils.texi
+++ b/doc/inetutils.texi
@@ -34,6 +34,7 @@
* logger: (inetutils)logger invocation. Send messages to the system
log.
* ping: (inetutils)ping invocation. Packets to network hosts.
* rcp: (inetutils)rcp invocation. Remote copy
+* rexec: (inetutils)rexec invocation. Remote execution client.
* rexecd: (inetutils)rexecd invocation. Remote execution server.
* rlogin: (inetutils)rlogin invocation. Remote login.
* rlogind: (inetutils)rlogind invocation. Remote login server.
@@ -107,6 +108,7 @@ Clients
* tftp invocation:: TFTP client.
* rsh invocation:: Remote shell.
* rlogin invocation:: Remote login.
+* rexec invocation:: Remote execution client.
* rcp invocation:: Remote copy
* talk invocation:: Talk client.
* telnet invocation:: User interface to TELNET.
@@ -1751,6 +1753,42 @@ The destination user and hostname may have to be
specified as
@samp{rhost.rname} when the destination machine is running the 4.2BSD
version of @command{rcp}.
address@hidden rexec invocation
address@hidden @command{rexec}: a remote execution program
address@hidden rexec
+
address@hidden is a program that executes a program on another host.
+
address@hidden
+rexec address@hidden address@hidden address@hidden \
+ [OPTION] @var{command}
address@hidden example
+
+The command line arguments are as follows:
+
address@hidden @var
address@hidden --error
+Specify the TCP port to use for stderr redirection, in case it is not
+specified a random port will be used.
+
address@hidden --host
+Specify the host where connect to.
+
address@hidden --noerr
+If specified, an error stream will not be created.
+
address@hidden --password
+Specify the password for logging-in.
+
address@hidden --port
+Specify to which port connect to, if it is not specified by default
+use 512.
+
address@hidden --user
+Specify the user to log into the server.
address@hidden table
+
+
@node talk invocation
@chapter @command{talk}: a communication program
@cindex talk
diff --git a/rexecd/Makefile.am b/rexec/Makefile.am
similarity index 78%
copy from rexecd/Makefile.am
copy to rexec/Makefile.am
index 6c0d033..74d9d74 100644
--- a/rexecd/Makefile.am
+++ b/rexec/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc.
# This file is part of GNU Inetutils.
#
# GNU Inetutils is free software; you can redistribute it and/or modify
@@ -16,18 +16,18 @@
# to the Free Software Foundation, Inc., 51 Franklin Street,
# Fifth Floor, Boston, MA 02110-1301 USA.
-inetdaemondir = @inetdaemondir@
+bin_PROGRAMS = @rexec_BUILD@
-inetdaemon_PROGRAMS = @rexecd_BUILD@
+EXTRA_PROGRAMS = rexec
-EXTRA_PROGRAMS = rexecd
+rexec_SOURCES = rexec.c
-rexecd_SOURCES = rexecd.c
+noinst_HEADERS =
@PATHDEFS_MAKE@
+INCLUDES = -I$(top_srcdir)/lib -I../lib -I$(top_srcdir)/libinetutils
AM_CPPFLAGS = $(PATHDEF_DEFPATH) $(PATHDEF_BSHELL)
-INCLUDES=-I$(top_srcdir)/lib -I../lib -I$(top_srcdir)/libinetutils
LIBCRYPT = @LIBCRYPT@
diff --git a/rexec/rexec.c b/rexec/rexec.c
new file mode 100644
index 0000000..9578ee8
--- /dev/null
+++ b/rexec/rexec.c
@@ -0,0 +1,323 @@
+/*
+ Copyright (C) 2009 Free Software Foundation, Inc.
+
+ This file is part of GNU Inetutils.
+
+ GNU Inetutils 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 3 of the License, or
+ (at your option) any later version.
+
+ GNU Inetutils 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, see <http://www.gnu.org/licenses/>.
+*/
+
+/* Written by Giuseppe Scrivano <address@hidden>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#ifdef HAVE_SYS_FILIO_H
+# include <sys/filio.h>
+#endif
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <errno.h>
+#include <netdb.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#include <stdarg.h>
+#include <progname.h>
+#include <argp.h>
+#include <error.h>
+#include "libinetutils.h"
+
+#define MAX3(a, b, c) (MAX (MAX (a, b), c))
+
+const char doc[] = "remote execution client";
+static char args_doc[] = "COMMAND";
+
+const char *program_authors[] =
+ {
+ "Giuseppe Scrivano",
+ NULL
+ };
+
+static struct argp_option options[] = {
+ {"user", 'u', "user", 0, "Specify the user"},
+ {"host", 'h', "host", 0, "Specify the host"},
+ {"password", 'p', "password", 0, "Specify the password"},
+ {"port", 'P', "port", 0, "Specify the port to connect to"},
+ {"noerr", 'n', NULL, 0, "Disable the stderr stream"},
+ {"error", 'e', "error", 0, "Specify a TCP port to use for stderr"},
+ { 0 }
+};
+
+struct arguments
+{
+ const char *host;
+ const char *user;
+ const char *password;
+ const char *command;
+ int port;
+ int use_err;
+ int err_port;
+};
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+ struct arguments *arguments = state->input;
+
+ switch (key)
+ {
+ case 'u':
+ arguments->user = arg;
+ break;
+ case 'p':
+ arguments->password = arg;
+ break;
+ case 'P':
+ arguments->port = atoi (arg);
+ break;
+ case 'e':
+ arguments->err_port = atoi (arg);
+ break;
+ case 'h':
+ arguments->host = arg;
+ break;
+ case 'n':
+ arguments->use_err = 0;
+ break;
+ case ARGP_KEY_ARG:
+ arguments->command = arg;
+ state->next = state->argc;
+ }
+
+ return 0;
+}
+
+static struct argp argp = {options, parse_opt, args_doc, doc};
+
+static void do_rexec (struct arguments *arguments);
+
+int
+main (int argc, char **argv)
+{
+ struct arguments arguments;
+
+ set_program_name (argv[0]);
+
+ iu_argp_init ("rexec", program_authors);
+
+ arguments.user = NULL;
+ arguments.password = NULL;
+ arguments.host = NULL;
+ arguments.command = NULL;
+ arguments.err_port = 0;
+ arguments.use_err = 1;
+ arguments.port = 512;
+
+ argp_parse (&argp, argc, argv, ARGP_IN_ORDER, 0, &arguments);
+
+ if (arguments.user == NULL)
+ error (EXIT_FAILURE, 0, "user not specified");
+
+ if (arguments.password == NULL)
+ error (EXIT_FAILURE, 0, "password not specified");
+
+ if (arguments.host == NULL)
+ error (EXIT_FAILURE, 0, "host not specified");
+
+ if (arguments.command == NULL)
+ error (EXIT_FAILURE, 0, "command not specified");
+
+ do_rexec (&arguments);
+
+ exit (0);
+}
+
+static void
+safe_write (int socket, const char *str, size_t len)
+{
+ if (write (socket, str, len) < 0)
+ error (EXIT_FAILURE, errno, "error sending data");
+}
+
+void
+do_rexec (struct arguments *arguments)
+{
+ int err;
+ char buffer[1024];
+ int sock;
+ char port_str[6];
+ struct sockaddr_in addr;
+ struct hostent *host;
+ int stdin = STDIN_FILENO;
+ int err_sock = -1;
+
+ sock = socket (AF_INET, SOCK_STREAM, 0);
+ if (sock < 0)
+ error (EXIT_FAILURE, errno, "cannot open socket");
+
+ host = gethostbyname (arguments->host);
+ if (host == NULL)
+ error (EXIT_FAILURE, errno, "cannot find host %s", arguments->host);
+
+ memset (&addr, 0, sizeof (addr));
+ addr.sin_family = AF_INET;
+ memmove ((caddr_t) &addr.sin_addr,
+#ifdef HAVE_STRUCT_HOSTENT_H_ADDR_LIST
+ host->h_addr_list[0],
+#else
+ host->h_addr,
+#endif
+ host->h_length);
+
+ addr.sin_port = htons ((short)arguments->port);
+
+ if (connect (sock, &addr, sizeof (addr)) < 0)
+ error (EXIT_FAILURE, errno, "cannot connect to the specified host");
+
+ if (!arguments->use_err)
+ {
+ port_str[0] = '0';
+ port_str[1] = '\0';
+ safe_write (sock, port_str, 2);
+ arguments->err_port = 0;
+ }
+ else
+ {
+ struct sockaddr_in serv_addr;
+ socklen_t len;
+ int serv_sock = socket (AF_INET, SOCK_STREAM, 0);
+
+ if (serv_sock < 0)
+ error (EXIT_FAILURE, errno, "cannot open socket");
+
+ memset (&serv_addr, 0, sizeof (serv_addr));
+
+ serv_addr.sin_port = arguments->err_port;
+ if (bind (serv_sock, &serv_addr, sizeof (serv_addr)) < 0)
+ error (EXIT_FAILURE, errno, "cannot bind socket");
+
+ len = sizeof (serv_addr);
+ if (getsockname (serv_sock, &serv_addr, &len))
+ error (EXIT_FAILURE, errno, "error reading socket port");
+
+ if (listen (serv_sock, 1))
+ error (EXIT_FAILURE, errno, "error listening on socket");
+
+ arguments->err_port = ntohs (serv_addr.sin_port);
+ sprintf (port_str, "%i", arguments->err_port);
+ safe_write (sock, port_str, strlen (port_str) + 1);
+
+ err_sock = accept (serv_sock, &serv_addr, &len);
+ if (err_sock < 0)
+ error (EXIT_FAILURE, errno, "error accepting connection");
+
+ shutdown (err_sock, SHUT_WR);
+
+ close (serv_sock);
+ }
+
+ safe_write (sock, arguments->user, strlen (arguments->user) + 1);
+ safe_write (sock, arguments->password, strlen (arguments->password) + 1);
+ safe_write (sock, arguments->command, strlen (arguments->command) + 1);
+
+ while (1)
+ {
+ int ret;
+ fd_set rsocks;
+
+ /* No other data to read. */
+ if (sock < 0 && err_sock < 0)
+ break;
+
+ FD_ZERO (&rsocks);
+ if (0 <= sock)
+ FD_SET (sock, &rsocks);
+ if (0 <= stdin)
+ FD_SET (stdin, &rsocks);
+ if (0 <= err_sock)
+ FD_SET (err_sock, &rsocks);
+
+ ret = select (MAX3 (sock, stdin, err_sock) + 1, &rsocks, NULL, NULL,
NULL);
+ if (ret == -1)
+ error (EXIT_FAILURE, errno, "error select");
+
+ if (0 <= stdin && FD_ISSET (stdin, &rsocks))
+ {
+ err = read (stdin, buffer, 1024);
+
+ if (err < 0)
+ error (EXIT_FAILURE, errno, "error reading stdin");
+
+ if (!err)
+ {
+ shutdown (sock, SHUT_WR);
+ close (stdin);
+ stdin = -1;
+ continue;
+ }
+
+ if (write (STDOUT_FILENO, buffer, err) < 0)
+ error (EXIT_FAILURE, errno, "error writing");
+ }
+
+ if (0 <= sock && FD_ISSET (sock, &rsocks))
+ {
+ err = read (sock, buffer, 1024);
+
+ if (err < 0)
+ error (EXIT_FAILURE, errno, "error reading out stream");
+
+ if (!err)
+ {
+ close (sock);
+ sock = -1;
+ continue;
+ }
+
+ if (write (STDOUT_FILENO, buffer, err) < 0)
+ error (EXIT_FAILURE, errno, "error writing");
+ }
+
+ if (0 <= err_sock && FD_ISSET (err_sock, &rsocks))
+ {
+ err = read (err_sock, buffer, 1024);
+
+ if (err < 0)
+ error (EXIT_FAILURE, errno, "error reading err stream");
+
+ if (!err)
+ {
+ close (err_sock);
+ err_sock = -1;
+ continue;
+ }
+
+ if (write (STDERR_FILENO, buffer, err) < 0)
+ error (EXIT_FAILURE, errno, "error writing to stderr");
+ }
+ }
+}
hooks/post-receive
--
GNU Inetutils
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] GNU Inetutils branch, master, updated. release_1_5-187-g21e83dd,
Giuseppe Scrivano <=