00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00072 #ifndef MHD_MICROHTTPD_H
00073 #define MHD_MICROHTTPD_H
00074
00075 #ifdef __cplusplus
00076 extern "C"
00077 {
00078 #if 0
00079 }
00080 #endif
00081 #endif
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 #ifndef MHD_PLATFORM_H
00094 #include <unistd.h>
00095 #include <stdarg.h>
00096 #include <stdint.h>
00097 #ifdef __MINGW32__
00098 #include <ws2tcpip.h>
00099 #else
00100 #include <sys/time.h>
00101 #include <sys/types.h>
00102 #include <sys/socket.h>
00103 #endif
00104 #endif
00105
00109 #define MHD_VERSION 0x00091600
00110
00114 #define MHD_YES 1
00115
00119 #define MHD_NO 0
00120
00124 #define MHD_INVALID_NONCE -1
00125
00130 #ifdef UINT64_MAX
00131 #define MHD_SIZE_UNKNOWN UINT64_MAX
00132 #else
00133 #define MHD_SIZE_UNKNOWN ((uint64_t) -1LL)
00134 #endif
00135
00136 #ifdef SIZE_MAX
00137 #define MHD_CONTENT_READER_END_OF_STREAM SIZE_MAX
00138 #define MHD_CONTENT_READER_END_WITH_ERROR (SIZE_MAX - 1)
00139 #else
00140 #define MHD_CONTENT_READER_END_OF_STREAM ((size_t) -1LL)
00141 #define MHD_CONTENT_READER_END_WITH_ERROR (((size_t) -1LL) - 1)
00142 #endif
00143
00149 #ifndef MHD_LONG_LONG
00150 #define MHD_LONG_LONG long long
00151 #endif
00152 #ifndef MHD_LONG_LONG_PRINTF
00153
00157 #define MHD_LONG_LONG_PRINTF "ll"
00158 #endif
00159
00160
00164 #define MHD_HTTP_CONTINUE 100
00165 #define MHD_HTTP_SWITCHING_PROTOCOLS 101
00166 #define MHD_HTTP_PROCESSING 102
00167
00168 #define MHD_HTTP_OK 200
00169 #define MHD_HTTP_CREATED 201
00170 #define MHD_HTTP_ACCEPTED 202
00171 #define MHD_HTTP_NON_AUTHORITATIVE_INFORMATION 203
00172 #define MHD_HTTP_NO_CONTENT 204
00173 #define MHD_HTTP_RESET_CONTENT 205
00174 #define MHD_HTTP_PARTIAL_CONTENT 206
00175 #define MHD_HTTP_MULTI_STATUS 207
00176
00177 #define MHD_HTTP_MULTIPLE_CHOICES 300
00178 #define MHD_HTTP_MOVED_PERMANENTLY 301
00179 #define MHD_HTTP_FOUND 302
00180 #define MHD_HTTP_SEE_OTHER 303
00181 #define MHD_HTTP_NOT_MODIFIED 304
00182 #define MHD_HTTP_USE_PROXY 305
00183 #define MHD_HTTP_SWITCH_PROXY 306
00184 #define MHD_HTTP_TEMPORARY_REDIRECT 307
00185
00186 #define MHD_HTTP_BAD_REQUEST 400
00187 #define MHD_HTTP_UNAUTHORIZED 401
00188 #define MHD_HTTP_PAYMENT_REQUIRED 402
00189 #define MHD_HTTP_FORBIDDEN 403
00190 #define MHD_HTTP_NOT_FOUND 404
00191 #define MHD_HTTP_METHOD_NOT_ALLOWED 405
00192 #define MHD_HTTP_METHOD_NOT_ACCEPTABLE 406
00193 #define MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
00194 #define MHD_HTTP_REQUEST_TIMEOUT 408
00195 #define MHD_HTTP_CONFLICT 409
00196 #define MHD_HTTP_GONE 410
00197 #define MHD_HTTP_LENGTH_REQUIRED 411
00198 #define MHD_HTTP_PRECONDITION_FAILED 412
00199 #define MHD_HTTP_REQUEST_ENTITY_TOO_LARGE 413
00200 #define MHD_HTTP_REQUEST_URI_TOO_LONG 414
00201 #define MHD_HTTP_UNSUPPORTED_MEDIA_TYPE 415
00202 #define MHD_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE 416
00203 #define MHD_HTTP_EXPECTATION_FAILED 417
00204 #define MHD_HTTP_UNPROCESSABLE_ENTITY 422
00205 #define MHD_HTTP_LOCKED 423
00206 #define MHD_HTTP_FAILED_DEPENDENCY 424
00207 #define MHD_HTTP_UNORDERED_COLLECTION 425
00208 #define MHD_HTTP_UPGRADE_REQUIRED 426
00209 #define MHD_HTTP_NO_RESPONSE 444
00210 #define MHD_HTTP_RETRY_WITH 449
00211 #define MHD_HTTP_BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS 450
00212 #define MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451
00213
00214 #define MHD_HTTP_INTERNAL_SERVER_ERROR 500
00215 #define MHD_HTTP_NOT_IMPLEMENTED 501
00216 #define MHD_HTTP_BAD_GATEWAY 502
00217 #define MHD_HTTP_SERVICE_UNAVAILABLE 503
00218 #define MHD_HTTP_GATEWAY_TIMEOUT 504
00219 #define MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED 505
00220 #define MHD_HTTP_VARIANT_ALSO_NEGOTIATES 506
00221 #define MHD_HTTP_INSUFFICIENT_STORAGE 507
00222 #define MHD_HTTP_BANDWIDTH_LIMIT_EXCEEDED 509
00223 #define MHD_HTTP_NOT_EXTENDED 510
00224
00230 #define MHD_ICY_FLAG ((uint32_t)(1 << 31))
00231
00232
00233 #define MHD_HTTP_HEADER_ACCEPT "Accept"
00234 #define MHD_HTTP_HEADER_ACCEPT_CHARSET "Accept-Charset"
00235 #define MHD_HTTP_HEADER_ACCEPT_ENCODING "Accept-Encoding"
00236 #define MHD_HTTP_HEADER_ACCEPT_LANGUAGE "Accept-Language"
00237 #define MHD_HTTP_HEADER_ACCEPT_RANGES "Accept-Ranges"
00238 #define MHD_HTTP_HEADER_AGE "Age"
00239 #define MHD_HTTP_HEADER_ALLOW "Allow"
00240 #define MHD_HTTP_HEADER_AUTHORIZATION "Authorization"
00241 #define MHD_HTTP_HEADER_CACHE_CONTROL "Cache-Control"
00242 #define MHD_HTTP_HEADER_CONNECTION "Connection"
00243 #define MHD_HTTP_HEADER_CONTENT_ENCODING "Content-Encoding"
00244 #define MHD_HTTP_HEADER_CONTENT_LANGUAGE "Content-Language"
00245 #define MHD_HTTP_HEADER_CONTENT_LENGTH "Content-Length"
00246 #define MHD_HTTP_HEADER_CONTENT_LOCATION "Content-Location"
00247 #define MHD_HTTP_HEADER_CONTENT_MD5 "Content-MD5"
00248 #define MHD_HTTP_HEADER_CONTENT_RANGE "Content-Range"
00249 #define MHD_HTTP_HEADER_CONTENT_TYPE "Content-Type"
00250 #define MHD_HTTP_HEADER_COOKIE "Cookie"
00251 #define MHD_HTTP_HEADER_DATE "Date"
00252 #define MHD_HTTP_HEADER_ETAG "ETag"
00253 #define MHD_HTTP_HEADER_EXPECT "Expect"
00254 #define MHD_HTTP_HEADER_EXPIRES "Expires"
00255 #define MHD_HTTP_HEADER_FROM "From"
00256 #define MHD_HTTP_HEADER_HOST "Host"
00257 #define MHD_HTTP_HEADER_IF_MATCH "If-Match"
00258 #define MHD_HTTP_HEADER_IF_MODIFIED_SINCE "If-Modified-Since"
00259 #define MHD_HTTP_HEADER_IF_NONE_MATCH "If-None-Match"
00260 #define MHD_HTTP_HEADER_IF_RANGE "If-Range"
00261 #define MHD_HTTP_HEADER_IF_UNMODIFIED_SINCE "If-Unmodified-Since"
00262 #define MHD_HTTP_HEADER_LAST_MODIFIED "Last-Modified"
00263 #define MHD_HTTP_HEADER_LOCATION "Location"
00264 #define MHD_HTTP_HEADER_MAX_FORWARDS "Max-Forwards"
00265 #define MHD_HTTP_HEADER_PRAGMA "Pragma"
00266 #define MHD_HTTP_HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate"
00267 #define MHD_HTTP_HEADER_PROXY_AUTHORIZATION "Proxy-Authorization"
00268 #define MHD_HTTP_HEADER_RANGE "Range"
00269 #define MHD_HTTP_HEADER_REFERER "Referer"
00270 #define MHD_HTTP_HEADER_RETRY_AFTER "Retry-After"
00271 #define MHD_HTTP_HEADER_SERVER "Server"
00272 #define MHD_HTTP_HEADER_SET_COOKIE "Set-Cookie"
00273 #define MHD_HTTP_HEADER_SET_COOKIE2 "Set-Cookie2"
00274 #define MHD_HTTP_HEADER_TE "TE"
00275 #define MHD_HTTP_HEADER_TRAILER "Trailer"
00276 #define MHD_HTTP_HEADER_TRANSFER_ENCODING "Transfer-Encoding"
00277 #define MHD_HTTP_HEADER_UPGRADE "Upgrade"
00278 #define MHD_HTTP_HEADER_USER_AGENT "User-Agent"
00279 #define MHD_HTTP_HEADER_VARY "Vary"
00280 #define MHD_HTTP_HEADER_VIA "Via"
00281 #define MHD_HTTP_HEADER_WARNING "Warning"
00282 #define MHD_HTTP_HEADER_WWW_AUTHENTICATE "WWW-Authenticate"
00283
00288 #define MHD_HTTP_VERSION_1_0 "HTTP/1.0"
00289 #define MHD_HTTP_VERSION_1_1 "HTTP/1.1"
00290
00294 #define MHD_HTTP_METHOD_CONNECT "CONNECT"
00295 #define MHD_HTTP_METHOD_DELETE "DELETE"
00296 #define MHD_HTTP_METHOD_GET "GET"
00297 #define MHD_HTTP_METHOD_HEAD "HEAD"
00298 #define MHD_HTTP_METHOD_OPTIONS "OPTIONS"
00299 #define MHD_HTTP_METHOD_POST "POST"
00300 #define MHD_HTTP_METHOD_PUT "PUT"
00301 #define MHD_HTTP_METHOD_TRACE "TRACE"
00302
00307 #define MHD_HTTP_POST_ENCODING_FORM_URLENCODED "application/x-www-form-urlencoded"
00308 #define MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA "multipart/form-data"
00309
00320 enum MHD_FLAG
00321 {
00325 MHD_NO_FLAG = 0,
00326
00332 MHD_USE_DEBUG = 1,
00333
00337 MHD_USE_SSL = 2,
00338
00342 MHD_USE_THREAD_PER_CONNECTION = 4,
00343
00347 MHD_USE_SELECT_INTERNALLY = 8,
00348
00353 MHD_USE_IPv6 = 16,
00354
00364 MHD_USE_PEDANTIC_CHECKS = 32,
00365
00369 MHD_USE_POLL = 64,
00370
00377 MHD_SUPPRESS_DATE_NO_CLOCK = 128,
00378
00386 MHD_USE_NO_LISTEN_SOCKET = 256
00387
00388 };
00389
00390
00394 enum MHD_OPTION
00395 {
00396
00401 MHD_OPTION_END = 0,
00402
00407 MHD_OPTION_CONNECTION_MEMORY_LIMIT = 1,
00408
00413 MHD_OPTION_CONNECTION_LIMIT = 2,
00414
00420 MHD_OPTION_CONNECTION_TIMEOUT = 3,
00421
00434 MHD_OPTION_NOTIFY_COMPLETED = 4,
00435
00446 MHD_OPTION_PER_IP_CONNECTION_LIMIT = 5,
00447
00453 MHD_OPTION_SOCK_ADDR = 6,
00454
00476 MHD_OPTION_URI_LOG_CALLBACK = 7,
00477
00484 MHD_OPTION_HTTPS_MEM_KEY = 8,
00485
00492 MHD_OPTION_HTTPS_MEM_CERT = 9,
00493
00499 MHD_OPTION_HTTPS_CRED_TYPE = 10,
00500
00505 MHD_OPTION_HTTPS_PRIORITIES = 11,
00506
00513 MHD_OPTION_LISTEN_SOCKET = 12,
00514
00527 MHD_OPTION_EXTERNAL_LOGGER = 13,
00528
00537 MHD_OPTION_THREAD_POOL_SIZE = 14,
00538
00558 MHD_OPTION_ARRAY = 15,
00559
00578 MHD_OPTION_UNESCAPE_CALLBACK = 16,
00579
00589 MHD_OPTION_DIGEST_AUTH_RANDOM = 17,
00590
00596 MHD_OPTION_NONCE_NC_SIZE = 18,
00597
00602 MHD_OPTION_THREAD_STACK_SIZE = 19,
00603
00609 MHD_OPTION_HTTPS_MEM_TRUST =20
00610 };
00611
00612
00616 struct MHD_OptionItem
00617 {
00622 enum MHD_OPTION option;
00623
00629 intptr_t value;
00630
00635 void *ptr_value;
00636
00637 };
00638
00639
00644 enum MHD_ValueKind
00645 {
00646
00650 MHD_RESPONSE_HEADER_KIND = 0,
00651
00655 MHD_HEADER_KIND = 1,
00656
00661 MHD_COOKIE_KIND = 2,
00662
00671 MHD_POSTDATA_KIND = 4,
00672
00676 MHD_GET_ARGUMENT_KIND = 8,
00677
00681 MHD_FOOTER_KIND = 16
00682 };
00683
00684
00689 enum MHD_RequestTerminationCode
00690 {
00691
00695 MHD_REQUEST_TERMINATED_COMPLETED_OK = 0,
00696
00702 MHD_REQUEST_TERMINATED_WITH_ERROR = 1,
00703
00709 MHD_REQUEST_TERMINATED_TIMEOUT_REACHED = 2,
00710
00715 MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN = 3,
00716
00724 MHD_REQUEST_TERMINATED_READ_ERROR = 4
00725
00726 };
00727
00728
00733 enum MHD_ConnectionInfoType
00734 {
00739 MHD_CONNECTION_INFO_CIPHER_ALGO,
00740
00745 MHD_CONNECTION_INFO_PROTOCOL,
00746
00753 MHD_CONNECTION_INFO_CLIENT_ADDRESS,
00754
00758 MHD_CONNECTION_INFO_GNUTLS_SESSION,
00759
00766 MHD_CONNECTION_INFO_GNUTLS_CLIENT_CERT,
00767
00771 MHD_CONNECTION_INFO_DAEMON
00772
00773 };
00774
00775
00780 enum MHD_DaemonInfoType
00781 {
00788 MHD_DAEMON_INFO_KEY_SIZE,
00789
00796 MHD_DAEMON_INFO_MAC_KEY_SIZE,
00797
00802 MHD_DAEMON_INFO_LISTEN_FD
00803 };
00804
00805
00809 struct MHD_Daemon;
00810
00817 struct MHD_Connection;
00818
00822 struct MHD_Response;
00823
00827 struct MHD_PostProcessor;
00828
00829
00839 typedef
00840 void (*MHD_PanicCallback) (void *cls,
00841 const char *file,
00842 unsigned int line,
00843 const char *reason);
00844
00852 typedef int
00853 (*MHD_AcceptPolicyCallback) (void *cls,
00854 const struct sockaddr * addr,
00855 socklen_t addrlen);
00856
00857
00893 typedef int
00894 (*MHD_AccessHandlerCallback) (void *cls,
00895 struct MHD_Connection * connection,
00896 const char *url,
00897 const char *method,
00898 const char *version,
00899 const char *upload_data,
00900 size_t *upload_data_size,
00901 void **con_cls);
00902
00903
00915 typedef void
00916 (*MHD_RequestCompletedCallback) (void *cls,
00917 struct MHD_Connection * connection,
00918 void **con_cls,
00919 enum MHD_RequestTerminationCode toe);
00920
00921
00932 typedef int
00933 (*MHD_KeyValueIterator) (void *cls,
00934 enum MHD_ValueKind kind,
00935 const char *key, const char *value);
00936
00937
00985 typedef ssize_t
00986 (*MHD_ContentReaderCallback) (void *cls,
00987 uint64_t pos,
00988 char *buf,
00989 size_t max);
00990
00991
00998 typedef void
00999 (*MHD_ContentReaderFreeCallback) (void *cls);
01000
01001
01021 typedef int
01022 (*MHD_PostDataIterator) (void *cls,
01023 enum MHD_ValueKind kind,
01024 const char *key,
01025 const char *filename,
01026 const char *content_type,
01027 const char *transfer_encoding,
01028 const char *data,
01029 uint64_t off,
01030 size_t size);
01031
01032
01033
01050 struct MHD_Daemon *
01051 MHD_start_daemon_va (unsigned int options,
01052 uint16_t port,
01053 MHD_AcceptPolicyCallback apc, void *apc_cls,
01054 MHD_AccessHandlerCallback dh, void *dh_cls,
01055 va_list ap);
01056
01057
01073 struct MHD_Daemon *
01074 MHD_start_daemon (unsigned int flags,
01075 uint16_t port,
01076 MHD_AcceptPolicyCallback apc, void *apc_cls,
01077 MHD_AccessHandlerCallback dh, void *dh_cls,
01078 ...);
01079
01080
01086 void
01087 MHD_stop_daemon (struct MHD_Daemon *daemon);
01088
01089
01111 int
01112 MHD_add_connection (struct MHD_Daemon *daemon,
01113 int client_socket,
01114 const struct sockaddr *addr,
01115 socklen_t addrlen);
01116
01117
01131 int
01132 MHD_get_fdset (struct MHD_Daemon *daemon,
01133 fd_set *read_fd_set,
01134 fd_set *write_fd_set,
01135 fd_set *except_fd_set,
01136 int *max_fd);
01137
01138
01152 int MHD_get_timeout (struct MHD_Daemon *daemon,
01153 unsigned MHD_LONG_LONG *timeout);
01154
01155
01167 int
01168 MHD_run (struct MHD_Daemon *daemon);
01169
01170
01171
01172
01183 int
01184 MHD_get_connection_values (struct MHD_Connection *connection,
01185 enum MHD_ValueKind kind,
01186 MHD_KeyValueIterator iterator, void *iterator_cls);
01187
01188
01218 int
01219 MHD_set_connection_value (struct MHD_Connection *connection,
01220 enum MHD_ValueKind kind,
01221 const char *key,
01222 const char *value);
01223
01224
01240 void
01241 MHD_set_panic_func (MHD_PanicCallback cb, void *cls);
01242
01243
01253 const char *
01254 MHD_lookup_connection_value (struct MHD_Connection *connection,
01255 enum MHD_ValueKind kind,
01256 const char *key);
01257
01258
01269 int
01270 MHD_queue_response (struct MHD_Connection *connection,
01271 unsigned int status_code,
01272 struct MHD_Response *response);
01273
01274
01275
01276
01292 struct MHD_Response *
01293 MHD_create_response_from_callback (uint64_t size,
01294 size_t block_size,
01295 MHD_ContentReaderCallback crc, void *crc_cls,
01296 MHD_ContentReaderFreeCallback crfc);
01297
01298
01312 struct MHD_Response *
01313 MHD_create_response_from_data (size_t size,
01314 void *data,
01315 int must_free,
01316 int must_copy);
01317
01318
01323 enum MHD_ResponseMemoryMode {
01324
01330 MHD_RESPMEM_PERSISTENT,
01331
01337 MHD_RESPMEM_MUST_FREE,
01338
01345 MHD_RESPMEM_MUST_COPY
01346
01347 };
01348
01349
01359 struct MHD_Response *
01360 MHD_create_response_from_buffer (size_t size,
01361 void *buffer,
01362 enum MHD_ResponseMemoryMode mode);
01363
01364
01375 struct MHD_Response *
01376 MHD_create_response_from_fd (size_t size,
01377 int fd);
01378
01379
01395 struct MHD_Response *
01396 MHD_create_response_from_fd_at_offset (size_t size,
01397 int fd,
01398 off_t offset);
01399
01400
01424 typedef void (*MHD_UpgradeHandler)(void *cls,
01425 struct MHD_Connection *connection,
01426 void **con_cls,
01427 int upgrade_socket);
01428
01429 #if 0
01430
01459 struct MHD_Response *
01460 MHD_create_response_for_upgrade (MHD_UpgradeHandler upgrade_handler,
01461 void *upgrade_handler_cls);
01462 #endif
01463
01472 void MHD_destroy_response (struct MHD_Response *response);
01473
01474
01484 int
01485 MHD_add_response_header (struct MHD_Response *response,
01486 const char *header, const char *content);
01487
01488
01497 int
01498 MHD_add_response_footer (struct MHD_Response *response,
01499 const char *footer, const char *content);
01500
01501
01510 int
01511 MHD_del_response_header (struct MHD_Response *response,
01512 const char *header, const char *content);
01513
01523 int
01524 MHD_get_response_headers (struct MHD_Response *response,
01525 MHD_KeyValueIterator iterator, void *iterator_cls);
01526
01527
01535 const char *MHD_get_response_header (struct MHD_Response *response,
01536 const char *key);
01537
01538
01539
01540
01564 struct MHD_PostProcessor *
01565 MHD_create_post_processor (struct MHD_Connection *connection,
01566 size_t buffer_size,
01567 MHD_PostDataIterator iter, void *cls);
01568
01583 int
01584 MHD_post_process (struct MHD_PostProcessor *pp,
01585 const char *post_data, size_t post_data_len);
01586
01596 int
01597 MHD_destroy_post_processor (struct MHD_PostProcessor *pp);
01598
01599
01600
01601
01602
01607 #define MHD_INVALID_NONCE -1
01608
01609
01617 char *
01618 MHD_digest_auth_get_username (struct MHD_Connection *connection);
01619
01620
01633 int
01634 MHD_digest_auth_check (struct MHD_Connection *connection,
01635 const char *realm,
01636 const char *username,
01637 const char *password,
01638 unsigned int nonce_timeout);
01639
01640
01654 int
01655 MHD_queue_auth_fail_response (struct MHD_Connection *connection,
01656 const char *realm,
01657 const char *opaque,
01658 struct MHD_Response *response,
01659 int signal_stale);
01660
01661
01670 char *
01671 MHD_basic_auth_get_username_password (struct MHD_Connection *connection,
01672 char** password);
01673
01681 int
01682 MHD_queue_basic_auth_fail_response (struct MHD_Connection *connection,
01683 const char *realm,
01684 struct MHD_Response *response);
01685
01686
01687
01691 union MHD_ConnectionInfo
01692 {
01693
01697 int cipher_algorithm;
01698
01702 int protocol;
01703
01707 void * tls_session;
01708
01712 void * client_cert;
01713
01717 struct sockaddr *client_addr;
01718
01723 struct MHD_Daemon *daemon;
01724 };
01725
01735 const union MHD_ConnectionInfo *
01736 MHD_get_connection_info (struct MHD_Connection *connection,
01737 enum MHD_ConnectionInfoType infoType,
01738 ...);
01739
01740
01745 enum MHD_CONNECTION_OPTION
01746 {
01747
01753 MHD_CONNECTION_OPTION_TIMEOUT
01754
01755 };
01756
01757
01766 int
01767 MHD_set_connection_option (struct MHD_Connection *connection,
01768 enum MHD_CONNECTION_OPTION option,
01769 ...);
01770
01771
01775 union MHD_DaemonInfo
01776 {
01780 size_t key_size;
01781
01785 size_t mac_key_size;
01786
01790 int listen_fd;
01791 };
01792
01803 const union MHD_DaemonInfo *
01804 MHD_get_daemon_info (struct MHD_Daemon *daemon,
01805 enum MHD_DaemonInfoType infoType,
01806 ...);
01807
01808
01814 const char*
01815 MHD_get_version (void);
01816
01817 #if 0
01818 {
01819 #endif
01820 #ifdef __cplusplus
01821 }
01822 #endif
01823
01824 #endif