]> gitweb.factorcode.org Git - factor.git/blob - extra/curl/ffi/ffi.factor
c0eb146a6afa0529faccd3e3100ab451a2eb483a
[factor.git] / extra / curl / ffi / ffi.factor
1 USING: alien alien.c-types alien.enums alien.libraries
2 alien.syntax classes.struct combinators kernel math
3 system words ;
4
5 IN: curl.ffi
6
7 << "curl" {
8     { [ os macosx? ] [ "libcurl.dylib" ] }
9     { [ os unix? ] [ "libcurl.so" ] }
10 } cond cdecl add-library >>
11
12 LIBRARY: curl
13
14 ! curl.h
15
16 FUNCTION: c-string curl_version ( )
17
18 FUNCTION: c-string curl_getenv ( c-string variable )
19
20 CONSTANT: CURL_WRITEFUNC_PAUSE 0x10000001
21
22 ENUM: curlfiletype
23     CURLFILETYPE_FILE
24     CURLFILETYPE_DIRECTORY
25     CURLFILETYPE_SYMLINK
26     CURLFILETYPE_DEVICE_BLOCK
27     CURLFILETYPE_DEVICE_CHAR
28     CURLFILETYPE_NAMEDPIPE
29     CURLFILETYPE_SOCKET
30     CURLFILETYPE_DOOR
31     CURLFILETYPE_UNKNOWN
32 ;
33
34 ENUM: CURLcode
35     CURLE_OK
36     CURLE_UNSUPPORTED_PROTOCOL
37     CURLE_FAILED_INIT
38     CURLE_URL_MALFORMAT
39     CURLE_NOT_BUILT_IN
40     CURLE_COULDNT_RESOLVE_PROXY
41     CURLE_COULDNT_RESOLVE_HOST
42     CURLE_COULDNT_CONNECT
43     CURLE_FTYP_WEIRD_SERVER_REPLY
44     CURLE_REMOTE_ACCESS_DENIED
45     CURLE_FTP_ACCEPT_FAILED
46     CURLE_FTP_WEIRD_PASS_REPLY
47     CURLE_FTP_ACCEPT_TIMEOUT
48     CURLE_FTP_WEIRD_PASV_REPLY
49     CURLE_FTP_WEIRD_227_FORMAT
50     CURLE_FTP_CANT_GET_HOST
51     CURLE_OBSOLETE16
52     CURLE_FTP_COULDNT_SET_TYPE
53     CURLE_PARTIAL_FILE
54     CURLE_FTP_COULDNT_RETR_FILE
55     CURLE_OBSOLETE20
56     CURLE_QUOTE_ERROR
57     CURLE_HTTP_RETURNED_ERROR
58     CURLE_WRITE_ERROR
59     CURLE_OBSOLETE24
60     CURLE_UPLOAD_FAILED
61     CURLE_READ_ERROR
62     CURLE_OUT_OF_MEMORY
63     CURLE_OPERATION_TIMEOUT
64     CURLE_OBSOLETE29
65     CURLE_FTP_PORT_FAILED
66     CURLE_FTP_COULDNT_USE_REST
67     CURLE_OBSOLETE32
68     CURLE_RANGE_ERROR
69     CURLE_HTTP_POST_ERROR
70     CURLE_SSL_CONNECT_ERROR
71     CURLE_BAD_DOWNLOAD_RESUME
72     CURLE_FILE_COULDNT_READ_FILE
73     CURLE_LDAP_CANNOT_BIND
74     CURLE_LDAP_SEARCH_FAILED
75     CURLE_OBSOLETE40
76     CURLE_FUNCTION_NOT_FOUND
77     CURLE_ABORTED_BY_CALLBACK
78     CURLE_BAD_FUNCTION_ARGUMENT
79     CURLE_OBSOLETE44
80     CURLE_INTERFACE_FAILED
81     CURLE_OBSOLETE46
82     CURLE_TOO_MANY_REDIRECTS
83     CURLE_UNKNOWN_OPTION
84     CURLE_TELNET_OPTION_SYNTAX
85     CURLE_OBSOLETE50
86     CURLE_PEER_FAILED_VERIFICATION
87     CURLE_GOT_NOTHING
88     CURLE_SSL_ENGINE_NOTFOUND
89     CURLE_SSL_ENGINE_SETFAILED
90     CURLE_SEND_ERROR
91     CURLE_RECV_ERROR
92     CURLE_OBSOLETE57
93     CURLE_SSL_CERTPROBLEM
94     CURLE_SSL_CIPHER
95     CURLE_SSL_CACERT
96     CURLE_BAD_CONTENT_ENCODING
97     CURLE_LDAP_INVALID_URL
98     CURLE_FILESIZE_EXCEEDED
99     CURLE_USE_SSL_FAILED
100     CURLE_SEND_FAIL_REWIND
101     CURLE_SSL_ENGINE_INITFAILED
102     CURLE_LOGIN_DENIED
103     CURLE_TFTP_NOTFOUND
104     CURLE_TFTP_PERM
105     CURLE_REMOTE_DISK_FULL
106     CURLE_TFTP_ILLEGAL
107     CURLE_TFTP_UNKNOWNID
108     CURLE_REMOTE_FILE_EXISTS
109     CURLE_TFTP_NOSUCHUSER
110     CURLE_CONV_FAILED
111     CURLE_CONV_REQD
112     CURLE_SSL_CACERT_BADFILE
113     CURLE_REMOTE_FILE_NOT_FOUND
114     CURLE_SSH
115     CURLE_SSL_SHUTDOWN_FAILED
116     CURLE_AGAIN
117     CURLE_SSL_CRL_BADFILE
118     CURLE_SSL_ISSUER_ERROR
119     CURLE_FTP_PRET_FAILED
120     CURLE_RTSP_CSEQ_ERROR
121     CURLE_RTSP_SESSION_ERROR
122     CURLE_FTP_BAD_FILE_LIST
123     CURLE_CHUNK_FAILED
124     CURLE_NO_CONNECTION_AVAILABLE
125 ;
126
127 ENUM: CURLoption
128     { CURLOPT_FILE 10001 }
129     { CURLOPT_URL 10002 }
130     { CURLOPT_PORT 3 }
131     { CURLOPT_PROXY 10004 }
132     { CURLOPT_USERPWD 10005 }
133     { CURLOPT_PROXYUSERPWD 10006 }
134     { CURLOPT_RANGE 10007 }
135     { CURLOPT_INFILE 10009 }
136     { CURLOPT_ERRORBUFFER 10010 }
137     { CURLOPT_WRITEFUNCTION 20011 }
138     { CURLOPT_READFUNCTION 20012 }
139     { CURLOPT_TIMEOUT 13 }
140     { CURLOPT_INFILESIZE 14 }
141     { CURLOPT_POSTFIELDS 10015 }
142     { CURLOPT_REFERER 10016 }
143     { CURLOPT_FTPPORT 10017 }
144     { CURLOPT_USERAGENT 10018 }
145     { CURLOPT_LOW_SPEED_LIMIT 19 }
146     { CURLOPT_LOW_SPEED_TIME 20 }
147     { CURLOPT_RESUME_FROM 21 }
148     { CURLOPT_COOKIE 10022 }
149     { CURLOPT_HTTPHEADER 10023 }
150     { CURLOPT_HTTPPOST 10024 }
151     { CURLOPT_SSLCERT 10025 }
152     { CURLOPT_KEYPASSWD 10026 }
153     { CURLOPT_CRLF 27 }
154     { CURLOPT_QUOTE 10028 }
155     { CURLOPT_WRITEHEADER 10029 }
156     { CURLOPT_COOKIEFILE 10031 }
157     { CURLOPT_SSLVERSION 32 }
158     { CURLOPT_TIMECONDITION 33 }
159     { CURLOPT_TIMEVALUE 34 }
160     { CURLOPT_CUSTOMREQUEST 10036 }
161     { CURLOPT_STDERR 10037 }
162     { CURLOPT_POSTQUOTE 10039 }
163     { CURLOPT_WRITEINFO 10040 }
164     { CURLOPT_VERBOSE 41 }
165     { CURLOPT_HEADER 42 }
166     { CURLOPT_NOPROGRESS 43 }
167     { CURLOPT_NOBODY 44 }
168     { CURLOPT_FAILONERROR 45 }
169     { CURLOPT_UPLOAD 46 }
170     { CURLOPT_POST 47 }
171     { CURLOPT_DIRLISTONLY 48 }
172     { CURLOPT_APPEND 50 }
173     { CURLOPT_NETRC 51 }
174     { CURLOPT_FOLLOWLOCATION 52 }
175     { CURLOPT_TRANSFERTEXT 53 }
176     { CURLOPT_PUT 54 }
177     { CURLOPT_PROGRESSFUNCTION 20056 }
178     { CURLOPT_PROGRESSDATA 10057 }
179     { CURLOPT_AUTOREFERER 58 }
180     { CURLOPT_PROXYPORT 59 }
181     { CURLOPT_POSTFIELDSIZE 60 }
182     { CURLOPT_HTTPPROXYTUNNEL 61 }
183     { CURLOPT_INTERFACE 10062 }
184     { CURLOPT_KRBLEVEL 10063 }
185     { CURLOPT_SSL_VERIFYPEER 64 }
186     { CURLOPT_CAINFO 10065 }
187     { CURLOPT_MAXREDIRS 68 }
188     { CURLOPT_FILETIME 69 }
189     { CURLOPT_TELNETOPTIONS 10070 }
190     { CURLOPT_MAXCONNECTS 71 }
191     { CURLOPT_CLOSEPOLICY 72 }
192     { CURLOPT_FRESH_CONNECT 74 }
193     { CURLOPT_FORBID_REUSE 75 }
194     { CURLOPT_RANDOM_FILE 10076 }
195     { CURLOPT_EGDSOCKET 10077 }
196     { CURLOPT_CONNECTTIMEOUT 78 }
197     { CURLOPT_HEADERFUNCTION 20079 }
198     { CURLOPT_HTTPGET 80 }
199     { CURLOPT_SSL_VERIFYHOST 81 }
200     { CURLOPT_COOKIEJAR 10082 }
201     { CURLOPT_SSL_CIPHER_LIST 10083 }
202     { CURLOPT_HTTP_VERSION 84 }
203     { CURLOPT_FTP_USE_EPSV 85 }
204     { CURLOPT_SSLCERTTYPE 10086 }
205     { CURLOPT_SSLKEY 10087 }
206     { CURLOPT_SSLKEYTYPE 10088 }
207     { CURLOPT_SSLENGINE 10089 }
208     { CURLOPT_SSLENGINE_DEFAULT 90 }
209     { CURLOPT_DNS_USE_GLOBAL_CACHE 91 }
210     { CURLOPT_DNS_CACHE_TIMEOUT 92 }
211     { CURLOPT_PREQUOTE 10093 }
212     { CURLOPT_DEBUGFUNCTION 20094 }
213     { CURLOPT_DEBUGDATA 10095 }
214     { CURLOPT_COOKIESESSION 96 }
215     { CURLOPT_CAPATH 10097 }
216     { CURLOPT_BUFFERSIZE 98 }
217     { CURLOPT_NOSIGNAL 99 }
218     { CURLOPT_SHARE 10100 }
219     { CURLOPT_PROXYTYPE 101 }
220     { CURLOPT_ACCEPT_ENCODING 10102 }
221     { CURLOPT_PRIVATE 10103 }
222     { CURLOPT_HTTP200ALIASES 10104 }
223     { CURLOPT_UNRESTRICTED_AUTH 105 }
224     { CURLOPT_FTP_USE_EPRT 106 }
225     { CURLOPT_HTTPAUTH 107 }
226     { CURLOPT_SSL_CTX_FUNCTION 20108 }
227     { CURLOPT_SSL_CTX_DATA 10109 }
228     { CURLOPT_FTP_CREATE_MISSING_DIRS 110 }
229     { CURLOPT_PROXYAUTH 111 }
230     { CURLOPT_SERVER_RESPONSE_TIMEOUT 112 }
231     { CURLOPT_IPRESOLVE 113 }
232     { CURLOPT_MAXFILESIZE 114 }
233     { CURLOPT_INFILESIZE_LARGE 30115 }
234     { CURLOPT_RESUME_FROM_LARGE 30116 }
235     { CURLOPT_MAXFILESIZE_LARGE 30117 }
236     { CURLOPT_NETRC_FILE 10118 }
237     { CURLOPT_USE_SSL 119 }
238     { CURLOPT_POSTFIELDSIZE_LARGE 30120 }
239     { CURLOPT_TCP_NODELAY 121 }
240     { CURLOPT_FTPSSLAUTH 129 }
241     { CURLOPT_IOCTLFUNCTION 20130 }
242     { CURLOPT_IOCTLDATA 10131 }
243     { CURLOPT_FTP_ACCOUNT 10134 }
244     { CURLOPT_COOKIELIST 10135 }
245     { CURLOPT_IGNORE_CONTENT_LENGTH 136 }
246     { CURLOPT_FTP_SKIP_PASV_IP 137 }
247     { CURLOPT_FTP_FILEMETHOD 138 }
248     { CURLOPT_LOCALPORT 139 }
249     { CURLOPT_LOCALPORTRANGE 140 }
250     { CURLOPT_CONNECT_ONLY 141 }
251     { CURLOPT_CONV_FROM_NETWORK_FUNCTION 20142 }
252     { CURLOPT_CONV_TO_NETWORK_FUNCTION 20143 }
253     { CURLOPT_CONV_FROM_UTF8_FUNCTION 20144 }
254     { CURLOPT_MAX_SEND_SPEED_LARGE 30145 }
255     { CURLOPT_MAX_RECV_SPEED_LARGE 30146 }
256     { CURLOPT_FTP_ALTERNATIVE_TO_USER 10147 }
257     { CURLOPT_SOCKOPTFUNCTION 20148 }
258     { CURLOPT_SOCKOPTDATA 10149 }
259     { CURLOPT_SSL_SESSIONID_CACHE 150 }
260     { CURLOPT_SSH_AUTH_TYPES 151 }
261     { CURLOPT_SSH_PUBLIC_KEYFILE 10152 }
262     { CURLOPT_SSH_PRIVATE_KEYFILE 10153 }
263     { CURLOPT_FTP_SSL_CCC 154 }
264     { CURLOPT_TIMEOUT_MS 155 }
265     { CURLOPT_CONNECTTIMEOUT_MS 156 }
266     { CURLOPT_HTTP_TRANSFER_DECODING 157 }
267     { CURLOPT_HTTP_CONTENT_DECODING 158 }
268     { CURLOPT_NEWFILE_PERMS 159 }
269     { CURLOPT_NEW_DIRECTORY_PERMS 160 }
270     { CURLOPT_POSTREDIR 161 }
271     { CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 10162 }
272     { CURLOPT_OPENSOCKETFUNCTION 20163 }
273     { CURLOPT_OPENSOCKETDATA 10164 }
274     { CURLOPT_COPYPOSTFIELD 10165 }
275     { CURLOPT_PROXY_TRANSFER_MODE 166 }
276     { CURLOPT_SEEKFUNCTION 20167 }
277     { CURLOPT_SEEKDATA 10168 }
278     { CURLOPT_CRLFILE 10169 }
279     { CURLOPT_ISSUERCERT 10170 }
280     { CURLOPT_ADDRESS_SCOPE 171 }
281     { CURLOPT_CERTINFO 172 }
282     { CURLOPT_USERNAME 10173 }
283     { CURLOPT_PASSWORD 10174 }
284     { CURLOPT_PROXYUSERNAME 10175 }
285     { CURLOPT_PROXYPASSWORD 10176 }
286     { CURLOPT_NOPROXY 10177 }
287     { CURLOPT_TFTP_BLKSIZE 178 }
288     { CURLOPT_SOCKS5_GSSAPI_SERVICE 10179 }
289     { CURLOPT_SOCKS5_GSSAPI_NEC 10180 }
290     { CURLOPT_PROTOCOLS 181 }
291     { CURLOPT_REDIR_PROTOCOLS 182 }
292     { CURLOPT_SSH_KNOWNHOSTS 10183 }
293     { CURLOPT_SSH_KEYFUNCTION 20184 }
294     { CURLOPT_SSH_KEYDATA 10185 }
295     { CURLOPT_MAIL_FROM 10186 }
296     { CURLOPT_MAIL_RCPT 10187 }
297     { CURLOPT_FTP_USE_PRET 188 }
298     { CURLOPT_RTSP_REQUEST 189 }
299     { CURLOPT_RTSP_SESSION_ID 10190 }
300     { CURLOPT_RTSP_STREAM_URI 10191 }
301     { CURLOPT_RTSP_TRANSPORT 10192 }
302     { CURLOPT_RTSP_CLIENT_CSEQ 193 }
303     { CURLOPT_RTSP_SERVER_CSEQ 194 }
304     { CURLOPT_INTERLEAVEDATA 10195 }
305     { CURLOPT_INTERLEAVEFUNCTION 20196 }
306     { CURLOPT_WILDCARDMATCH 197 }
307     { CURLOPT_CHUNK_BGN_FUNCTION 20198 }
308     { CURLOPT_CHUNK_END_FUNCTION 20199 }
309     { CURLOPT_FNMATCH_FUNCTION 20200 }
310     { CURLOPT_CHUNK_DATA 10201 }
311     { CURLOPT_FNMATCH_DATA 10202 }
312     { CURLOPT_RESOLVE 10203 }
313     { CURLOPT_TLSAUTH_USERNAME 10204 }
314     { CURLOPT_TLSAUTH_PASSWORD 10205 }
315     { CURLOPT_TLSAUTH_TYPE 10206 }
316     { CURLOPT_TRANSFER_ENCODING 207 }
317     { CURLOPT_CLOSESOCKETFUNCTION 20208 }
318     { CURLOPT_CLOSESOCKETDATA 10209 }
319     { CURLOPT_GSSAPI_DELEGATION 210 }
320     { CURLOPT_DNS_SERVERS 10211 }
321     { CURLOPT_ACCEPTTIMEOUT_MS 212 }
322     { CURLOPT_TCP_KEEPALIVE 213 }
323     { CURLOPT_TCP_KEEPIDLE 214 }
324     { CURLOPT_TCP_KEEPINTVL 215 }
325     { CURLOPT_SSL_OPTIONS 216 }
326     { CURLOPT_MAIL_AUTH 10217 }
327 ;
328
329 ALIAS: CURLOPT_WRITEDATA CURLOPT_FILE
330 ALIAS: CURLOPT_READDATA CURLOPT_INFILE
331 ALIAS: CURLOPT_HEADERDATA CURLOPT_WRITEHEADER
332 ALIAS: CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER
333
334 ! easy.h
335
336 TYPEDEF: void CURL
337 TYPEDEF: int64_t curl_off_t
338
339 FUNCTION: CURL* curl_easy_init ( )
340
341 FUNCTION-ALIAS: curl_easy_setopt_long
342     CURLcode curl_easy_setopt ( CURL* curl, CURLoption option, long value )
343
344 FUNCTION-ALIAS: curl_easy_setopt_string
345     CURLcode curl_easy_setopt ( CURL* curl, CURLoption option, c-string value )
346
347 FUNCTION-ALIAS: curl_easy_setopt_pointer
348     CURLcode curl_easy_setopt ( CURL* curl, CURLoption option, void* value )
349
350 FUNCTION-ALIAS: curl_easy_setopt_curl_off_t
351     CURLcode curl_easy_setopt ( CURL* curl, CURLoption option, curl_off_t value )
352
353 FUNCTION: CURLcode curl_easy_perform ( CURL* curl )
354
355 FUNCTION: void curl_easy_cleanup ( CURL* curl )
356
357 FUNCTION: c-string curl_easy_escape ( CURL* curl, c-string string, int length )
358
359 FUNCTION: c-string curl_easy_unescape ( CURL* handle, c-string string, int length, int* outlength )
360
361 : curl_easy_setopt ( curl option value -- code )
362     over enum>number {
363         { [ dup 30000 > ] [ drop curl_easy_setopt_curl_off_t ] }
364         { [ dup 20000 > ] [ drop curl_easy_setopt_pointer ] }
365         { [ dup 10000 > ] [ drop curl_easy_setopt_string ] }
366         [ drop curl_easy_setopt_long ]
367     } cond ;
368
369 CALLBACK: size_t write_callback ( char *buffer, size_t size, size_t nitems, void *outstream )
370
371 CALLBACK: long chunk_bgn_callback ( void* transfer_info, void* ptr, int remains )
372
373 CALLBACK: long chunk_end_callback ( void* ptr )
374
375 CALLBACK: int fnmatch_callback ( void* ptr, c-string pattern, c-string string )
376
377 CALLBACK: int seek_callback ( void* instream, curl_off_t offset, int origin )
378
379 CALLBACK: size_t read_callback ( char* buffer, size_t size, size_t nitems, void* instream )
380
381 ENUM: curlsocktype
382     CURLSOCKTYPE_IPCXN
383     CURLSOCKTYPE_ACCEPT
384     CURLSOCKTYPE_LAST
385 ;
386
387 CONSTANT: CURL_SOCKOPT_OK 0
388 CONSTANT: CURL_SOCKOPT_ERROR 1
389 CONSTANT: CURL_SOCKOPT_ALREADY_CONNECTED 2
390
391 TYPEDEF: int curl_socket_t
392
393 CALLBACK: int sockopt_callback ( void* clientp, curl_socket_t curlfd, curlsocktype purpose )
394
395 STRUCT: curl_sockaddr
396     { family int }
397     { socktype int }
398     { protocol int }
399     { addrlen uint }
400 ;
401
402 CALLBACK: curl_socket_t opensocket_callback ( void* clientp, curlsocktype purpose, curl_sockaddr* address )
403
404 CALLBACK: int closesocket_callback ( void* clientp, curl_socket_t item )
405
406 ENUM: curlioerr
407     CURLIOE_OK
408     CURLIOE_UNKNOWNCMD
409     CURLIOE_FAILRESTART
410     CURLIOE_LAST
411 ;
412
413 ENUM: curliocmd
414     CURLIOCMD_NOP
415     CURLIOCMD_RESTARTREAD
416     CURLIOCMD_LAST
417 ;
418
419 CALLBACK: curlioerr ioctl_callback ( CURL* handle, int cmd, void* clientp )
420
421 CALLBACK: void* malloc_callback ( size_t size )
422 CALLBACK: void free_callback ( void* ptr )
423 CALLBACK: void* realloc_callback ( void* ptr, size_t size )
424 CALLBACK: char* strdup_callback ( char* str )
425 CALLBACK: void* calloc_callback ( size_t nmemb, size_t size )
426
427 ENUM: curl_infotype
428     CURLINFO_TEXT
429     CURLINFO_HEADER_IN
430     CURLINFO_HEADER_OUT
431     CURLINFO_DATA_IN
432     CURLINFO_DATA_OUT
433     CURLINFO_SSL_DATA_IN
434     CURLINFO_SSL_DATA_OUT
435     CURLINFO_END
436 ;
437
438 CALLBACK: int debug_callback ( CURL* handle, curl_infotype type, char* data, size_t size, void* userptr )
439
440 CALLBACK: CURLcode conv_callback ( char* buffer, size_t length )
441
442 CALLBACK: CURLcode ssl_ctx_callback ( CURL* curl, void* ssl_ctx, void* userptr )
443
444 ENUM: curl_proxytype
445     { CURLPROXY_HTTP 0 }
446     { CURLPROXY_HTTP_1_0 1 }
447     { CURLPROXY_SOCKS4 4 }
448     { CURLPROXY_SOCKS5 5 }
449     { CURLPROXY_SOCKS4A 6 }
450     { CURLPROXY_SOCKS5_HOSTNAME 7 }
451 ;
452
453 ! multi.h