1
1

Improve sftp_reply_data and fix sftp_reply_status.

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@627 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Andreas Schneider 2009-04-27 11:54:47 +00:00
родитель 52d20beb73
Коммит bf312c50a9
2 изменённых файлов: 48 добавлений и 22 удалений

Просмотреть файл

@ -653,11 +653,11 @@ int sftp_reply_handle(SFTP_CLIENT_MESSAGE *msg, STRING *handle);
STRING *sftp_handle_alloc(SFTP_SESSION *sftp, void *info);
int sftp_reply_attr(SFTP_CLIENT_MESSAGE *msg, SFTP_ATTRIBUTES *attr);
void *sftp_handle(SFTP_SESSION *sftp, STRING *handle);
int sftp_reply_status(SFTP_CLIENT_MESSAGE *msg, u32 status, char *message);
int sftp_reply_status(SFTP_CLIENT_MESSAGE *msg, u32 status, const char *message);
int sftp_reply_names_add(SFTP_CLIENT_MESSAGE *msg, const char *file,
const char *longname, SFTP_ATTRIBUTES *attr);
int sftp_reply_names(SFTP_CLIENT_MESSAGE *msg);
int sftp_reply_data(SFTP_CLIENT_MESSAGE *msg, void *data, int len);
int sftp_reply_data(SFTP_CLIENT_MESSAGE *msg, const void *data, int len);
void sftp_handle_remove(SFTP_SESSION *sftp, void *handle);
/* SFTP commands and constants */

Просмотреть файл

@ -360,30 +360,56 @@ int sftp_reply_names(SFTP_CLIENT_MESSAGE *msg) {
return 0;
}
int sftp_reply_status(SFTP_CLIENT_MESSAGE *msg, u32 status, char *message){
BUFFER *out=buffer_new();
int r;
STRING *s;
buffer_add_u32(out,msg->id);
buffer_add_u32(out,htonl(status));
s=string_from_char(message?message:"");
buffer_add_ssh_string(out,s);
free(s);
buffer_add_u32(out,0); // language string
r=sftp_packet_write(msg->sftp,SSH_FXP_STATUS,out);
int sftp_reply_status(SFTP_CLIENT_MESSAGE *msg, u32 status,
const char *message) {
BUFFER *out;
STRING *s;
out = buffer_new();
if (out == NULL) {
return -1;
}
s = string_from_char(message ? message : "");
if (s == NULL) {
buffer_free(out);
return r<0;
return -1;
}
if (buffer_add_u32(out, msg->id) < 0 ||
buffer_add_u32(out, htonl(status)) < 0 ||
buffer_add_ssh_string(out, s) < 0 ||
buffer_add_u32(out, 0) < 0 || /* language string */
sftp_packet_write(msg->sftp, SSH_FXP_STATUS, out) < 0) {
buffer_free(out);
string_free(s);
return -1;
}
buffer_free(out);
string_free(s);
return 0;
}
int sftp_reply_data(SFTP_CLIENT_MESSAGE *msg, void *data, int len){
BUFFER *out=buffer_new();
int r;
buffer_add_u32(out,msg->id);
buffer_add_u32(out,ntohl(len));
buffer_add_data(out,data,len);
r=sftp_packet_write(msg->sftp,SSH_FXP_DATA,out);
int sftp_reply_data(SFTP_CLIENT_MESSAGE *msg, const void *data, int len) {
BUFFER *out;
out = buffer_new();
if (out == NULL) {
return -1;
}
if (buffer_add_u32(out, msg->id) < 0 ||
buffer_add_u32(out, ntohl(len)) < 0 ||
buffer_add_data(out, data, len) < 0 ||
sftp_packet_write(msg->sftp, SSH_FXP_DATA, out) < 0) {
buffer_free(out);
return r<0;
return -1;
}
buffer_free(out);
return 0;
}
/* this function will return you a new handle to give the client.