=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/sftp-server.c,v retrieving revision 1.6.2.4 retrieving revision 1.6.2.5 diff -u -r1.6.2.4 -r1.6.2.5 --- src/usr.bin/ssh/sftp-server.c 2001/05/07 21:09:34 1.6.2.4 +++ src/usr.bin/ssh/sftp-server.c 2001/09/27 00:15:42 1.6.2.5 @@ -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.6.2.4 2001/05/07 21:09:34 jason Exp $"); +RCSID("$OpenBSD: sftp-server.c,v 1.6.2.5 2001/09/27 00:15:42 miod Exp $"); #include "buffer.h" #include "bufaux.h" @@ -56,7 +56,7 @@ Attrib attrib; }; -int +static int errno_to_portable(int unixerrno) { int ret = 0; @@ -87,7 +87,7 @@ return ret; } -int +static int flags_from_portable(int pflags) { int flags = 0; @@ -109,7 +109,7 @@ return flags; } -Attrib * +static Attrib * get_attrib(void) { return decode_attrib(&iqueue); @@ -133,7 +133,7 @@ Handle handles[100]; -void +static void handle_init(void) { int i; @@ -142,7 +142,7 @@ handles[i].use = HANDLE_UNUSED; } -int +static int handle_new(int use, char *name, int fd, DIR *dirp) { int i; @@ -159,14 +159,14 @@ 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) @@ -177,7 +177,7 @@ return 0; } -int +static int handle_from_string(char *handle, u_int hlen) { int val; @@ -191,7 +191,7 @@ return -1; } -char * +static char * handle_to_name(int handle) { if (handle_is_ok(handle, HANDLE_DIR)|| @@ -200,7 +200,7 @@ return NULL; } -DIR * +static DIR * handle_to_dir(int handle) { if (handle_is_ok(handle, HANDLE_DIR)) @@ -208,7 +208,7 @@ return NULL; } -int +static int handle_to_fd(int handle) { if (handle_is_ok(handle, HANDLE_FILE)) @@ -216,7 +216,7 @@ return -1; } -int +static int handle_close(int handle) { int ret = -1; @@ -233,7 +233,7 @@ return ret; } -int +static int get_handle(void) { char *handle; @@ -249,7 +249,7 @@ /* send replies */ -void +static void send_msg(Buffer *m) { int mlen = buffer_len(m); @@ -259,7 +259,7 @@ buffer_consume(m, mlen); } -void +static void send_status(u_int32_t id, u_int32_t error) { Buffer msg; @@ -289,7 +289,7 @@ 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; @@ -302,14 +302,14 @@ 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; @@ -321,7 +321,7 @@ xfree(string); } -void +static void send_names(u_int32_t id, int count, Stat *stats) { Buffer msg; @@ -341,7 +341,7 @@ buffer_free(&msg); } -void +static void send_attrib(u_int32_t id, Attrib *a) { Buffer msg; @@ -357,7 +357,7 @@ /* parse incoming */ -void +static void process_init(void) { Buffer msg; @@ -371,7 +371,7 @@ buffer_free(&msg); } -void +static void process_open(void) { u_int32_t id, pflags; @@ -403,7 +403,7 @@ xfree(name); } -void +static void process_close(void) { u_int32_t id; @@ -417,7 +417,7 @@ send_status(id, status); } -void +static void process_read(void) { char buf[64*1024]; @@ -457,7 +457,7 @@ send_status(id, status); } -void +static void process_write(void) { u_int32_t id; @@ -495,7 +495,7 @@ xfree(data); } -void +static void process_do_stat(int do_lstat) { Attrib a; @@ -520,19 +520,19 @@ 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; @@ -558,7 +558,7 @@ send_status(id, status); } -struct timeval * +static struct timeval * attrib_to_tv(Attrib *a) { static struct timeval tv[2]; @@ -570,7 +570,7 @@ return tv; } -void +static void process_setstat(void) { Attrib *a; @@ -602,7 +602,7 @@ xfree(name); } -void +static void process_fsetstat(void) { Attrib *a; @@ -637,7 +637,7 @@ send_status(id, status); } -void +static void process_opendir(void) { DIR *dirp = NULL; @@ -669,10 +669,10 @@ /* * 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); @@ -700,12 +700,15 @@ } 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, (unsigned long long)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, + (unsigned long long)st->st_size, tbuf, name); return xstrdup(buf); } -void +static void process_readdir(void) { DIR *dirp; @@ -733,8 +736,8 @@ 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)); @@ -759,7 +762,7 @@ } } -void +static void process_remove(void) { char *name; @@ -776,7 +779,7 @@ xfree(name); } -void +static void process_mkdir(void) { Attrib *a; @@ -796,7 +799,7 @@ xfree(name); } -void +static void process_rmdir(void) { u_int32_t id; @@ -812,7 +815,7 @@ xfree(name); } -void +static void process_realpath(void) { char resolvedname[MAXPATHLEN]; @@ -837,7 +840,7 @@ xfree(path); } -void +static void process_rename(void) { u_int32_t id; @@ -859,22 +862,23 @@ 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); @@ -882,7 +886,7 @@ xfree(path); } -void +static void process_symlink(void) { u_int32_t id; @@ -904,7 +908,7 @@ xfree(newpath); } -void +static void process_extended(void) { u_int32_t id; @@ -918,7 +922,7 @@ /* stolen from ssh-agent */ -void +static void process(void) { u_int msg_len;