if (session->monitor)
(*session->monitor)(session->client, session->conn,
SILC_CLIENT_FILE_MONITOR_SEND,
+ SILC_CLIENT_FILE_OK,
data->offset, session->filesize,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ (status == SILC_SFTP_STATUS_NO_SUCH_FILE ?
+ SILC_CLIENT_FILE_NO_SUCH_FILE :
+ status == SILC_SFTP_STATUS_PERMISSION_DENIED ?
+ SILC_CLIENT_FILE_PERMISSION_DENIED :
+ SILC_CLIENT_FILE_ERROR), 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
if (session->monitor)
(*session->monitor)(session->client, session->conn,
SILC_CLIENT_FILE_MONITOR_RECEIVE,
+ SILC_CLIENT_FILE_OK,
session->read_offset, session->filesize,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ (status == SILC_SFTP_STATUS_NO_SUCH_FILE ?
+ SILC_CLIENT_FILE_NO_SUCH_FILE :
+ status == SILC_SFTP_STATUS_PERMISSION_DENIED ?
+ SILC_CLIENT_FILE_PERMISSION_DENIED :
+ SILC_CLIENT_FILE_ERROR), 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
}
/* Open the actual local file */
- session->fd = silc_file_open(session->filepath, O_RDWR | O_CREAT);
+ session->fd = silc_file_open(session->filepath,
+ O_RDWR | O_CREAT | O_EXCL);
if (session->fd < 0) {
/* Call monitor callback */
+ session->client->ops->say(session->client, session->conn,
+ SILC_CLIENT_MESSAGE_ERROR,
+ "File `%s' open failed: %s", session->filepath,
+ strerror(errno));
+
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ SILC_CLIENT_FILE_ERROR, 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
if (session->monitor)
(*session->monitor)(session->client, session->conn,
SILC_CLIENT_FILE_MONITOR_RECEIVE,
+ SILC_CLIENT_FILE_OK,
session->read_offset, session->filesize,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ (status == SILC_SFTP_STATUS_NO_SUCH_FILE ?
+ SILC_CLIENT_FILE_NO_SUCH_FILE :
+ status == SILC_SFTP_STATUS_PERMISSION_DENIED ?
+ SILC_CLIENT_FILE_PERMISSION_DENIED :
+ SILC_CLIENT_FILE_ERROR), 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ (status == SILC_SFTP_STATUS_NO_SUCH_FILE ?
+ SILC_CLIENT_FILE_NO_SUCH_FILE :
+ status == SILC_SFTP_STATUS_PERMISSION_DENIED ?
+ SILC_CLIENT_FILE_PERMISSION_DENIED :
+ SILC_CLIENT_FILE_ERROR), 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ (status == SILC_SFTP_STATUS_NO_SUCH_FILE ?
+ SILC_CLIENT_FILE_NO_SUCH_FILE :
+ status == SILC_SFTP_STATUS_PERMISSION_DENIED ?
+ SILC_CLIENT_FILE_PERMISSION_DENIED :
+ SILC_CLIENT_FILE_ERROR), 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_KEY_AGREEMENT, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_KEY_AGREEMENT,
+ SILC_CLIENT_FILE_OK, 0, 0,
session->client_entry, session->session_id,
NULL, session->monitor_context);
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ SILC_CLIENT_FILE_ERROR, 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ SILC_CLIENT_FILE_ERROR, 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
return;
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_KEY_AGREEMENT, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_KEY_AGREEMENT,
+ SILC_CLIENT_FILE_OK, 0, 0,
session->client_entry, session->session_id,
NULL, session->monitor_context);
if (session->sock)
session->sock->user_data = NULL;
silc_client_ftp_session_free(session);
- break;
}
}
}
SilcClientConnection conn,
SilcClientFileMonitor monitor,
void *monitor_context,
- SilcClientEntry client_entry,
uint32 session_id)
{
SilcClientFtpSession session;
session->monitor = monitor;
session->monitor_context = monitor_context;
- session->client_entry = client_entry;
session->conn = conn;
/* If the hostname and port already exists then the remote client did
SILC_STR_UI_XNSTRING(keyagr->data, keyagr->len),
SILC_STR_END);
silc_client_packet_send(client, conn->sock, SILC_PACKET_FTP,
- client_entry->id, SILC_ID_CLIENT, NULL, NULL,
+ session->client_entry->id,
+ SILC_ID_CLIENT, NULL, NULL,
ftp->data, ftp->len, FALSE);
silc_buffer_free(keyagr);
hostname = silc_key_agreement_get_hostname(payload);
port = silc_key_agreement_get_port(payload);
- if (session == SILC_LIST_END) {
+ if (session == SILC_LIST_END || (!hostname && !port)) {
/* No session found, create one and let the application know about
incoming file transfer request. */
session->session_id = ++conn->next_session_id;
session->client = client;
session->conn = conn;
+ session->client_entry = client_entry;
silc_dlist_add(conn->ftp_sessions, session);
/* Let the application know */
goto out;
}
- if (!hostname)
- goto out;
-
session->hostname = strdup(hostname);
session->port = port;
/* Call monitor callback */
if (session->monitor)
(*session->monitor)(session->client, session->conn,
- SILC_CLIENT_FILE_MONITOR_ERROR, 0, 0,
+ SILC_CLIENT_FILE_MONITOR_ERROR,
+ SILC_CLIENT_FILE_ERROR, 0, 0,
session->client_entry, session->session_id,
session->filepath, session->monitor_context);
}