Change FTP to use a data buffer rather than a callback function.
[people/xl0/gpxe.git] / src / include / gpxe / ftp.h
1 #ifndef _GPXE_FTP_H
2 #define _GPXE_FTP_H
3
4 /** @file
5  *
6  * File transfer protocol
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/async.h>
12 #include <gpxe/tcp.h>
13
14 struct buffer;
15
16 /** FTP default port */
17 #define FTP_PORT 21
18
19 /**
20  * FTP states
21  *
22  * These @b must be sequential, i.e. a successful FTP session must
23  * pass through each of these states in order.
24  */
25 enum ftp_state {
26         FTP_CONNECT = 0,
27         FTP_USER,
28         FTP_PASS,
29         FTP_TYPE,
30         FTP_PASV,
31         FTP_RETR,
32         FTP_QUIT,
33         FTP_DONE,
34 };
35
36 /**
37  * An FTP request
38  *
39  */
40 struct ftp_request {
41         /** Server address */
42         struct sockaddr_tcpip server;
43         /** File to download */
44         const char *filename;
45         /** Data buffer to fill */
46         struct buffer *buffer;
47
48         /** Current state */
49         enum ftp_state state;
50         /** Amount of current message already transmitted */
51         size_t already_sent;
52         /** Buffer to be filled with data received via the control channel */
53         char *recvbuf;
54         /** Remaining size of recvbuf */
55         size_t recvsize;
56         /** FTP status code, as text */
57         char status_text[4];
58         /** Passive-mode parameters, as text */
59         char passive_text[24]; /* "aaa,bbb,ccc,ddd,eee,fff" */
60         /** Amount of data received */
61         size_t data_rcvd;
62
63         /** TCP application for the control channel */
64         struct tcp_application tcp;
65         /** TCP application for the data channel */
66         struct tcp_application tcp_data;
67
68         /** Asynchronous operation for this FTP operation */
69         struct async_operation aop;
70 };
71
72 struct async_operation * ftp_get ( struct ftp_request *ftp );
73
74 #endif /* _GPXE_FTP_H */