mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-04 12:20:42 +09:00
sftpserver: Standardize logging on errors
Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org> Reviewed-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
This commit is contained in:
119
src/sftpserver.c
119
src/sftpserver.c
@@ -871,7 +871,8 @@ process_open(sftp_client_message client_msg)
|
||||
int fd = -1;
|
||||
int status;
|
||||
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "Processing open: filename %s", filename);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "Processing open: filename %s, mode=0%o" PRIu32,
|
||||
filename, mode);
|
||||
|
||||
if (((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) &&
|
||||
((msg_flag & (uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE)) {
|
||||
@@ -887,15 +888,17 @@ process_open(sftp_client_message client_msg)
|
||||
} else if ((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) {
|
||||
file_flag = O_RDONLY;
|
||||
} else {
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "undefined message flag: %d", errno);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "undefined message flag: %" PRIu32, msg_flag);
|
||||
sftp_reply_status(client_msg, SSH_FX_FAILURE, "Flag error");
|
||||
return SSH_ERROR;
|
||||
}
|
||||
|
||||
fd = open(filename, file_flag, mode);
|
||||
if (fd == -1) {
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "error open file with error: %d", errno);
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "error open file with error: %s",
|
||||
strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
sftp_reply_status(client_msg, status, "Write error");
|
||||
return SSH_ERROR;
|
||||
}
|
||||
@@ -914,9 +917,10 @@ process_open(sftp_client_message client_msg)
|
||||
sftp_reply_handle(client_msg, handle_s);
|
||||
ssh_string_free(handle_s);
|
||||
} else {
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "opening file failed: %d", errno);
|
||||
close(fd);
|
||||
sftp_reply_status(client_msg, SSH_FX_FAILURE, "No handle available");
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "Failed to allocate handle");
|
||||
sftp_reply_status(client_msg, SSH_FX_FAILURE,
|
||||
"Failed to allocate handle");
|
||||
}
|
||||
|
||||
return SSH_OK;
|
||||
@@ -944,7 +948,7 @@ process_read(sftp_client_message client_msg)
|
||||
|
||||
if (fd < 0) {
|
||||
sftp_reply_status(client_msg, SSH_FX_INVALID_HANDLE, NULL);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "error reading file fd: %d", fd);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "invalid fd (%d) received from handle", fd);
|
||||
return SSH_ERROR;
|
||||
}
|
||||
rv = lseek(fd, client_msg->offset, SEEK_SET);
|
||||
@@ -952,8 +956,7 @@ process_read(sftp_client_message client_msg)
|
||||
sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL,
|
||||
"error seeking file fd: %d at offset: %" PRIu64,
|
||||
fd,
|
||||
client_msg->offset);
|
||||
fd, client_msg->offset);
|
||||
return SSH_ERROR;
|
||||
}
|
||||
|
||||
@@ -1288,7 +1291,8 @@ process_mkdir(sftp_client_message client_msg)
|
||||
int status = SSH_FX_OK;
|
||||
int rv;
|
||||
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "Processing mkdir %s", filename);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "Processing mkdir %s, mode=0%o" PRIu32,
|
||||
filename, mode);
|
||||
|
||||
if (filename == NULL) {
|
||||
sftp_reply_status(client_msg, SSH_FX_NO_SUCH_FILE, "File name error");
|
||||
@@ -1297,7 +1301,9 @@ process_mkdir(sftp_client_message client_msg)
|
||||
|
||||
rv = mkdir(filename, mode);
|
||||
if (rv < 0) {
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "failed to mkdir: %s", strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
ret = SSH_ERROR;
|
||||
}
|
||||
|
||||
@@ -1346,10 +1352,11 @@ process_realpath(sftp_client_message client_msg)
|
||||
path = realpath(filename, NULL);
|
||||
}
|
||||
if (path == NULL) {
|
||||
int status = unix_errno_to_ssh_stat(errno);
|
||||
int saved_errno = errno;
|
||||
int status = unix_errno_to_ssh_stat(saved_errno);
|
||||
const char *err_msg = ssh_str_error(status);
|
||||
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "realpath failed: %d", errno);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "realpath failed: %s", strerror(saved_errno));
|
||||
sftp_reply_status(client_msg, status, err_msg);
|
||||
return SSH_ERROR;
|
||||
}
|
||||
@@ -1377,7 +1384,9 @@ process_lstat(sftp_client_message client_msg)
|
||||
|
||||
rv = lstat(filename, &st);
|
||||
if (rv < 0) {
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "lstat failed: %s", strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
sftp_reply_status(client_msg, status, NULL);
|
||||
ret = SSH_ERROR;
|
||||
} else {
|
||||
@@ -1407,7 +1416,9 @@ process_stat(sftp_client_message client_msg)
|
||||
|
||||
rv = stat(filename, &st);
|
||||
if (rv < 0) {
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "lstat failed: %s", strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
sftp_reply_status(client_msg, status, NULL);
|
||||
ret = SSH_ERROR;
|
||||
} else {
|
||||
@@ -1437,8 +1448,9 @@ process_readlink(sftp_client_message client_msg)
|
||||
|
||||
len = readlink(filename, buf, sizeof(buf) - 1);
|
||||
if (len < 0) {
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "read link error with reason: %d", errno);
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "readlink failed: %s", strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
err_msg = ssh_str_error(status);
|
||||
sftp_reply_status(client_msg, status, err_msg);
|
||||
ret = SSH_ERROR;
|
||||
@@ -1469,8 +1481,9 @@ process_symlink(sftp_client_message client_msg)
|
||||
|
||||
rv = symlink(srcpath, destpath);
|
||||
if (rv < 0) {
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "error symlink with error: %d", errno);
|
||||
int saved_errno = errno;
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "symlink failed: %s", strerror(saved_errno));
|
||||
sftp_reply_status(client_msg, status, "Write error");
|
||||
ret = SSH_ERROR;
|
||||
} else {
|
||||
@@ -1492,8 +1505,9 @@ process_remove(sftp_client_message client_msg)
|
||||
|
||||
rv = unlink(filename);
|
||||
if (rv < 0) {
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "unlink error with reason: %d", errno);
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "unlink failed: %s", strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
ret = SSH_ERROR;
|
||||
}
|
||||
|
||||
@@ -1516,46 +1530,49 @@ static int
|
||||
process_extended_statvfs(sftp_client_message client_msg)
|
||||
{
|
||||
const char *path = sftp_client_message_get_filename(client_msg);
|
||||
sftp_statvfs_t sftp_statvfs;
|
||||
struct statvfs st;
|
||||
uint64_t flag;
|
||||
int status;
|
||||
int rv;
|
||||
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "processing extended statvfs: %s", path);
|
||||
|
||||
rv = statvfs(path, &st);
|
||||
if (rv == 0) {
|
||||
sftp_statvfs_t sftp_statvfs;
|
||||
u_int64_t flag;
|
||||
|
||||
sftp_statvfs = calloc(1, sizeof(struct sftp_statvfs_struct));
|
||||
if (sftp_statvfs != NULL) {
|
||||
flag = (st.f_flag & ST_RDONLY) ? SSH_FXE_STATVFS_ST_RDONLY : 0;
|
||||
flag |= (st.f_flag & ST_NOSUID) ? SSH_FXE_STATVFS_ST_NOSUID : 0;
|
||||
|
||||
sftp_statvfs->f_bsize = st.f_bsize;
|
||||
sftp_statvfs->f_frsize = st.f_frsize;
|
||||
sftp_statvfs->f_blocks = st.f_blocks;
|
||||
sftp_statvfs->f_bfree = st.f_bfree;
|
||||
sftp_statvfs->f_bavail = st.f_bavail;
|
||||
sftp_statvfs->f_files = st.f_files;
|
||||
sftp_statvfs->f_ffree = st.f_ffree;
|
||||
sftp_statvfs->f_favail = st.f_favail;
|
||||
sftp_statvfs->f_fsid = st.f_fsid;
|
||||
sftp_statvfs->f_flag = flag;
|
||||
sftp_statvfs->f_namemax = st.f_namemax;
|
||||
|
||||
rv = sftp_reply_statvfs(client_msg, sftp_statvfs);
|
||||
free(sftp_statvfs);
|
||||
if (rv == 0) {
|
||||
return SSH_OK;
|
||||
}
|
||||
}
|
||||
if (rv != 0) {
|
||||
int saved_errno = errno;
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "statvfs failed: %s", strerror(saved_errno));
|
||||
status = unix_errno_to_ssh_stat(saved_errno);
|
||||
sftp_reply_status(client_msg, status, NULL);
|
||||
return SSH_ERROR;
|
||||
}
|
||||
|
||||
status = unix_errno_to_ssh_stat(errno);
|
||||
sftp_reply_status(client_msg, status, NULL);
|
||||
sftp_statvfs = calloc(1, sizeof(struct sftp_statvfs_struct));
|
||||
if (sftp_statvfs == NULL) {
|
||||
SSH_LOG(SSH_LOG_PROTOCOL, "Failed to allocate statvfs structure");
|
||||
sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL);
|
||||
return SSH_ERROR;
|
||||
}
|
||||
flag = (st.f_flag & ST_RDONLY) ? SSH_FXE_STATVFS_ST_RDONLY : 0;
|
||||
flag |= (st.f_flag & ST_NOSUID) ? SSH_FXE_STATVFS_ST_NOSUID : 0;
|
||||
|
||||
printf("statvfs send failed!\n");
|
||||
sftp_statvfs->f_bsize = st.f_bsize;
|
||||
sftp_statvfs->f_frsize = st.f_frsize;
|
||||
sftp_statvfs->f_blocks = st.f_blocks;
|
||||
sftp_statvfs->f_bfree = st.f_bfree;
|
||||
sftp_statvfs->f_bavail = st.f_bavail;
|
||||
sftp_statvfs->f_files = st.f_files;
|
||||
sftp_statvfs->f_ffree = st.f_ffree;
|
||||
sftp_statvfs->f_favail = st.f_favail;
|
||||
sftp_statvfs->f_fsid = st.f_fsid;
|
||||
sftp_statvfs->f_flag = flag;
|
||||
sftp_statvfs->f_namemax = st.f_namemax;
|
||||
|
||||
rv = sftp_reply_statvfs(client_msg, sftp_statvfs);
|
||||
free(sftp_statvfs);
|
||||
if (rv == 0) {
|
||||
return SSH_OK;
|
||||
}
|
||||
return SSH_ERROR;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user