Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 55 - (hide annotations) (download) (as text)
Wed Mar 24 08:04:56 2010 UTC (14 years ago) by hirohitohigashi
File MIME type: text/x-csrc
File size: 4381 byte(s)
Tag release 2.2
1 hirohitohigashi 28 /*
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 hirohitohigashi 30 *@retval int エラーコード
45 hirohitohigashi 28 *@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 hirohitohigashi 29 int res;
53 hirohitohigashi 28
54 hirohitohigashi 50 if( ftp->socket < 0 ) return LIBOFTP_ERROR;
55    
56 hirohitohigashi 28 /*
57     * ローカルファイルオープン
58     */
59     fd = open( local_fname, O_RDONLY );
60     if( fd < 0 ) {
61 hirohitohigashi 29 DEBUGPRINT1( "local file open error. %s\n", strerror(errno) );
62     return LIBOFTP_ERROR_OS;
63 hirohitohigashi 28 }
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 hirohitohigashi 29 DEBUGPRINT1( "local file read error. %s\n", strerror(errno) );
90     copy_strerror();
91 hirohitohigashi 28 close( data_socket );
92 hirohitohigashi 29 return LIBOFTP_ERROR_OS;
93 hirohitohigashi 28 }
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 hirohitohigashi 29 copy_strerror();
99 hirohitohigashi 28 close( data_socket );
100 hirohitohigashi 29 return LIBOFTP_ERROR_OS;
101 hirohitohigashi 28 }
102     }
103     close( fd );
104     close( data_socket );
105    
106     /*
107     * receive response.
108     */
109 hirohitohigashi 29 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 hirohitohigashi 28 }
114    
115 hirohitohigashi 29 return LIBOFTP_NOERROR;
116 hirohitohigashi 28 }
117    
118    
119    
120     /***** Global functions *****************************************************/
121    
122     /****************************************************************************/
123     /*! ファイル送信
124     *
125     *@param ftp LIBOFTPへのポインタ。
126     *@param local_fname ローカルファイル名
127     *@param fname サーバ上のファイル名
128 hirohitohigashi 30 *@retval int エラーコード
129 hirohitohigashi 28 *@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 hirohitohigashi 30 *@retval int エラーコード
145 hirohitohigashi 28 *@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