version 1.110, 2013/12/04 04:20:01 |
version 1.111, 2013/12/05 22:59:45 |
|
|
Buffer msg; |
Buffer msg; |
u_int count, type, id, handle_len, i, expected_id, ents = 0; |
u_int count, type, id, handle_len, i, expected_id, ents = 0; |
char *handle; |
char *handle; |
|
int status = SSH2_FX_FAILURE; |
|
|
|
if (dir) |
|
*dir = NULL; |
|
|
id = conn->msg_id++; |
id = conn->msg_id++; |
|
|
buffer_init(&msg); |
buffer_init(&msg); |
|
|
fatal("ID mismatch (%u != %u)", id, expected_id); |
fatal("ID mismatch (%u != %u)", id, expected_id); |
|
|
if (type == SSH2_FXP_STATUS) { |
if (type == SSH2_FXP_STATUS) { |
int status = buffer_get_int(&msg); |
status = buffer_get_int(&msg); |
|
|
debug3("Received SSH2_FXP_STATUS %d", status); |
debug3("Received SSH2_FXP_STATUS %d", status); |
|
if (status == SSH2_FX_EOF) |
if (status == SSH2_FX_EOF) { |
|
break; |
break; |
} else { |
error("Couldn't read directory: %s", fx2txt(status)); |
error("Couldn't read directory: %s", |
goto out; |
fx2txt(status)); |
|
do_close(conn, handle, handle_len); |
|
free(handle); |
|
buffer_free(&msg); |
|
return(status); |
|
} |
|
} else if (type != SSH2_FXP_NAME) |
} else if (type != SSH2_FXP_NAME) |
fatal("Expected SSH2_FXP_NAME(%u) packet, got %u", |
fatal("Expected SSH2_FXP_NAME(%u) packet, got %u", |
SSH2_FXP_NAME, type); |
SSH2_FXP_NAME, type); |
|
|
if (strchr(filename, '/') != NULL) { |
if (strchr(filename, '/') != NULL) { |
error("Server sent suspect path \"%s\" " |
error("Server sent suspect path \"%s\" " |
"during readdir of \"%s\"", filename, path); |
"during readdir of \"%s\"", filename, path); |
goto next; |
} else if (dir) { |
} |
|
|
|
if (dir) { |
|
*dir = xrealloc(*dir, ents + 2, sizeof(**dir)); |
*dir = xrealloc(*dir, ents + 2, sizeof(**dir)); |
(*dir)[ents] = xcalloc(1, sizeof(***dir)); |
(*dir)[ents] = xcalloc(1, sizeof(***dir)); |
(*dir)[ents]->filename = xstrdup(filename); |
(*dir)[ents]->filename = xstrdup(filename); |
|
|
memcpy(&(*dir)[ents]->a, a, sizeof(*a)); |
memcpy(&(*dir)[ents]->a, a, sizeof(*a)); |
(*dir)[++ents] = NULL; |
(*dir)[++ents] = NULL; |
} |
} |
next: |
|
free(filename); |
free(filename); |
free(longname); |
free(longname); |
} |
} |
} |
} |
|
status = 0; |
|
|
|
out: |
buffer_free(&msg); |
buffer_free(&msg); |
do_close(conn, handle, handle_len); |
do_close(conn, handle, handle_len); |
free(handle); |
free(handle); |
|
|
/* Don't return partial matches on interrupt */ |
if (status != 0 && dir != NULL) { |
if (interrupted && dir != NULL && *dir != NULL) { |
/* Don't return results on error */ |
free_sftp_dirents(*dir); |
free_sftp_dirents(*dir); |
|
*dir = NULL; |
|
} else if (interrupted && dir != NULL && *dir != NULL) { |
|
/* Don't return partial matches on interrupt */ |
|
free_sftp_dirents(*dir); |
*dir = xcalloc(1, sizeof(**dir)); |
*dir = xcalloc(1, sizeof(**dir)); |
**dir = NULL; |
**dir = NULL; |
} |
} |
|
|
return 0; |
return status; |
} |
} |
|
|
int |
int |
|
|
{ |
{ |
int i; |
int i; |
|
|
|
if (s == NULL) |
|
return; |
for (i = 0; s[i]; i++) { |
for (i = 0; s[i]; i++) { |
free(s[i]->filename); |
free(s[i]->filename); |
free(s[i]->longname); |
free(s[i]->longname); |