aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2014-05-26 10:27:52 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2014-05-26 10:27:52 +0300
commit992ae64c435e7126ecf02d8b8de803036eace2e3 (patch)
tree1fb02f7cdf91d987a7fb8f17dd57b1ac00205540
parent36972f8ca14aabc0984c0ad87e5d26bac1ce3f15 (diff)
downloadlibuvh-992ae64c435e7126ecf02d8b8de803036eace2e3.tar.gz
libuvh-992ae64c435e7126ecf02d8b8de803036eace2e3.zip
make symbols visible when building a shared library
-rw-r--r--src/uvh.c31
-rw-r--r--src/uvh.h59
2 files changed, 60 insertions, 30 deletions
diff --git a/src/uvh.c b/src/uvh.c
index 48416ee..aae6060 100644
--- a/src/uvh.c
+++ b/src/uvh.c
@@ -87,7 +87,7 @@ struct uvh_request_private
void *stream_userdata;
};
-struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
+UVH_EXTERN struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
uvh_request_handler_cb request_handler)
{
struct uvh_server_private *server;
@@ -130,14 +130,14 @@ error:
return NULL;
}
-void uvh_server_free(struct uvh_server *server)
+UVH_EXTERN void uvh_server_free(struct uvh_server *server)
{
struct uvh_server_private *p = container_of(server,
struct uvh_server_private, server);
free(p);
}
-int uvh_server_listen(struct uvh_server *server, const char *address,
+UVH_EXTERN int uvh_server_listen(struct uvh_server *server, const char *address,
short port)
{
struct uvh_server_private *serverp = container_of(server,
@@ -163,7 +163,7 @@ static void on_server_close(uv_handle_t *handle)
LOG_DEBUG("%s", __FUNCTION__);
}
-void uvh_server_stop(struct uvh_server *server)
+UVH_EXTERN void uvh_server_stop(struct uvh_server *server)
{
struct uvh_server_private *p;
@@ -582,7 +582,7 @@ static void uvh_request_write_sds(struct uvh_request *req, sds data,
uv_write(&wreq->wreq, (uv_stream_t *) &p->stream, &wreq->buf, 1, cb);
}
-void uvh_request_write(struct uvh_request *req,
+UVH_EXTERN void uvh_request_write(struct uvh_request *req,
const char *data, size_t len)
{
struct uvh_request_private *p = container_of(req,
@@ -596,7 +596,8 @@ void uvh_request_write(struct uvh_request *req,
p->send_body = sdscatlen(p->send_body, data, len);
}
-void uvh_request_writef(struct uvh_request *req, const char *fmt, ...)
+UVH_EXTERN void uvh_request_writef(struct uvh_request *req, const char *fmt,
+ ...)
{
struct uvh_request_private *p = container_of(req,
struct uvh_request_private, req);
@@ -618,7 +619,7 @@ void uvh_request_writef(struct uvh_request *req, const char *fmt, ...)
sdsfree(result);
}
-void uvh_request_write_status(struct uvh_request *req, int status)
+UVH_EXTERN void uvh_request_write_status(struct uvh_request *req, int status)
{
struct uvh_request_private *p = container_of(req,
struct uvh_request_private, req);
@@ -626,7 +627,7 @@ void uvh_request_write_status(struct uvh_request *req, int status)
p->send_status = status;
}
-void uvh_request_write_header(struct uvh_request *req,
+UVH_EXTERN void uvh_request_write_header(struct uvh_request *req,
const char *name, const char *value)
{
struct uvh_request_private *p = container_of(req,
@@ -638,7 +639,7 @@ void uvh_request_write_header(struct uvh_request *req,
p->send_headers = sdscatprintf(p->send_headers, "%s: %s\r\n", name, value);
}
-const char *http_status_code_str(int code)
+UVH_EXTERN const char *http_status_code_str(int code)
{
struct http_status_code_def *def = http_status_code_defs;
while (def->code != -1)
@@ -653,7 +654,7 @@ const char *http_status_code_str(int code)
return NULL;
}
-const char *uvh_request_get_header(struct uvh_request *req,
+UVH_EXTERN const char *uvh_request_get_header(struct uvh_request *req,
const char *name)
{
int i;
@@ -667,7 +668,7 @@ const char *uvh_request_get_header(struct uvh_request *req,
return NULL;
}
-void uvh_request_end(struct uvh_request *req)
+UVH_EXTERN void uvh_request_end(struct uvh_request *req)
{
LOG_DEBUG("%s", __FUNCTION__);
@@ -780,7 +781,7 @@ static void uvh_request_write_chunk(struct uvh_request *req, sds chunk)
uvh_request_write_sds(req, sdsnew("\r\n"), callback);
}
-void uvh_request_stream(struct uvh_request *req, uvh_stream_cb callback,
+UVH_EXTERN void uvh_request_stream(struct uvh_request *req, uvh_stream_cb cb,
void *data)
{
struct uvh_request_private *p = container_of(req,
@@ -789,15 +790,15 @@ void uvh_request_stream(struct uvh_request *req, uvh_stream_cb callback,
uvh_request_write_header(req, "Transfer-Encoding", "chunked");
p->streaming = 1;
- p->stream_cb = callback;
+ p->stream_cb = cb;
p->stream_userdata = data;
uvh_request_end(req);
- if (callback)
+ if (cb)
{
char *chunk;
- int chunklen = callback(&chunk, data);
+ int chunklen = cb(&chunk, data);
uvh_request_write_chunk(req, sdsnewlen(chunk, chunklen));
free(chunk);
}
diff --git a/src/uvh.h b/src/uvh.h
index fa2520a..ee94fdb 100644
--- a/src/uvh.h
+++ b/src/uvh.h
@@ -1,13 +1,37 @@
#ifndef UVH_H
#define UVH_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <uv.h>
+#ifdef _WIN32
+ /* Windows - set up dll import/export decorators. */
+# if defined(BUILDING_UVH_SHARED)
+ /* Building shared library. */
+# define UVH_EXTERN __declspec(dllexport)
+# elif defined(USING_UVH_SHARED)
+ /* Using shared library. */
+# define UVH_EXTERN __declspec(dllimport)
+# else
+ /* Building static library. */
+# define UVH_EXTERN /* nothing */
+# endif
+#elif __GNUC__ >= 4
+# define UVH_EXTERN __attribute__((visibility("default")))
+#else
+# define UVH_EXTERN /* nothing */
+#endif
+
+#ifndef UVH_MAX_HEADERS
#define UVH_MAX_HEADERS 50
+#endif
#define HTTP_STATUS_CODE_MAP(XX) \
XX(100, CONTINUE, "Continue") \
@@ -100,41 +124,46 @@ struct uvh_request
int content_length;
};
-struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
+UVH_EXTERN struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
uvh_request_handler_cb request_handler);
-void uvh_server_free(struct uvh_server *server);
+UVH_EXTERN void uvh_server_free(struct uvh_server *server);
-int uvh_server_listen(struct uvh_server *server, const char *address,
+UVH_EXTERN int uvh_server_listen(struct uvh_server *server, const char *address,
short port);
-void uvh_server_stop(struct uvh_server *server);
+UVH_EXTERN void uvh_server_stop(struct uvh_server *server);
-void uvh_request_write(struct uvh_request *req, const char *data,
+UVH_EXTERN void uvh_request_write(struct uvh_request *req, const char *data,
size_t len);
#ifdef __GNUC__
-void uvh_request_writef(struct uvh_request *req, const char *fmt, ...)
- __attribute__((format(printf, 2, 3)));
+UVH_EXTERN void uvh_request_writef(struct uvh_request *req, const char *fmt,
+ ...) __attribute__((format(printf, 2, 3)));
#else
-void uvh_request_writef(struct uvh_request *req, const char *fmt, ...);
+UVH_EXTERN void uvh_request_writef(struct uvh_request *req, const char *fmt,
+ ...);
#endif
-void uvh_request_write_status(struct uvh_request *req, int status);
+UVH_EXTERN void uvh_request_write_status(struct uvh_request *req, int status);
-void uvh_request_write_header(struct uvh_request *req,
+UVH_EXTERN void uvh_request_write_header(struct uvh_request *req,
const char *name, const char *value);
-const char *http_status_code_str(int code);
+UVH_EXTERN const char *http_status_code_str(int code);
-const char *uvh_request_get_header(struct uvh_request *req,
+UVH_EXTERN const char *uvh_request_get_header(struct uvh_request *req,
const char *name);
-void uvh_request_end(struct uvh_request *req);
+UVH_EXTERN void uvh_request_end(struct uvh_request *req);
typedef int (*uvh_stream_cb)(char **buffer, void *data);
-void uvh_request_stream(struct uvh_request *req, uvh_stream_cb callback,
- void *data);
+UVH_EXTERN void uvh_request_stream(struct uvh_request *req,
+ uvh_stream_cb callback, void *data);
+
+#ifdef __cplusplus
+}
+#endif
#endif /* UVH_H */