version 1.47, 2004/06/25 05:38:48 |
version 1.47.4.2, 2006/02/03 02:53:45 |
|
|
#include "getput.h" |
#include "getput.h" |
#include "log.h" |
#include "log.h" |
#include "xmalloc.h" |
#include "xmalloc.h" |
|
#include "misc.h" |
|
|
#include "sftp.h" |
#include "sftp.h" |
#include "sftp-common.h" |
#include "sftp-common.h" |
|
|
static void |
static void |
handle_init(void) |
handle_init(void) |
{ |
{ |
int i; |
u_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; |
handles[i].use = HANDLE_UNUSED; |
|
|
static int |
static int |
handle_new(int use, const char *name, int fd, DIR *dirp) |
handle_new(int use, const char *name, int fd, DIR *dirp) |
{ |
{ |
int i; |
u_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) { |
if (handles[i].use == HANDLE_UNUSED) { |
|
|
static int |
static int |
handle_is_ok(int i, int type) |
handle_is_ok(int i, int type) |
{ |
{ |
return i >= 0 && i < sizeof(handles)/sizeof(Handle) && |
return i >= 0 && (u_int)i < sizeof(handles)/sizeof(Handle) && |
handles[i].use == type; |
handles[i].use == type; |
} |
} |
|
|
|
|
} else { |
} else { |
/* XXX ATOMICIO ? */ |
/* XXX ATOMICIO ? */ |
ret = write(fd, data, len); |
ret = write(fd, data, len); |
if (ret == -1) { |
if (ret < 0) { |
error("process_write: write failed"); |
error("process_write: write failed"); |
status = errno_to_portable(errno); |
status = errno_to_portable(errno); |
} else if (ret == len) { |
} else if ((size_t)ret == len) { |
status = SSH2_FX_OK; |
status = SSH2_FX_OK; |
} else { |
} else { |
logit("nothing at all written"); |
logit("nothing at all written"); |
|
|
return; /* Incomplete message. */ |
return; /* Incomplete message. */ |
cp = buffer_ptr(&iqueue); |
cp = buffer_ptr(&iqueue); |
msg_len = GET_32BIT(cp); |
msg_len = GET_32BIT(cp); |
if (msg_len > 256 * 1024) { |
if (msg_len > SFTP_MAX_MSG_LENGTH) { |
error("bad message "); |
error("bad message "); |
exit(11); |
exit(11); |
} |
} |
|
|
fd_set *rset, *wset; |
fd_set *rset, *wset; |
int in, out, max; |
int in, out, max; |
ssize_t len, olen, set_size; |
ssize_t len, olen, set_size; |
|
|
|
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
|
sanitise_stdfd(); |
|
|
/* XXX should use getopt */ |
/* XXX should use getopt */ |
|
|