c3eafb670c42addb6920800f31dd5dcefa349f16
[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 /** FTP default port */
15 #define FTP_PORT 21
16
17 /**
18  * FTP states
19  *
20  * These @b must be sequential, i.e. a successful FTP session must
21  * pass through each of these states in order.
22  */
23 enum ftp_state {
24         FTP_CONNECT = 0,
25         FTP_USER,
26         FTP_PASS,
27         FTP_TYPE,
28         FTP_PASV,
29         FTP_RETR,
30         FTP_QUIT,
31         FTP_DONE,
32 };
33
34 /**
35  * An FTP request
36  *
37  */
38 struct ftp_request {
39         /** Server address */
40         struct sockaddr_tcpip server;
41         /** File to download */
42         const char *filename;
43         /** Callback function
44          *
45          * @v data      Received data
46          * @v len       Length of received data
47          *
48          * This function is called for all data received from the
49          * remote server.
50          */
51         void ( *callback ) ( char *data, size_t len );
52
53         /** Current state */
54         enum ftp_state state;
55         /** Amount of current message already transmitted */
56         size_t already_sent;
57         /** Buffer to be filled with data received via the control channel */
58         char *recvbuf;
59         /** Remaining size of recvbuf */
60         size_t recvsize;
61         /** FTP status code, as text */
62         char status_text[4];
63         /** Passive-mode parameters, as text */
64         char passive_text[24]; /* "aaa,bbb,ccc,ddd,eee,fff" */
65
66         /** TCP application for the control channel */
67         struct tcp_application tcp;
68         /** TCP application for the data channel */
69         struct tcp_application tcp_data;
70
71         /** Asynchronous operation for this FTP operation */
72         struct async_operation aop;
73 };
74
75 struct async_operation * ftp_get ( struct ftp_request *ftp );
76
77 #endif /* _GPXE_FTP_H */