=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/sftp-server.c,v retrieving revision 1.25.2.2 retrieving revision 1.26 diff -u -r1.25.2.2 -r1.26 --- src/usr.bin/ssh/sftp-server.c 2002/03/09 00:20:45 1.25.2.2 +++ src/usr.bin/ssh/sftp-server.c 2001/05/12 19:53:13 1.26 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. + * Copyright (c) 2000 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.2.2 2002/03/09 00:20:45 miod Exp $"); +RCSID("$OpenBSD: sftp-server.c,v 1.26 2001/05/12 19:53:13 markus Exp $"); #include "buffer.h" #include "bufaux.h" @@ -56,7 +56,7 @@ Attrib attrib; }; -static int +int errno_to_portable(int unixerrno) { int ret = 0; @@ -87,7 +87,7 @@ return ret; } -static int +int flags_from_portable(int pflags) { int flags = 0; @@ -109,7 +109,7 @@ return flags; } -static Attrib * +Attrib * get_attrib(void) { return decode_attrib(&iqueue); @@ -133,21 +133,21 @@ Handle handles[100]; -static void +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; } -static int +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; @@ -159,14 +159,14 @@ return -1; } -static int +int handle_is_ok(int i, int type) { return i >= 0 && i < sizeof(handles)/sizeof(Handle) && handles[i].use == type; } -static int +int handle_to_string(int handle, char **stringp, int *hlenp) { if (stringp == NULL || hlenp == NULL) @@ -177,7 +177,7 @@ return 0; } -static int +int handle_from_string(char *handle, u_int hlen) { int val; @@ -191,7 +191,7 @@ return -1; } -static char * +char * handle_to_name(int handle) { if (handle_is_ok(handle, HANDLE_DIR)|| @@ -200,7 +200,7 @@ return NULL; } -static DIR * +DIR * handle_to_dir(int handle) { if (handle_is_ok(handle, HANDLE_DIR)) @@ -208,7 +208,7 @@ return NULL; } -static int +int handle_to_fd(int handle) { if (handle_is_ok(handle, HANDLE_FILE)) @@ -216,7 +216,7 @@ return -1; } -static int +int handle_close(int handle) { int ret = -1; @@ -233,7 +233,7 @@ return ret; } -static int +int get_handle(void) { char *handle; @@ -249,7 +249,7 @@ /* send replies */ -static void +void send_msg(Buffer *m) { int mlen = buffer_len(m); @@ -259,7 +259,7 @@ buffer_consume(m, mlen); } -static void +void send_status(u_int32_t id, u_int32_t error) { Buffer msg; @@ -289,7 +289,7 @@ send_msg(&msg); buffer_free(&msg); } -static void +void send_data_or_handle(char type, u_int32_t id, char *data, int dlen) { Buffer msg; @@ -302,14 +302,14 @@ buffer_free(&msg); } -static void +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); } -static void +void send_handle(u_int32_t id, int handle) { char *string; @@ -321,7 +321,7 @@ xfree(string); } -static void +void send_names(u_int32_t id, int count, Stat *stats) { Buffer msg; @@ -341,7 +341,7 @@ buffer_free(&msg); } -static void +void send_attrib(u_int32_t id, Attrib *a) { Buffer msg; @@ -357,7 +357,7 @@ /* parse incoming */ -static void +void process_init(void) { Buffer msg; @@ -371,7 +371,7 @@ buffer_free(&msg); } -static void +void process_open(void) { u_int32_t id, pflags; @@ -403,7 +403,7 @@ xfree(name); } -static void +void process_close(void) { u_int32_t id; @@ -417,7 +417,7 @@ send_status(id, status); } -static void +void process_read(void) { char buf[64*1024]; @@ -457,7 +457,7 @@ send_status(id, status); } -static void +void process_write(void) { u_int32_t id; @@ -495,7 +495,7 @@ xfree(data); } -static void +void process_do_stat(int do_lstat) { Attrib a; @@ -520,19 +520,19 @@ xfree(name); } -static void +void process_stat(void) { process_do_stat(0); } -static void +void process_lstat(void) { process_do_stat(1); } -static void +void process_fstat(void) { Attrib a; @@ -558,7 +558,7 @@ send_status(id, status); } -static struct timeval * +struct timeval * attrib_to_tv(Attrib *a) { static struct timeval tv[2]; @@ -570,7 +570,7 @@ return tv; } -static void +void process_setstat(void) { Attrib *a; @@ -583,11 +583,6 @@ name = get_string(NULL); a = get_attrib(); TRACE("setstat id %d name %s", id, name); - if (a->flags & SSH2_FILEXFER_ATTR_SIZE) { - ret = truncate(name, a->size); - if (ret == -1) - status = errno_to_portable(errno); - } if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) { ret = chmod(name, a->perm & 0777); if (ret == -1) @@ -607,7 +602,7 @@ xfree(name); } -static void +void process_fsetstat(void) { Attrib *a; @@ -623,11 +618,6 @@ if (fd < 0) { status = SSH2_FX_FAILURE; } else { - if (a->flags & SSH2_FILEXFER_ATTR_SIZE) { - ret = ftruncate(fd, a->size); - if (ret == -1) - status = errno_to_portable(errno); - } if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) { ret = fchmod(fd, a->perm & 0777); if (ret == -1) @@ -647,7 +637,7 @@ send_status(id, status); } -static void +void process_opendir(void) { DIR *dirp = NULL; @@ -679,10 +669,10 @@ /* * drwxr-xr-x 5 markus markus 1024 Jan 13 18:39 .ssh */ -static char * +char * ls_file(char *name, struct stat *st) { - int ulen, glen, sz = 0; + int sz = 0; struct passwd *pw; struct group *gr; struct tm *ltime = localtime(&st->st_mtime); @@ -710,15 +700,12 @@ } if (sz == 0) tbuf[0] = '\0'; - 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); + 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); return xstrdup(buf); } -static void +void process_readdir(void) { DIR *dirp; @@ -746,8 +733,8 @@ stats = xrealloc(stats, nstats * sizeof(Stat)); } /* XXX OVERFLOW ? */ - snprintf(pathname, sizeof pathname, "%s%s%s", path, - strcmp(path, "/") ? "/" : "", dp->d_name); + snprintf(pathname, sizeof pathname, + "%s/%s", path, dp->d_name); if (lstat(pathname, &st) < 0) continue; stat_to_attrib(&st, &(stats[count].attrib)); @@ -761,7 +748,7 @@ } 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); } @@ -772,7 +759,7 @@ } } -static void +void process_remove(void) { char *name; @@ -789,7 +776,7 @@ xfree(name); } -static void +void process_mkdir(void) { Attrib *a; @@ -809,7 +796,7 @@ xfree(name); } -static void +void process_rmdir(void) { u_int32_t id; @@ -825,7 +812,7 @@ xfree(name); } -static void +void process_realpath(void) { char resolvedname[MAXPATHLEN]; @@ -850,7 +837,7 @@ xfree(path); } -static void +void process_rename(void) { u_int32_t id; @@ -872,7 +859,7 @@ xfree(newpath); } -static void +void process_readlink(void) { u_int32_t id; @@ -887,7 +874,7 @@ send_status(id, errno_to_portable(errno)); else { Stat s; - + link[len] = '\0'; attrib_clear(&s.attrib); s.name = s.long_name = link; @@ -896,7 +883,7 @@ xfree(path); } -static void +void process_symlink(void) { u_int32_t id; @@ -918,7 +905,7 @@ xfree(newpath); } -static void +void process_extended(void) { u_int32_t id; @@ -932,7 +919,7 @@ /* stolen from ssh-agent */ -static void +void process(void) { u_int msg_len; @@ -941,7 +928,7 @@ if (buffer_len(&iqueue) < 5) return; /* Incomplete message. */ - cp = buffer_ptr(&iqueue); + cp = (u_char *) buffer_ptr(&iqueue); msg_len = GET_32BIT(cp); if (msg_len > 256 * 1024) { error("bad message ");