Develop and Download Open Source Software

Browse Subversion Repository

Contents of /tags/REL-2.2/ftp_put_file.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 55 - (show annotations) (download) (as text)
Wed Mar 24 08:04:56 2010 UTC (13 years, 11 months ago) by hirohitohigashi
File MIME type: text/x-csrc
File size: 4381 byte(s)
Tag release 2.2
1 /*
2 liboftp: this is an FTP library to simplify the work to a Developer
3 who want to work with FTP servers (RFC 959).
4
5 Copyright (c) 2009 hirohito higashi. All rights reserved.
6 This file is distributed under BSD license.
7 */
8
9
10 /***** Feature test switches ************************************************/
11 /***** System headers *******************************************************/
12 #include <unistd.h>
13 #include <sys/types.h>
14 #include <sys/socket.h>
15 #include <sys/uio.h>
16 #include <fcntl.h>
17 #include <string.h>
18 #include <errno.h>
19
20
21 /***** Local headers ********************************************************/
22 #include "liboftp.h"
23 #include "sub.h"
24
25
26 /***** Constat values *******************************************************/
27 #define TRANSFER_SEGMENT_SIZE 1024 /* 一度のrecv()で転送するバイト数 */
28
29
30 /***** Macros ***************************************************************/
31 /***** Typedefs *************************************************************/
32 /***** Function prototypes **************************************************/
33 /***** Local variables ******************************************************/
34 /***** Global variables *****************************************************/
35 /***** Signal catching functions ********************************************/
36 /***** Local functions ******************************************************/
37 /****************************************************************************/
38 /*! ファイル送信メイン
39 *
40 *@param ftp LIBOFTPへのポインタ。
41 *@param local_fname ローカルファイル名
42 *@param fname サーバ上のファイル名
43 *@param cmd 送信するFTPコマンド
44 *@retval int エラーコード
45 *@note
46 */
47 static int ftp_put_file_main( LIBOFTP *ftp, const char *local_fname, const char *fname, const char *cmd )
48 {
49 int data_socket;
50 int fd;
51 char buf[TRANSFER_SEGMENT_SIZE];
52 int res;
53
54 if( ftp->socket < 0 ) return LIBOFTP_ERROR;
55
56 /*
57 * ローカルファイルオープン
58 */
59 fd = open( local_fname, O_RDONLY );
60 if( fd < 0 ) {
61 DEBUGPRINT1( "local file open error. %s\n", strerror(errno) );
62 return LIBOFTP_ERROR_OS;
63 }
64
65 /*
66 * 送信準備
67 */
68 if( ftp->flag_passive ) {
69 data_socket = ftp_getready_pasv( ftp, cmd, fname );
70 } else {
71 data_socket = ftp_getready_active( ftp, cmd, fname );
72 }
73 if( data_socket < 0 ) {
74 close( fd );
75 return data_socket;
76 }
77
78 /*
79 * タイムアウトが意図通りに働くように、分割してsendする。
80 */
81 while( 1 ) {
82 int n_rd, n_wr;
83 n_rd = read( fd, buf, TRANSFER_SEGMENT_SIZE );
84 if( n_rd == 0 ) break;
85
86 if( n_rd < 0 ) {
87 if( errno == EINTR ) continue;
88
89 DEBUGPRINT1( "local file read error. %s\n", strerror(errno) );
90 copy_strerror();
91 close( data_socket );
92 return LIBOFTP_ERROR_OS;
93 }
94
95 n_wr = sendn( data_socket, buf, n_rd, 0 );
96 DEBUGPRINT1( "SEND: n=%d\n", n_wr );
97 if( n_wr < 0 ) {
98 copy_strerror();
99 close( data_socket );
100 return LIBOFTP_ERROR_OS;
101 }
102 }
103 close( fd );
104 close( data_socket );
105
106 /*
107 * receive response.
108 */
109 res = ftp_receive_response( ftp, ftp->error_message, sizeof(ftp->error_message)-1 );
110 if( res != 226 ) { /* 226: Closing data connection. */
111 DEBUGPRINT1( "got illegal response %d\n", res );
112 return res<0? res: LIBOFTP_ERROR_PROTOCOL;
113 }
114
115 return LIBOFTP_NOERROR;
116 }
117
118
119
120 /***** Global functions *****************************************************/
121
122 /****************************************************************************/
123 /*! ファイル送信
124 *
125 *@param ftp LIBOFTPへのポインタ。
126 *@param local_fname ローカルファイル名
127 *@param fname サーバ上のファイル名
128 *@retval int エラーコード
129 *@note
130 */
131 int ftp_put_file( LIBOFTP *ftp, const char *local_fname, const char *fname )
132 {
133 return ftp_put_file_main( ftp, local_fname, fname, "STOR" );
134 }
135
136
137
138 /****************************************************************************/
139 /*! ファイル送信 アペンドモード
140 *
141 *@param ftp LIBOFTPへのポインタ。
142 *@param local_fname ローカルファイル名
143 *@param fname サーバ上のファイル名
144 *@retval int エラーコード
145 *@note
146 */
147 int ftp_append_file( LIBOFTP *ftp, const char *local_fname, const char *fname )
148 {
149 return ftp_put_file_main( ftp, local_fname, fname, "APPE" );
150 }
151

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26