]> andersk Git - openssh.git/blobdiff - sftp-server.c
- markus@cvs.openbsd.org 2002/01/25 22:07:40
[openssh.git] / sftp-server.c
index 75c19c8a63e1892cd6a4acaf59b0b062c5cb066f..6d6658614d9c1f29aa315658ade7e656f2159a30 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000 Markus Friedl.  All rights reserved.
+ * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include "includes.h"
-RCSID("$OpenBSD: sftp-server.c,v 1.25 2001/04/05 10:42:53 markus Exp $");
+RCSID("$OpenBSD: sftp-server.c,v 1.32 2001/12/29 21:56:01 stevesk Exp $");
 
 #include "buffer.h"
 #include "bufaux.h"
@@ -62,7 +62,7 @@ struct Stat {
        Attrib attrib;
 };
 
-int
+static int
 errno_to_portable(int unixerrno)
 {
        int ret = 0;
@@ -93,7 +93,7 @@ errno_to_portable(int unixerrno)
        return ret;
 }
 
-int
+static int
 flags_from_portable(int pflags)
 {
        int flags = 0;
@@ -115,7 +115,7 @@ flags_from_portable(int pflags)
        return flags;
 }
 
-Attrib *
+static Attrib *
 get_attrib(void)
 {
        return decode_attrib(&iqueue);
@@ -139,21 +139,21 @@ enum {
 
 Handle handles[100];
 
-void
+static void
 handle_init(void)
 {
        int i;
 
-       for(i = 0; i < sizeof(handles)/sizeof(Handle); i++)
+       for (i = 0; i < sizeof(handles)/sizeof(Handle); i++)
                handles[i].use = HANDLE_UNUSED;
 }
 
-int
+static int
 handle_new(int use, char *name, int fd, DIR *dirp)
 {
        int i;
 
-       for(i = 0; i < sizeof(handles)/sizeof(Handle); i++) {
+       for (i = 0; i < sizeof(handles)/sizeof(Handle); i++) {
                if (handles[i].use == HANDLE_UNUSED) {
                        handles[i].use = use;
                        handles[i].dirp = dirp;
@@ -165,14 +165,14 @@ handle_new(int use, char *name, int fd, DIR *dirp)
        return -1;
 }
 
-int
+static int
 handle_is_ok(int i, int type)
 {
        return i >= 0 && i < sizeof(handles)/sizeof(Handle) &&
            handles[i].use == type;
 }
 
-int
+static int
 handle_to_string(int handle, char **stringp, int *hlenp)
 {
        if (stringp == NULL || hlenp == NULL)
@@ -183,7 +183,7 @@ handle_to_string(int handle, char **stringp, int *hlenp)
        return 0;
 }
 
-int
+static int
 handle_from_string(char *handle, u_int hlen)
 {
        int val;
@@ -197,7 +197,7 @@ handle_from_string(char *handle, u_int hlen)
        return -1;
 }
 
-char *
+static char *
 handle_to_name(int handle)
 {
        if (handle_is_ok(handle, HANDLE_DIR)||
@@ -206,7 +206,7 @@ handle_to_name(int handle)
        return NULL;
 }
 
-DIR *
+static DIR *
 handle_to_dir(int handle)
 {
        if (handle_is_ok(handle, HANDLE_DIR))
@@ -214,7 +214,7 @@ handle_to_dir(int handle)
        return NULL;
 }
 
-int
+static int
 handle_to_fd(int handle)
 {
        if (handle_is_ok(handle, HANDLE_FILE))
@@ -222,7 +222,7 @@ handle_to_fd(int handle)
        return -1;
 }
 
-int
+static int
 handle_close(int handle)
 {
        int ret = -1;
@@ -239,7 +239,7 @@ handle_close(int handle)
        return ret;
 }
 
-int
+static int
 get_handle(void)
 {
        char *handle;
@@ -255,7 +255,7 @@ get_handle(void)
 
 /* send replies */
 
-void
+static void
 send_msg(Buffer *m)
 {
        int mlen = buffer_len(m);
@@ -265,7 +265,7 @@ send_msg(Buffer *m)
        buffer_consume(m, mlen);
 }
 
-void
+static void
 send_status(u_int32_t id, u_int32_t error)
 {
        Buffer msg;
@@ -295,7 +295,7 @@ send_status(u_int32_t id, u_int32_t error)
        send_msg(&msg);
        buffer_free(&msg);
 }
-void
+static void
 send_data_or_handle(char type, u_int32_t id, char *data, int dlen)
 {
        Buffer msg;
@@ -308,14 +308,14 @@ send_data_or_handle(char type, u_int32_t id, char *data, int dlen)
        buffer_free(&msg);
 }
 
-void
+static void
 send_data(u_int32_t id, char *data, int dlen)
 {
        TRACE("sent data id %d len %d", id, dlen);
        send_data_or_handle(SSH2_FXP_DATA, id, data, dlen);
 }
 
-void
+static void
 send_handle(u_int32_t id, int handle)
 {
        char *string;
@@ -327,7 +327,7 @@ send_handle(u_int32_t id, int handle)
        xfree(string);
 }
 
-void
+static void
 send_names(u_int32_t id, int count, Stat *stats)
 {
        Buffer msg;
@@ -347,7 +347,7 @@ send_names(u_int32_t id, int count, Stat *stats)
        buffer_free(&msg);
 }
 
-void
+static void
 send_attrib(u_int32_t id, Attrib *a)
 {
        Buffer msg;
@@ -363,7 +363,7 @@ send_attrib(u_int32_t id, Attrib *a)
 
 /* parse incoming */
 
-void
+static void
 process_init(void)
 {
        Buffer msg;
@@ -377,7 +377,7 @@ process_init(void)
        buffer_free(&msg);
 }
 
-void
+static void
 process_open(void)
 {
        u_int32_t id, pflags;
@@ -409,7 +409,7 @@ process_open(void)
        xfree(name);
 }
 
-void
+static void
 process_close(void)
 {
        u_int32_t id;
@@ -423,7 +423,7 @@ process_close(void)
        send_status(id, status);
 }
 
-void
+static void
 process_read(void)
 {
        char buf[64*1024];
@@ -463,7 +463,7 @@ process_read(void)
                send_status(id, status);
 }
 
-void
+static void
 process_write(void)
 {
        u_int32_t id;
@@ -501,7 +501,7 @@ process_write(void)
        xfree(data);
 }
 
-void
+static void
 process_do_stat(int do_lstat)
 {
        Attrib a;
@@ -526,19 +526,19 @@ process_do_stat(int do_lstat)
        xfree(name);
 }
 
-void
+static void
 process_stat(void)
 {
        process_do_stat(0);
 }
 
-void
+static void
 process_lstat(void)
 {
        process_do_stat(1);
 }
 
-void
+static void
 process_fstat(void)
 {
        Attrib a;
@@ -564,7 +564,7 @@ process_fstat(void)
                send_status(id, status);
 }
 
-struct timeval *
+static struct timeval *
 attrib_to_tv(Attrib *a)
 {
        static struct timeval tv[2];
@@ -576,7 +576,7 @@ attrib_to_tv(Attrib *a)
        return tv;
 }
 
-void
+static void
 process_setstat(void)
 {
        Attrib *a;
@@ -608,7 +608,7 @@ process_setstat(void)
        xfree(name);
 }
 
-void
+static void
 process_fsetstat(void)
 {
        Attrib *a;
@@ -657,7 +657,7 @@ process_fsetstat(void)
        send_status(id, status);
 }
 
-void
+static void
 process_opendir(void)
 {
        DIR *dirp = NULL;
@@ -689,10 +689,10 @@ process_opendir(void)
 /*
  * drwxr-xr-x    5 markus   markus       1024 Jan 13 18:39 .ssh
  */
-char *
+static char *
 ls_file(char *name, struct stat *st)
 {
-       int sz = 0;
+       int ulen, glen, sz = 0;
        struct passwd *pw;
        struct group *gr;
        struct tm *ltime = localtime(&st->st_mtime);
@@ -720,12 +720,15 @@ ls_file(char *name, struct stat *st)
        }
        if (sz == 0)
                tbuf[0] = '\0';
-       snprintf(buf, sizeof buf, "%s %3d %-8.8s %-8.8s %8llu %s %s", mode,
-           st->st_nlink, user, group, (u_int64_t)st->st_size, tbuf, name);
+       ulen = MAX(strlen(user), 8);
+       glen = MAX(strlen(group), 8);
+       snprintf(buf, sizeof buf, "%s %3d %-*s %-*s %8llu %s %s", mode,
+           st->st_nlink, ulen, user, glen, group,
+           (u_int64_t)st->st_size, tbuf, name);
        return xstrdup(buf);
 }
 
-void
+static void
 process_readdir(void)
 {
        DIR *dirp;
@@ -753,8 +756,8 @@ process_readdir(void)
                                stats = xrealloc(stats, nstats * sizeof(Stat));
                        }
 /* XXX OVERFLOW ? */
-                       snprintf(pathname, sizeof pathname,
-                           "%s/%s", path, dp->d_name);
+                       snprintf(pathname, sizeof pathname, "%s%s%s", path,
+                           strcmp(path, "/") ? "/" : "", dp->d_name);
                        if (lstat(pathname, &st) < 0)
                                continue;
                        stat_to_attrib(&st, &(stats[count].attrib));
@@ -768,7 +771,7 @@ process_readdir(void)
                }
                if (count > 0) {
                        send_names(id, count, stats);
-                       for(i = 0; i < count; i++) {
+                       for (i = 0; i < count; i++) {
                                xfree(stats[i].name);
                                xfree(stats[i].long_name);
                        }
@@ -779,7 +782,7 @@ process_readdir(void)
        }
 }
 
-void
+static void
 process_remove(void)
 {
        char *name;
@@ -796,7 +799,7 @@ process_remove(void)
        xfree(name);
 }
 
-void
+static void
 process_mkdir(void)
 {
        Attrib *a;
@@ -816,7 +819,7 @@ process_mkdir(void)
        xfree(name);
 }
 
-void
+static void
 process_rmdir(void)
 {
        u_int32_t id;
@@ -832,7 +835,7 @@ process_rmdir(void)
        xfree(name);
 }
 
-void
+static void
 process_realpath(void)
 {
        char resolvedname[MAXPATHLEN];
@@ -857,7 +860,7 @@ process_realpath(void)
        xfree(path);
 }
 
-void
+static void
 process_rename(void)
 {
        u_int32_t id;
@@ -879,22 +882,23 @@ process_rename(void)
        xfree(newpath);
 }
 
-void
+static void
 process_readlink(void)
 {
        u_int32_t id;
+       int len;
        char link[MAXPATHLEN];
        char *path;
 
        id = get_int();
        path = get_string(NULL);
        TRACE("readlink id %d path %s", id, path);
-       if (readlink(path, link, sizeof(link) - 1) == -1)
+       if ((len = readlink(path, link, sizeof(link) - 1)) == -1)
                send_status(id, errno_to_portable(errno));
        else {
                Stat s;
-               
-               link[sizeof(link) - 1] = '\0';
+
+               link[len] = '\0';
                attrib_clear(&s.attrib);
                s.name = s.long_name = link;
                send_names(id, 1, &s);
@@ -902,7 +906,7 @@ process_readlink(void)
        xfree(path);
 }
 
-void
+static void
 process_symlink(void)
 {
        u_int32_t id;
@@ -924,7 +928,7 @@ process_symlink(void)
        xfree(newpath);
 }
 
-void
+static void
 process_extended(void)
 {
        u_int32_t id;
@@ -938,7 +942,7 @@ process_extended(void)
 
 /* stolen from ssh-agent */
 
-void
+static void
 process(void)
 {
        u_int msg_len;
@@ -947,7 +951,7 @@ process(void)
 
        if (buffer_len(&iqueue) < 5)
                return;         /* Incomplete message. */
-       cp = (u_char *) buffer_ptr(&iqueue);
+       cp = buffer_ptr(&iqueue);
        msg_len = GET_32BIT(cp);
        if (msg_len > 256 * 1024) {
                error("bad message ");
This page took 0.200418 seconds and 4 git commands to generate.