Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-1-5]: src/crypto/dist/ssh Pull up revisions 1.1-1.5 (requested by...



details:   https://anonhg.NetBSD.org/src/rev/feca9d534eac
branches:  netbsd-1-5
changeset: 490714:feca9d534eac
user:      he <he%NetBSD.org@localhost>
date:      Mon Feb 26 20:27:32 2001 +0000

description:
Pull up revisions 1.1-1.5 (requested by itojun):
  Update SSH to version found on trunk as of 26 Feb 2001.

diffstat:

 crypto/dist/ssh/sftp-int.c |  634 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 634 insertions(+), 0 deletions(-)

diffs (truncated from 638 to 300 lines):

diff -r fcc226bf8226 -r feca9d534eac crypto/dist/ssh/sftp-int.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/dist/ssh/sftp-int.c        Mon Feb 26 20:27:32 2001 +0000
@@ -0,0 +1,634 @@
+/*
+ * Copyright (c) 2001 Damien Miller.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* XXX: finish implementation of all commands */
+/* XXX: do fnmatch() instead of using raw pathname */
+/* XXX: globbed ls */
+/* XXX: recursive operations */
+
+#include "includes.h"
+RCSID("$OpenBSD: sftp-int.c,v 1.22 2001/02/14 09:46:03 djm Exp $");
+
+#include "buffer.h"
+#include "xmalloc.h"
+#include "log.h"
+#include "pathnames.h"
+
+#include "sftp.h"
+#include "sftp-common.h"
+#include "sftp-client.h"
+#include "sftp-int.h"
+
+/* Seperators for interactive commands */
+#define WHITESPACE " \t\r\n"
+
+/* Commands for interactive mode */
+#define I_CHDIR                1
+#define I_CHGRP                2
+#define I_CHMOD                3
+#define I_CHOWN                4
+#define I_GET          5
+#define I_HELP         6
+#define I_LCHDIR       7
+#define I_LLS          8
+#define I_LMKDIR       9
+#define I_LPWD         10
+#define I_LS           11
+#define I_LUMASK       12
+#define I_MKDIR                13
+#define I_PUT          14
+#define I_PWD          15
+#define I_QUIT         16
+#define I_RENAME       17
+#define I_RM           18
+#define I_RMDIR                19
+#define I_SHELL                20
+
+struct CMD {
+       const char *c;
+       const int n;
+};
+
+const struct CMD cmds[] = {
+       { "cd",         I_CHDIR },
+       { "chdir",      I_CHDIR },
+       { "chgrp",      I_CHGRP },
+       { "chmod",      I_CHMOD },
+       { "chown",      I_CHOWN },
+       { "dir",        I_LS },
+       { "exit",       I_QUIT },
+       { "get",        I_GET },
+       { "help",       I_HELP },
+       { "lcd",        I_LCHDIR },
+       { "lchdir",     I_LCHDIR },
+       { "lls",        I_LLS },
+       { "lmkdir",     I_LMKDIR },
+       { "lpwd",       I_LPWD },
+       { "ls",         I_LS },
+       { "lumask",     I_LUMASK },
+       { "mkdir",      I_MKDIR },
+       { "put",        I_PUT },
+       { "pwd",        I_PWD },
+       { "quit",       I_QUIT },
+       { "rename",     I_RENAME },
+       { "rm",         I_RM },
+       { "rmdir",      I_RMDIR },
+       { "!",          I_SHELL },
+       { "?",          I_HELP },
+       { NULL,                 -1}
+};
+
+static void
+help(void)
+{
+       printf("Available commands:\n");
+       printf("cd path                       Change remote directory to 'path'\n");
+       printf("lcd path                      Change local directory to 'path'\n");
+       printf("chgrp grp path                Change group of file 'path' to 'grp'\n");
+       printf("chmod mode path               Change permissions of file 'path' to 'mode'\n");
+       printf("chown own path                Change owner of file 'path' to 'own'\n");
+       printf("help                          Display this help text\n");
+       printf("get remote-path [local-path]  Download file\n");
+       printf("lls [ls-options [path]]       Display local directory listing\n");
+       printf("lmkdir path                   Create local directory\n");
+       printf("lpwd                          Print local working directory\n");
+       printf("ls [path]                     Display remote directory listing\n");
+       printf("lumask umask                  Set local umask to 'umask'\n");
+       printf("mkdir path                    Create remote directory\n");
+       printf("put local-path [remote-path]  Upload file\n");
+       printf("pwd                           Display remote working directory\n");
+       printf("exit                          Quit sftp\n");
+       printf("quit                          Quit sftp\n");
+       printf("rename oldpath newpath        Rename remote file\n");
+       printf("rmdir path                    Remove remote directory\n");
+       printf("rm path                       Delete remote file\n");
+       printf("!command                      Execute 'command' in local shell\n");
+       printf("!                             Escape to local shell\n");
+       printf("?                             Synonym for help\n");
+}
+
+static void
+local_do_shell(const char *args)
+{
+       int ret, status;
+       char *shell;
+       pid_t pid;
+
+       if (!*args)
+               args = NULL;
+
+       if ((shell = getenv("SHELL")) == NULL)
+               shell = _PATH_BSHELL;
+
+       if ((pid = fork()) == -1)
+               fatal("Couldn't fork: %s", strerror(errno));
+
+       if (pid == 0) {
+               /* XXX: child has pipe fds to ssh subproc open - issue? */
+               if (args) {
+                       debug3("Executing %s -c \"%s\"", shell, args);
+                       ret = execl(shell, shell, "-c", args, NULL);
+               } else {
+                       debug3("Executing %s", shell);
+                       ret = execl(shell, shell, NULL);
+               }
+               fprintf(stderr, "Couldn't execute \"%s\": %s\n", shell,
+                   strerror(errno));
+               _exit(1);
+       }
+       if (waitpid(pid, &status, 0) == -1)
+               fatal("Couldn't wait for child: %s", strerror(errno));
+       if (!WIFEXITED(status))
+               error("Shell exited abormally");
+       else if (WEXITSTATUS(status))
+               error("Shell exited with status %d", WEXITSTATUS(status));
+}
+
+static void
+local_do_ls(const char *args)
+{
+       if (!args || !*args)
+               local_do_shell(_PATH_LS);
+       else {
+               int len = strlen(_PATH_LS " ") + strlen(args) + 1;
+               char *buf = xmalloc(len);
+
+               /* XXX: quoting - rip quoting code from ftp? */
+               snprintf(buf, len, _PATH_LS " %s", args);
+               local_do_shell(buf);
+               xfree(buf);
+       }
+}
+
+static char *
+make_absolute(char *p, char *pwd)
+{
+       char buf[2048];
+
+       /* Derelativise */
+       if (p && p[0] != '/') {
+               snprintf(buf, sizeof(buf), "%s/%s", pwd, p);
+               xfree(p);
+               p = xstrdup(buf);
+       }
+
+       return(p);
+}
+
+static int
+parse_getput_flags(const char **cpp, int *pflag)
+{
+       const char *cp = *cpp;
+
+       /* Check for flags */
+       if (cp[0] == '-' && cp[1] && strchr(WHITESPACE, cp[2])) {
+               switch (cp[1]) {
+               case 'p':
+               case 'P':
+                       *pflag = 1;
+                       break;
+               default:
+                       error("Invalid flag -%c", cp[1]);
+                       return(-1);
+               }
+               cp += 2;
+               *cpp = cp + strspn(cp, WHITESPACE);
+       }
+
+       return(0);
+}
+
+static int
+get_pathname(const char **cpp, char **path)
+{
+       const char *cp = *cpp, *end;
+       char quot;
+       int i;
+
+       cp += strspn(cp, WHITESPACE);
+       if (!*cp) {
+               *cpp = cp;
+               *path = NULL;
+               return (0);
+       }
+
+       /* Check for quoted filenames */
+       if (*cp == '\"' || *cp == '\'') {
+               quot = *cp++;
+               
+               end = strchr(cp, quot);
+               if (end == NULL) {
+                       error("Unterminated quote");
+                       goto fail;
+               }
+               if (cp == end) {
+                       error("Empty quotes");
+                       goto fail;
+               }
+               *cpp = end + 1 + strspn(end + 1, WHITESPACE);
+       } else {
+               /* Read to end of filename */
+               end = strpbrk(cp, WHITESPACE);
+               if (end == NULL)
+                       end = strchr(cp, '\0');
+               *cpp = end + strspn(end, WHITESPACE);
+       }
+
+       i = end - cp;
+
+       *path = xmalloc(i + 1);
+       memcpy(*path, cp, i);
+       (*path)[i] = '\0';
+       return(0);
+
+ fail:
+       *path = NULL;
+       return (-1);
+}
+
+static int
+infer_path(const char *p, char **ifp)
+{
+       char *cp;
+
+       debug("XXX: P = \"%s\"", p);
+
+       cp = strrchr(p, '/');
+       if (cp == NULL) {
+               *ifp = xstrdup(p);
+               return(0);
+       }
+
+       if (!cp[1]) {
+               error("Invalid path");
+               return(-1);
+       }
+
+       *ifp = xstrdup(cp + 1);
+       return(0);
+}
+
+static int
+parse_args(const char **cpp, int *pflag, unsigned long *n_arg,
+    char **path1, char **path2)
+{
+       const char *cmd, *cp = *cpp;



Home | Main Index | Thread Index | Old Index