Lines Matching defs:data

114 static CURLcode myssh_connect(struct Curl_easy *data, bool *done);
115 static CURLcode myssh_multi_statemach(struct Curl_easy *data,
117 static CURLcode myssh_do_it(struct Curl_easy *data, bool *done);
119 static CURLcode scp_done(struct Curl_easy *data,
121 static CURLcode scp_doing(struct Curl_easy *data, bool *dophase_done);
122 static CURLcode scp_disconnect(struct Curl_easy *data,
126 static CURLcode sftp_done(struct Curl_easy *data,
128 static CURLcode sftp_doing(struct Curl_easy *data,
130 static CURLcode sftp_disconnect(struct Curl_easy *data,
134 CURLcode sftp_perform(struct Curl_easy *data,
138 static void sftp_quote(struct Curl_easy *data);
139 static void sftp_quote_stat(struct Curl_easy *data);
140 static int myssh_getsock(struct Curl_easy *data,
143 static CURLcode myssh_setup_connection(struct Curl_easy *data,
235 static void mystate(struct Curl_easy *data, sshstate nowstate
241 struct connectdata *conn = data->conn;
310 infof(data, "SSH %p state change from %s to %s (line %d)",
320 * 1. data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5] is set with an MD5
322 * 2. data->set.ssh_keyfunc callback is set. Then we do trust on first
329 static int myssh_is_known(struct Curl_easy *data)
332 struct connectdata *conn = data->conn;
344 data->set.ssh_keyfunc;
359 if(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) {
362 const char *pubkey_md5 = data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5];
367 failf(data,
375 infof(data, "SSH MD5 fingerprint: %s", md5buffer);
378 failf(data,
389 if(data->set.ssl.primary.verifyhost != TRUE) {
504 Curl_set_in_callback(data, true);
505 rc = func(data, knownkeyp, /* from the knownhosts file */
507 keymatch, data->set.ssh_keyfunc_userp);
508 Curl_set_in_callback(data, false);
555 state(data, SSH_SESSION_DISCONNECT); \
561 state(data, SSH_SFTP_CLOSE); \
570 state(data, SSH_AUTH_PASS_INIT); \
580 state(data, SSH_AUTH_KEY_INIT); \
590 state(data, SSH_AUTH_GSSAPI); \
664 * blocking and without reaching the end. The data the pointer 'block' points
668 static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
671 struct connectdata *conn = data->conn;
672 struct SSHPROTO *protop = data->req.p.ssh;
696 state(data, SSH_S_STARTUP);
705 failf(data, "Failure establishing ssh session");
710 state(data, SSH_HOSTKEY);
715 rc = myssh_is_known(data);
721 state(data, SSH_AUTHLIST);
734 infof(data, "Authenticated with none");
735 state(data, SSH_AUTH_DONE);
745 infof(data, "SSH authentication methods available: %s%s%s%s",
755 state(data, SSH_AUTH_PKEY_INIT);
756 infof(data, "Authentication using SSH public key file");
759 state(data, SSH_AUTH_GSSAPI);
762 state(data, SSH_AUTH_KEY_INIT);
765 state(data, SSH_AUTH_PASS_INIT);
775 if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY)) {
782 if(data->set.str[STRING_SSH_PRIVATE_KEY]) {
783 if(sshc->pubkey && !data->set.ssl.key_passwd) {
797 rc = ssh_pki_import_privkey_file(data->
799 data->set.ssl.key_passwd, NULL,
802 failf(data, "Could not load private key file %s",
803 data->set.str[STRING_SSH_PRIVATE_KEY]);
808 state(data, SSH_AUTH_PKEY);
814 data->set.ssl.key_passwd);
822 infof(data, "Completed public key authentication");
823 state(data, SSH_AUTH_DONE);
839 infof(data, "Completed public key authentication");
840 state(data, SSH_AUTH_DONE);
844 infof(data, "Failed public key authentication (rc: %d)", rc);
850 if(!(data->set.ssh_auth_types & CURLSSH_AUTH_GSSAPI)) {
864 infof(data, "Completed gssapi authentication");
865 state(data, SSH_AUTH_DONE);
873 if(data->set.ssh_auth_types & CURLSSH_AUTH_KEYBOARD) {
874 state(data, SSH_AUTH_KEY);
889 infof(data, "completed keyboard interactive authentication");
890 state(data, SSH_AUTH_DONE);
898 if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD)) {
902 state(data, SSH_AUTH_PASS);
914 infof(data, "Completed password authentication");
915 state(data, SSH_AUTH_DONE);
924 failf(data, "Authentication failure");
932 infof(data, "Authentication complete");
934 Curl_pgrsTime(data, TIMER_APPCONNECT); /* SSH is connected */
940 state(data, SSH_SFTP_INIT);
943 infof(data, "SSH CONNECT phase done");
944 state(data, SSH_STOP);
952 failf(data, "Failure initializing sftp session: %s",
960 failf(data, "Failure initializing sftp session: %s",
965 state(data, SSH_SFTP_REALPATH);
976 data->state.most_recent_ftp_entrypath = sshc->homedir;
982 DEBUGF(infof(data, "SSH CONNECT phase done"));
983 state(data, SSH_STOP);
987 result = Curl_getworkingpath(data, sshc->homedir, &protop->path);
990 state(data, SSH_STOP);
994 if(data->set.quote) {
995 infof(data, "Sending quote commands");
996 sshc->quote_item = data->set.quote;
997 state(data, SSH_SFTP_QUOTE);
1000 state(data, SSH_SFTP_GETINFO);
1005 if(data->set.postquote) {
1006 infof(data, "Sending quote commands");
1007 sshc->quote_item = data->set.postquote;
1008 state(data, SSH_SFTP_QUOTE);
1011 state(data, SSH_STOP);
1017 sftp_quote(data);
1027 state(data, SSH_SFTP_QUOTE);
1031 state(data, sshc->nextstate);
1035 state(data, SSH_SFTP_GETINFO);
1041 sftp_quote_stat(data);
1050 failf(data, "Attempt to set SFTP stats failed: %s",
1052 state(data, SSH_SFTP_CLOSE);
1060 state(data, SSH_SFTP_NEXT_QUOTE);
1069 failf(data, "symlink command failed: %s",
1071 state(data, SSH_SFTP_CLOSE);
1076 state(data, SSH_SFTP_NEXT_QUOTE);
1081 (mode_t)data->set.new_directory_perms);
1084 failf(data, "mkdir command failed: %s",
1086 state(data, SSH_SFTP_CLOSE);
1091 state(data, SSH_SFTP_NEXT_QUOTE);
1100 failf(data, "rename command failed: %s",
1102 state(data, SSH_SFTP_CLOSE);
1107 state(data, SSH_SFTP_NEXT_QUOTE);
1114 failf(data, "rmdir command failed: %s",
1116 state(data, SSH_SFTP_CLOSE);
1121 state(data, SSH_SFTP_NEXT_QUOTE);
1128 failf(data, "rm command failed: %s",
1130 state(data, SSH_SFTP_CLOSE);
1135 state(data, SSH_SFTP_NEXT_QUOTE);
1145 failf(data, "statvfs command failed: %s",
1147 state(data, SSH_SFTP_CLOSE);
1180 state(data, SSH_SFTP_CLOSE);
1185 result = Curl_client_write(data, CLIENTWRITE_HEADER, tmp, strlen(tmp));
1188 state(data, SSH_SFTP_CLOSE);
1193 state(data, SSH_SFTP_NEXT_QUOTE);
1198 if(data->set.get_filetime) {
1199 state(data, SSH_SFTP_FILETIME);
1202 state(data, SSH_SFTP_TRANS_INIT);
1212 data->info.filetime = attrs->mtime;
1216 state(data, SSH_SFTP_TRANS_INIT);
1221 if(data->state.upload)
1222 state(data, SSH_SFTP_UPLOAD_INIT);
1225 state(data, SSH_SFTP_READDIR_INIT);
1227 state(data, SSH_SFTP_DOWNLOAD_INIT);
1235 if(data->state.resume_from) {
1238 if(data->state.resume_from < 0) {
1243 failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
1247 data->state.resume_from = attrs->size;
1252 data->state.resume_from = 0;
1257 if(data->set.remote_append)
1260 else if(data->state.resume_from > 0)
1271 flags, (mode_t)data->set.new_file_perms);
1277 (data->set.ftp_create_missing_dirs &&
1282 state(data, SSH_SFTP_CREATE_DIRS_INIT);
1293 if(data->state.resume_from > 0) {
1296 Curl_set_in_callback(data, true);
1297 seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
1299 Curl_set_in_callback(data, false);
1306 failf(data, "Could not seek stream");
1313 (data->state.resume_from - passed >
1315 sizeof(scratch) : curlx_sotouz(data->state.resume_from - passed);
1318 data->state.fread_func(scratch, 1,
1319 readthisamountnow, data->state.in);
1325 failf(data, "Failed to read data");
1329 } while(passed < data->state.resume_from);
1335 if(data->state.infilesize > 0) {
1336 data->state.infilesize -= data->state.resume_from;
1337 data->req.size = data->state.infilesize;
1338 Curl_pgrsSetUploadSize(data, data->state.infilesize);
1341 rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
1347 if(data->state.infilesize > 0) {
1348 data->req.size = data->state.infilesize;
1349 Curl_pgrsSetUploadSize(data, data->state.infilesize);
1351 /* upload data */
1352 Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
1359 sshc->orig_waitfor = data->req.keepon;
1364 data->state.select_bits = CURL_CSELECT_OUT;
1369 Curl_expire(data, 0, EXPIRE_RUN_NOW);
1371 state(data, SSH_STOP);
1378 state(data, SSH_SFTP_CREATE_DIRS);
1381 state(data, SSH_SFTP_UPLOAD_INIT);
1390 infof(data, "Creating directory '%s'", protop->path);
1391 state(data, SSH_SFTP_CREATE_DIRS_MKDIR);
1394 state(data, SSH_SFTP_UPLOAD_INIT);
1400 (mode_t)data->set.new_directory_perms);
1418 state(data, SSH_SFTP_CREATE_DIRS);
1422 Curl_pgrsSetDownloadSize(data, -1);
1423 if(data->req.no_body) {
1424 state(data, SSH_STOP);
1435 failf(data, "Could not open directory for reading: %s",
1440 state(data, SSH_SFTP_READDIR);
1454 if(data->set.list_only) {
1459 state(data, SSH_SFTP_CLOSE);
1463 result = Curl_client_write(data, CLIENTWRITE_BODY,
1468 state(data, SSH_STOP);
1476 state(data, SSH_STOP);
1487 state(data, SSH_SFTP_CLOSE);
1492 state(data, SSH_SFTP_READDIR_LINK);
1495 state(data, SSH_SFTP_READDIR_BOTTOM);
1500 state(data, SSH_SFTP_READDIR_DONE);
1504 failf(data, "Could not open remote file for reading: %s",
1518 failf(data, "Could not read symlink for reading: %s",
1553 state(data, SSH_SFTP_READDIR_BOTTOM);
1559 result = Curl_client_write(data, CLIENTWRITE_BODY,
1567 state(data, SSH_STOP);
1570 state(data, SSH_SFTP_READDIR);
1577 /* no data to transfer */
1578 Curl_setup_transfer(data, -1, -1, FALSE, -1);
1579 state(data, SSH_STOP);
1590 O_RDONLY, (mode_t)data->set.new_file_perms);
1592 failf(data, "Could not open remote file for reading: %s",
1599 state(data, SSH_SFTP_DOWNLOAD_STAT);
1617 data->req.size = -1;
1618 data->req.maxdownload = -1;
1619 Curl_pgrsSetDownloadSize(data, -1);
1628 failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
1631 if(data->state.use_range) {
1638 from_t = curlx_strtoofft(data->state.range, &ptr, 10, &from);
1658 failf(data, "Offset (%"
1677 data->req.size = size;
1678 data->req.maxdownload = size;
1679 Curl_pgrsSetDownloadSize(data, size);
1683 if(data->state.resume_from) {
1684 if(data->state.resume_from < 0) {
1686 if((curl_off_t)size < -data->state.resume_from) {
1687 failf(data, "Offset (%"
1690 data->state.resume_from, size);
1694 data->state.resume_from += size;
1697 if((curl_off_t)size < data->state.resume_from) {
1698 failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T
1700 data->state.resume_from, size);
1705 data->req.size = size - data->state.resume_from;
1706 data->req.maxdownload = size - data->state.resume_from;
1707 Curl_pgrsSetDownloadSize(data,
1708 size - data->state.resume_from);
1710 rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
1719 if(data->req.size == 0) {
1720 /* no data to transfer */
1721 Curl_setup_transfer(data, -1, -1, FALSE, -1);
1722 infof(data, "File already completely downloaded");
1723 state(data, SSH_STOP);
1726 Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);
1734 data->state.select_bits = CURL_CSELECT_IN;
1739 state(data, SSH_SFTP_CLOSE);
1744 state(data, SSH_STOP);
1755 DEBUGF(infof(data, "SFTP DONE done"));
1762 state(data, sshc->nextstate);
1766 state(data, SSH_STOP);
1787 data->state.most_recent_ftp_entrypath = NULL;
1789 state(data, SSH_SESSION_DISCONNECT);
1793 result = Curl_getworkingpath(data, sshc->homedir, &protop->path);
1796 state(data, SSH_STOP);
1803 if(data->state.upload) {
1804 if(data->state.infilesize < 0) {
1805 failf(data, "SCP requires a known file size for upload");
1813 state(data, SSH_SCP_UPLOAD_INIT);
1818 state(data, SSH_SCP_DOWNLOAD_INIT);
1823 failf(data, "%s", err_msg);
1834 failf(data, "%s", err_msg);
1840 data->state.infilesize,
1841 (int)data->set.new_file_perms);
1844 failf(data, "%s", err_msg);
1849 /* upload data */
1850 Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);
1857 sshc->orig_waitfor = data->req.keepon;
1862 data->state.select_bits = CURL_CSELECT_OUT;
1864 state(data, SSH_STOP);
1873 failf(data, "%s", err_msg);
1877 state(data, SSH_SCP_DOWNLOAD);
1886 failf(data, "%s", err_msg);
1891 /* download data */
1893 data->req.maxdownload = (curl_off_t) bytecount;
1894 Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);
1902 data->state.select_bits = CURL_CSELECT_IN;
1904 state(data, SSH_STOP);
1908 if(data->state.upload)
1909 state(data, SSH_SCP_SEND_EOF);
1911 state(data, SSH_SCP_CHANNEL_FREE);
1924 infof(data, "Failed to close libssh scp channel: %s",
1929 state(data, SSH_SCP_CHANNEL_FREE);
1937 DEBUGF(infof(data, "SCP DONE phase complete"));
1941 state(data, SSH_SESSION_DISCONNECT);
1958 Curl_conn_forget_socket(data, FIRSTSOCKET);
1962 data->state.most_recent_ftp_entrypath = NULL;
1964 state(data, SSH_SESSION_FREE);
2012 state(data, SSH_STOP);
2019 state(data, SSH_STOP);
2038 static int myssh_getsock(struct Curl_easy *data,
2043 (void)data;
2079 static CURLcode myssh_multi_statemach(struct Curl_easy *data,
2082 struct connectdata *conn = data->conn;
2086 CURLcode result = myssh_statemach_act(data, &block);
2094 static CURLcode myssh_block_statemach(struct Curl_easy *data,
2097 struct connectdata *conn = data->conn;
2106 result = myssh_statemach_act(data, &block);
2111 if(Curl_pgrsUpdate(data))
2114 result = Curl_speedcheck(data, now);
2118 left = Curl_timeleft(data, NULL, FALSE);
2120 failf(data, "Operation timed out");
2140 static CURLcode myssh_setup_connection(struct Curl_easy *data,
2146 data->req.p.ssh = ssh = calloc(1, sizeof(struct SSHPROTO));
2161 static CURLcode myssh_connect(struct Curl_easy *data, bool *done)
2165 struct connectdata *conn = data->conn;
2169 /* initialize per-handle data if not already */
2170 if(!data->req.p.ssh)
2171 myssh_setup_connection(data, conn);
2190 failf(data, "Failure initialising ssh session");
2196 failf(data, "Could not set remote host");
2202 infof(data, "Could not parse SSH configuration files");
2208 failf(data, "Could not set socket");
2213 infof(data, "User: %s", conn->user);
2216 failf(data, "Could not set user");
2221 if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
2222 infof(data, "Known hosts: %s", data->set.str[STRING_SSH_KNOWNHOSTS]);
2224 data->set.str[STRING_SSH_KNOWNHOSTS]);
2226 failf(data, "Could not set known hosts file path");
2235 failf(data, "Could not set remote port");
2240 if(data->set.ssh_compression) {
2244 failf(data, "Could not set compression");
2252 if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
2253 rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
2256 failf(data, "Could not load public key file");
2264 state(data, SSH_INIT);
2266 result = myssh_multi_statemach(data, done);
2272 static CURLcode scp_doing(struct Curl_easy *data, bool *dophase_done)
2276 result = myssh_multi_statemach(data, dophase_done);
2279 DEBUGF(infof(data, "DO phase is complete"));
2294 CURLcode scp_perform(struct Curl_easy *data,
2299 DEBUGF(infof(data, "DO phase starts"));
2304 state(data, SSH_SCP_TRANS_INIT);
2306 result = myssh_multi_statemach(data, dophase_done);
2308 *connected = Curl_conn_is_connected(data->conn, FIRSTSOCKET);
2311 DEBUGF(infof(data, "DO phase is complete"));
2317 static CURLcode myssh_do_it(struct Curl_easy *data, bool *done)
2321 struct connectdata *conn = data->conn;
2326 data->req.size = -1; /* make sure this is unknown at this point */
2332 Curl_pgrsSetUploadCounter(data, 0);
2333 Curl_pgrsSetDownloadCounter(data, 0);
2334 Curl_pgrsSetUploadSize(data, -1);
2335 Curl_pgrsSetDownloadSize(data, -1);
2338 result = scp_perform(data, &connected, done);
2340 result = sftp_perform(data, &connected, done);
2348 static CURLcode scp_disconnect(struct Curl_easy *data,
2359 state(data, SSH_SESSION_DISCONNECT);
2361 result = myssh_block_statemach(data, TRUE);
2369 static CURLcode myssh_done(struct Curl_easy *data, CURLcode status)
2372 struct SSHPROTO *protop = data->req.p.ssh;
2376 result = myssh_block_statemach(data, FALSE);
2383 if(Curl_pgrsDone(data))
2386 data->req.keepon = 0; /* clear all bits */
2391 static CURLcode scp_done(struct Curl_easy *data, CURLcode status,
2397 state(data, SSH_SCP_DONE);
2399 return myssh_done(data, status);
2403 static ssize_t scp_send(struct Curl_easy *data, int sockindex,
2407 struct connectdata *conn = data->conn;
2433 static ssize_t scp_recv(struct Curl_easy *data, int sockindex,
2437 struct connectdata *conn = data->conn;
2473 CURLcode sftp_perform(struct Curl_easy *data,
2479 DEBUGF(infof(data, "DO phase starts"));
2484 state(data, SSH_SFTP_QUOTE_INIT);
2487 result = myssh_multi_statemach(data, dophase_done);
2489 *connected = Curl_conn_is_connected(data->conn, FIRSTSOCKET);
2492 DEBUGF(infof(data, "DO phase is complete"));
2499 static CURLcode sftp_doing(struct Curl_easy *data,
2502 CURLcode result = myssh_multi_statemach(data, dophase_done);
2504 DEBUGF(infof(data, "DO phase is complete"));
2512 static CURLcode sftp_disconnect(struct Curl_easy *data,
2519 DEBUGF(infof(data, "SSH DISCONNECT starts now"));
2523 state(data, SSH_SFTP_SHUTDOWN);
2524 result = myssh_block_statemach(data, TRUE);
2527 DEBUGF(infof(data, "SSH DISCONNECT is done"));
2533 static CURLcode sftp_done(struct Curl_easy *data, CURLcode status,
2536 struct connectdata *conn = data->conn;
2543 if(!premature && data->set.postquote && !conn->bits.retry)
2545 state(data, SSH_SFTP_CLOSE);
2547 return myssh_done(data, status);
2551 static ssize_t sftp_send(struct Curl_easy *data, int sockindex,
2555 struct connectdata *conn = data->conn;
2587 static ssize_t sftp_recv(struct Curl_easy *data, int sockindex,
2591 struct connectdata *conn = data->conn;
2634 static void sftp_quote(struct Curl_easy *data)
2637 struct connectdata *conn = data->conn;
2638 struct SSHPROTO *protop = data->req.p.ssh;
2645 char *cmd = sshc->quote_item->data;
2664 state(data, SSH_SFTP_CLOSE);
2668 Curl_debug(data, CURLINFO_HEADER_OUT, (char *) "PWD\n", 4);
2669 Curl_debug(data, CURLINFO_HEADER_IN, tmp, strlen(tmp));
2674 result = Curl_client_write(data, CLIENTWRITE_HEADER, tmp, strlen(tmp));
2677 state(data, SSH_SFTP_CLOSE);
2682 state(data, SSH_SFTP_NEXT_QUOTE);
2692 failf(data, "Syntax error in SFTP command. Supply parameter(s)");
2693 state(data, SSH_SFTP_CLOSE);
2706 failf(data, "Out of memory");
2708 failf(data, "Syntax error: Bad first parameter");
2709 state(data, SSH_SFTP_CLOSE);
2733 failf(data, "Out of memory");
2735 failf(data, "Syntax error in chgrp/chmod/chown/atime/mtime: "
2738 state(data, SSH_SFTP_CLOSE);
2744 state(data, SSH_SFTP_QUOTE_STAT);
2755 failf(data, "Out of memory");
2757 failf(data, "Syntax error in ln/symlink: Bad second parameter");
2759 state(data, SSH_SFTP_CLOSE);
2764 state(data, SSH_SFTP_QUOTE_SYMLINK);
2769 state(data, SSH_SFTP_QUOTE_MKDIR);
2779 failf(data, "Out of memory");
2781 failf(data, "Syntax error in rename: Bad second parameter");
2783 state(data, SSH_SFTP_CLOSE);
2788 state(data, SSH_SFTP_QUOTE_RENAME);
2793 state(data, SSH_SFTP_QUOTE_RMDIR);
2797 state(data, SSH_SFTP_QUOTE_UNLINK);
2802 state(data, SSH_SFTP_QUOTE_STATVFS);
2807 failf(data, "Unknown SFTP command");
2810 state(data, SSH_SFTP_CLOSE);
2815 static void sftp_quote_stat(struct Curl_easy *data)
2817 struct connectdata *conn = data->conn;
2819 char *cmd = sshc->quote_item->data;
2843 failf(data, "Attempt to get SFTP stats failed: %d",
2845 state(data, SSH_SFTP_CLOSE);
2858 failf(data, "Syntax error: chgrp gid not a number");
2859 state(data, SSH_SFTP_CLOSE);
2873 failf(data, "Syntax error: chmod permissions not a number");
2874 state(data, SSH_SFTP_CLOSE);
2888 failf(data, "Syntax error: chown uid not a number");
2889 state(data, SSH_SFTP_CLOSE);
2901 failf(data, "incorrect date format for %.*s", 5, cmd);
2906 failf(data, "date overflow");
2913 state(data, SSH_SFTP_CLOSE);
2927 state(data, SSH_SFTP_QUOTE_SETSTAT);