Commit 2d6305c3d6348431203efcb477726f7897d75fdf
1 parent
2dcc288a
changed class tool. Now multiple interface per class are supported as well as simple inheritence.
Showing
27 changed files
with
519 additions
and
430 deletions
include/cclass.h
deleted
100644 → 0
1 | -/** | |
2 | - * \file | |
3 | - * cclass.h: basic "class-like" handling of code and data structures | |
4 | - * Copyright (C) 2011 Georg Hopp | |
5 | - * | |
6 | - * This program is free software: you can redistribute it and/or modify | |
7 | - * it under the terms of the GNU General Public License as published by | |
8 | - * the Free Software Foundation, either version 3 of the License, or | |
9 | - * (at your option) any later version. | |
10 | - * | |
11 | - * This program is distributed in the hope that it will be useful, | |
12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | - * GNU General Public License for more details. | |
15 | - * | |
16 | - * You should have received a copy of the GNU General Public License | |
17 | - * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 | - */ | |
19 | - | |
20 | -#ifndef __CCLASS_H__ | |
21 | -#define __CCLASS_H__ | |
22 | - | |
23 | -#include <stdarg.h> | |
24 | -#include <sys/types.h> | |
25 | -#include <json/json.h> | |
26 | - | |
27 | -#define CCLASS_MAGIC 0xFEFE | |
28 | - | |
29 | - | |
30 | -typedef void (* ctor)(void *, va_list *); | |
31 | -typedef void (* clr)(void *); | |
32 | -typedef void (* dtor)(void *); | |
33 | -typedef void (* jCtor)(void *, struct json_object *); | |
34 | -typedef void (* jTo)(void *, struct json_object **); | |
35 | - | |
36 | -typedef struct _CCLASS { | |
37 | - const int magic; | |
38 | - size_t size; | |
39 | - ctor __construct; | |
40 | - clr __clear; | |
41 | - dtor __destruct; | |
42 | - jCtor __jsonConst; | |
43 | - jTo __toJson; | |
44 | -} * CCLASS; | |
45 | - | |
46 | -#define CCLASS_SIZE sizeof(struct _CCLASS) | |
47 | -#define CCLASS_PTR_SIZE sizeof(CCLASS) | |
48 | - | |
49 | -#define __construct(_class) \ | |
50 | - static void __construct(_class this, va_list * params) | |
51 | -#define __clear(_class) \ | |
52 | - static void __clear(_class this) | |
53 | -#define __destruct(_class) \ | |
54 | - static void __destruct(_class this) | |
55 | -#define __jsonConst(_class) \ | |
56 | - static void __jsonConst(_class this, struct json_object * json) | |
57 | -#define __toJson(_class) \ | |
58 | - static void __toJson(_class this, struct json_object ** json) | |
59 | - | |
60 | -#define CLASS(_class) \ | |
61 | - struct _##_class; \ | |
62 | - typedef struct _##_class * _class; \ | |
63 | - extern const CCLASS const __##_class; \ | |
64 | - struct _##_class | |
65 | - | |
66 | -#define INIT_CLASS(_class) \ | |
67 | - __construct(_class); \ | |
68 | - __clear(_class); \ | |
69 | - __destruct(_class); \ | |
70 | - __jsonConst(_class); \ | |
71 | - __toJson(_class); \ | |
72 | - static const struct _CCLASS _cclass = { \ | |
73 | - CCLASS_MAGIC, \ | |
74 | - sizeof(struct _##_class), \ | |
75 | - (ctor)__construct, \ | |
76 | - (clr)__clear, \ | |
77 | - (dtor)__destruct, \ | |
78 | - (jCtor)__jsonConst, \ | |
79 | - (jTo)__toJson \ | |
80 | - }; const CCLASS __##_class = (const CCLASS)&_cclass | |
81 | - | |
82 | -void * _new(const CCLASS _class, ...); | |
83 | -#define new(_class, ...) _new((__##_class), __VA_ARGS__) | |
84 | - | |
85 | -void * _newFromJson(const CCLASS _class, struct json_object * json); | |
86 | -#define newFromJson(_class, json) _newFromJson((__##_class), (json)) | |
87 | - | |
88 | -int _instanceOf(const CCLASS _class, void * _object); | |
89 | -#define instanceOf(_class, object) _instanceOf((__##_class), (object)) | |
90 | - | |
91 | -void clear(void * _object); | |
92 | -void delete(void * _object); | |
93 | -void toJson(void * _object, struct json_object ** json); | |
94 | -int isObject(void * _object); | |
95 | - | |
96 | -#endif//__CCLASS_H__ | |
97 | - | |
98 | -// vim: set et ts=4 sw=4: |
include/class.h
0 → 100644
1 | +#ifndef __CLASS_H__ | |
2 | +#define __CLASS_H__ | |
3 | + | |
4 | +#include <stdarg.h> | |
5 | +#include <sys/types.h> | |
6 | +#include <string.h> | |
7 | +#include <assert.h> | |
8 | + | |
9 | +#include "interface.h" | |
10 | + | |
11 | +#define _ISOC99_SOURCE | |
12 | + | |
13 | +#define CLASS_MAGIC 0xFEFE | |
14 | + | |
15 | +#define CLASS(name) \ | |
16 | + struct c_##name; \ | |
17 | + typedef struct c_##name * name; \ | |
18 | + extern struct class * const _##name; \ | |
19 | + struct c_##name | |
20 | + | |
21 | +#define EXTENDS(parent) \ | |
22 | + const char _[sizeof(struct c_##parent)] | |
23 | + | |
24 | +#define _NULL NULL | |
25 | +#define CREATE_CLASS(name,_parent,...) \ | |
26 | + static struct class c_##name; \ | |
27 | + static void _classInit_(void) { \ | |
28 | + c_##name.parent = _##_parent; \ | |
29 | + c_##name.init = NULL; \ | |
30 | + } \ | |
31 | + static struct class c_##name = { \ | |
32 | + CLASS_MAGIC, \ | |
33 | + NULL, \ | |
34 | + sizeof(struct c_##name), \ | |
35 | + _classInit_, \ | |
36 | + INIT_IMPL(__VA_ARGS__) \ | |
37 | + }; struct class * const _##name = &c_##name | |
38 | + | |
39 | +/** | |
40 | + * @TODO: actually i use gcc feature ## for variadoc... think about | |
41 | + * a way to make this standard. | |
42 | + */ | |
43 | +#define CALL(object,_iface,method,...) \ | |
44 | + do { \ | |
45 | + class_ptr class = class_getClass((object)); \ | |
46 | + struct i_##_iface * iface; \ | |
47 | + if (class->init) class->init(); \ | |
48 | + iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | |
49 | + while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ | |
50 | + class = class->parent; \ | |
51 | + if (class->init) class->init(); \ | |
52 | + iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | |
53 | + }; \ | |
54 | + assert(NULL != iface->method); \ | |
55 | + iface->method(object, ##__VA_ARGS__); \ | |
56 | + } while(0) | |
57 | + | |
58 | + | |
59 | +#define IFACE_GET(class,iface) (interfaceGet(&((class)->impl),(iface))) | |
60 | +#define IFACE_EXISTS(class,iface) (NULL != IFACE_GET((class),(iface))) | |
61 | + | |
62 | +#define HAS_PARENT(class) (NULL != ((class)->parent)) | |
63 | + | |
64 | +typedef void (* fptr_classInit)(void); | |
65 | + | |
66 | +struct class; | |
67 | +typedef struct class * class_ptr; | |
68 | +struct class { | |
69 | + const int magic; | |
70 | + class_ptr parent; | |
71 | + size_t object_size; | |
72 | + fptr_classInit init; | |
73 | + struct iface_impl impl; | |
74 | +}; | |
75 | + | |
76 | +extern inline void * class_getInterface(class_ptr *, iface_ptr); | |
77 | +extern inline class_ptr class_getClass(void *); | |
78 | + | |
79 | +#endif // __CLASS_H__ | |
80 | + | |
81 | +// vim: set ts=4 sw=4: | ... | ... |
include/interface.h
0 → 100644
1 | +#ifndef __INTERFACE_H__ | |
2 | +#define __INTERFACE_H__ | |
3 | + | |
4 | +#include <sys/types.h> | |
5 | + | |
6 | +#define MAX_IFACE 32 // ATTENTION: every iface_impl will use MAX_IFACE * sizeof(void*) | |
7 | + | |
8 | +#define IFACE(name) ((const struct i_##name const*)&i_##name##_impl) | |
9 | + | |
10 | +#define INIT_IFACE(name,...) \ | |
11 | + static const struct i_##name i_##name##_impl = {&i_##name,__VA_ARGS__} | |
12 | + | |
13 | +#define NUMARGS(...) (sizeof((const void*[]){__VA_ARGS__})/sizeof(void*)) | |
14 | + | |
15 | +#define INIT_IMPL(...) {NUMARGS(__VA_ARGS__), 0, {__VA_ARGS__}} | |
16 | +#define CREATE_IMPL(...) \ | |
17 | + static struct iface_impl iface_impl = INIT_IMPL(__VA_ARGS__) | |
18 | + | |
19 | +#define METHOD_GET(iface,method) (iface->method) | |
20 | + | |
21 | + | |
22 | +struct interface { | |
23 | + const char * name; | |
24 | + const size_t nmethods; | |
25 | +}; | |
26 | +typedef const struct interface * iface_ptr; | |
27 | + | |
28 | +struct iface_impl { | |
29 | + const size_t nimpl; // number of interface implementations | |
30 | + char simpl; // implementations sorted?? | |
31 | + const void * impl[MAX_IFACE]; // implementations | |
32 | +}; | |
33 | +typedef struct iface_impl * iface_impl_ptr; | |
34 | + | |
35 | +extern struct interface * interfaceGet(iface_impl_ptr, const iface_ptr); | |
36 | + | |
37 | +#endif // __INTERFACE_H__ | |
38 | + | |
39 | +// vim: set ts=4 sw=4: | ... | ... |
include/interface/class.h
0 → 100644
1 | +#ifndef __INTERFACE_CLASS_H__ | |
2 | +#define __INTERFACE_CLASS_H__ | |
3 | + | |
4 | +#include <stdarg.h> | |
5 | + | |
6 | +#include "class.h" | |
7 | +#include "interface.h" | |
8 | + | |
9 | +typedef void (* fptr_ctor)(void *, va_list *); | |
10 | +typedef void (* fptr_dtor)(void *); | |
11 | +typedef void (* fptr_clone)(void *, const void * const); | |
12 | + | |
13 | +extern const struct interface i_Class; | |
14 | + | |
15 | +struct i_Class { | |
16 | + const struct interface * const _; | |
17 | + fptr_ctor ctor; | |
18 | + fptr_dtor dtor; | |
19 | + fptr_clone clone; | |
20 | +}; | |
21 | + | |
22 | +extern inline void * classNew(class_ptr, ...); | |
23 | +extern inline void classDelete(void **); | |
24 | + | |
25 | +#define new(class,...) classNew(_##class, __VA_ARGS__) | |
26 | +#define delete(object) classDelete((void **)(object)) | |
27 | + | |
28 | +#endif // __INTERFACE_CLASS_H__ | |
29 | + | |
30 | +// vim: set ts=4 sw=4: | ... | ... |
include/interface/logger.h
0 → 100644
1 | +#ifndef __INTERFACE_LOGGER_H__ | |
2 | +#define __INTERFACE_LOGGER_H__ | |
3 | + | |
4 | +#include <stdarg.h> | |
5 | + | |
6 | +#include "interface.h" | |
7 | +#include "logger.h" | |
8 | + | |
9 | +typedef void (* fptr_log)(void *, logger_level, const char * const); | |
10 | + | |
11 | +extern const struct interface i_Logger; | |
12 | + | |
13 | +struct i_Logger { | |
14 | + const struct interface * const _; | |
15 | + fptr_log log; | |
16 | +}; | |
17 | + | |
18 | +extern inline void loggerLog(void *, logger_level, const char * const, ...); | |
19 | + | |
20 | +#endif // __INTERFACE_LOGGER_H__ | |
21 | + | |
22 | +// vim: set ts=4 sw=4: | ... | ... |
1 | 1 | #ifndef __LOGGER_H__ |
2 | 2 | #define __LOGGER_H__ |
3 | 3 | |
4 | -#include "cclass.h" | |
5 | - | |
6 | - | |
7 | -#define LOGGER_EMERG 0 | |
8 | -#define LOGGER_ALERT 1 | |
9 | -#define LOGGER_CRIT 2 | |
10 | -#define LOGGER_ERR 3 | |
11 | -#define LOGGER_WARNING 4 | |
12 | -#define LOGGER_NOTICE 5 | |
13 | -#define LOGGER_INFO 6 | |
14 | -#define LOGGER_DEBUG 7 | |
15 | - | |
16 | -#define MAX_LOG_FNCTS 10 | |
17 | - | |
18 | - | |
19 | -typedef void (*logger_logfnct)(int level, const char * msg); | |
20 | - | |
21 | - | |
22 | -CLASS(LOGGER) { | |
23 | - logger_logfnct logfncts[MAX_LOG_FNCTS]; | |
24 | - unsigned int logfncts_count; | |
4 | +#include "class.h" | |
5 | + | |
6 | +typedef enum logger_level { | |
7 | + LOGGER_DEBUG=0, | |
8 | + LOGGER_INFO, | |
9 | + LOGGER_NOTICE, | |
10 | + LOGGER_WARNING, | |
11 | + LOGGER_ERR, | |
12 | + LOGGER_CRIT, | |
13 | + LOGGER_ALERT, | |
14 | + LOGGER_EMERG | |
15 | +} logger_level; | |
16 | + | |
17 | +extern const char * const logger_level_str[]; | |
18 | + | |
19 | +CLASS(Logger) { | |
20 | + logger_level min_level; | |
25 | 21 | }; |
26 | 22 | |
27 | -void logger_log(LOGGER this, int level, const char * msg, ...) | |
28 | - __attribute__((format (printf, 3, 4))); | |
23 | +CLASS(LoggerStderr) { | |
24 | + EXTENDS(Logger); | |
25 | +}; | |
29 | 26 | |
30 | -void logger_add(LOGGER this, logger_logfnct logfunc); | |
27 | +CLASS(LoggerSyslog) { | |
28 | + EXTENDS(Logger); | |
29 | +}; | |
31 | 30 | |
32 | -#endif /* __LOGGER_H__ */ | |
31 | +#endif // __LOGGER_H__ | |
33 | 32 | |
34 | 33 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -4,9 +4,9 @@ |
4 | 4 | #include <stdio.h> /* for printf() and fprintf() */ |
5 | 5 | #include <poll.h> /* for select system call and related */ |
6 | 6 | |
7 | +#include "class.h" | |
7 | 8 | #include "socket.h" |
8 | 9 | #include "logger.h" |
9 | -#include "cclass.h" | |
10 | 10 | |
11 | 11 | #define POLL_FD_NSIZE 1024 |
12 | 12 | #define POLL_FD_SIZE (sizeof(struct pollfd) * POLL_FD_NSIZE) |
... | ... | @@ -23,14 +23,14 @@ |
23 | 23 | |
24 | 24 | typedef void (*server_read_hook)(const char *, size_t); |
25 | 25 | |
26 | -CLASS(SERVER) { | |
27 | - LOGGER logger; | |
28 | - SOCK sock; | |
26 | +CLASS(Server) { | |
27 | + Logger logger; | |
28 | + Sock sock; | |
29 | 29 | nfds_t nfds; |
30 | 30 | struct pollfd fds[POLL_FD_NSIZE]; |
31 | 31 | |
32 | 32 | struct { |
33 | - SOCK sock; | |
33 | + Sock sock; | |
34 | 34 | char * wbuf; |
35 | 35 | char * rbuf; |
36 | 36 | unsigned int rpos; |
... | ... | @@ -40,8 +40,8 @@ CLASS(SERVER) { |
40 | 40 | server_read_hook read_hook; |
41 | 41 | }; |
42 | 42 | |
43 | -void server_run(SERVER this); | |
44 | -void server_close_conn(SERVER this, unsigned int handle); | |
43 | +void serverRun(Server this); | |
44 | +void serverCloseConn(Server this, unsigned int handle); | |
45 | 45 | |
46 | 46 | #endif // __SERVER_H__ |
47 | 47 | ... | ... |
1 | 1 | #ifndef __SOCKET_H__ |
2 | 2 | #define __SOCKET_H__ |
3 | 3 | |
4 | -#include <arpa/inet.h> /* for in_port_t */ | |
4 | +#include <arpa/inet.h> /* for in_port_t */ | |
5 | 5 | |
6 | +#include "class.h" | |
6 | 7 | #include "logger.h" |
7 | -#include "cclass.h" | |
8 | 8 | |
9 | - | |
10 | -CLASS(SOCK) { | |
11 | - LOGGER logger; | |
9 | +CLASS(Sock) { | |
10 | + Logger log; | |
12 | 11 | in_port_t port; |
13 | 12 | struct sockaddr_in addr; |
14 | - int handle; /* socket handle for server */ | |
13 | + int handle; | |
15 | 14 | }; |
16 | 15 | |
17 | -void sock_connect(SOCK this, const char * addr); | |
18 | -void sock_listen(SOCK this, int backlog); | |
19 | -SOCK sock_accept(SOCK this, char remoteAddr[16]); | |
16 | +void socketConnect(Sock this, const char * addr); | |
17 | +void socketListen(Sock this, int backlog); | |
18 | +Sock socketAccept(Sock this, char remoteAddr[16]); | |
20 | 19 | |
21 | -#endif /* __SOCKET_H__ */ | |
20 | +#endif // __SOCKET_H__ | |
22 | 21 | |
23 | 22 | // vim: set ts=4 sw=4: |
23 | + | ... | ... |
src/cclass.c
deleted
100644 → 0
1 | -/** | |
2 | - * \file | |
3 | - * cclass.c: basic "class-like" handling of code and data structures | |
4 | - * Copyright (C) 2011 Georg Hopp | |
5 | - * | |
6 | - * This program is free software: you can redistribute it and/or modify | |
7 | - * it under the terms of the GNU General Public License as published by | |
8 | - * the Free Software Foundation, either version 3 of the License, or | |
9 | - * (at your option) any later version. | |
10 | - * | |
11 | - * This program is distributed in the hope that it will be useful, | |
12 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | - * GNU General Public License for more details. | |
15 | - * | |
16 | - * You should have received a copy of the GNU General Public License | |
17 | - * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 | - */ | |
19 | - | |
20 | -#include <stdarg.h> | |
21 | -#include <string.h> | |
22 | -#include <stdlib.h> | |
23 | -#include <json/json.h> | |
24 | - | |
25 | -#include "cclass.h" | |
26 | - | |
27 | -#undef __construct | |
28 | -#undef __clear | |
29 | -#undef __destruct | |
30 | -#undef __jsonConst | |
31 | -#undef __toJson | |
32 | - | |
33 | -void * | |
34 | -_new(const CCLASS _class, ...) | |
35 | -{ | |
36 | - const CCLASS class = _class; | |
37 | - void * object = calloc(1, class->size + sizeof(void *)); | |
38 | - | |
39 | - * (const struct _CCLASS **)object = class; | |
40 | - object += sizeof(CCLASS); | |
41 | - | |
42 | - if (class->__construct) { | |
43 | - va_list params; | |
44 | - | |
45 | - va_start(params, _class); | |
46 | - class->__construct(object, ¶ms); | |
47 | - va_end(params); | |
48 | - } | |
49 | - | |
50 | - return object; | |
51 | -} | |
52 | - | |
53 | -void * | |
54 | -_newFromJson(const CCLASS _class, struct json_object * json) | |
55 | -{ | |
56 | - const CCLASS class = _class; | |
57 | - void * object = calloc(1, class->size + sizeof(CCLASS)); | |
58 | - | |
59 | - * (const struct _CCLASS **) object = class; | |
60 | - object += sizeof(CCLASS); | |
61 | - | |
62 | - if (class->__jsonConst && json) { | |
63 | - class->__jsonConst(object, json); | |
64 | - } | |
65 | - | |
66 | - return object; | |
67 | -} | |
68 | - | |
69 | -int | |
70 | -_instanceOf(const CCLASS _class, void * _object) | |
71 | -{ | |
72 | - const CCLASS * class = _object - sizeof(CCLASS); | |
73 | - | |
74 | - return (class && _class == *class); | |
75 | -} | |
76 | - | |
77 | - | |
78 | -void | |
79 | -clear(void * _object) | |
80 | -{ | |
81 | - const CCLASS * class = _object - sizeof(CCLASS); | |
82 | - | |
83 | - if (_object && *class && (*class)->__clear) { | |
84 | - (*class)->__clear(_object); | |
85 | - } | |
86 | -} | |
87 | - | |
88 | -void | |
89 | -delete(void ** _object) | |
90 | -{ | |
91 | - const CCLASS * class = (*_object) - sizeof(CCLASS); | |
92 | - | |
93 | - if (*_object && *class && (*class)->__destruct) { | |
94 | - (*class)->__destruct(*_object); | |
95 | - } | |
96 | - | |
97 | - free((void *)class); | |
98 | - *_object = NULL; | |
99 | -} | |
100 | - | |
101 | -void | |
102 | -toJson(void * _object, struct json_object ** json) | |
103 | -{ | |
104 | - const CCLASS * class = _object - sizeof(CCLASS); | |
105 | - | |
106 | - if (_object && *class && (*class)->__toJson) { | |
107 | - (*class)->__toJson(_object, json); | |
108 | - } | |
109 | -} | |
110 | - | |
111 | -int | |
112 | -isObject(void * _object) | |
113 | -{ | |
114 | - const CCLASS * class = _object - sizeof(CCLASS); | |
115 | - | |
116 | - return (_object && (*class) && CCLASS_MAGIC == (*class)->magic); | |
117 | -} | |
118 | - | |
119 | -// vim: set et ts=4 sw=4: |
src/class.c
0 → 100644
1 | +#include <stdarg.h> | |
2 | +#include <stdlib.h> | |
3 | + | |
4 | +#include "class.h" | |
5 | +#include "interface.h" | |
6 | + | |
7 | +inline | |
8 | +void * | |
9 | +class_getInterface(class_ptr * class, iface_ptr _iface) | |
10 | +{ | |
11 | + void * iface = (void *)IFACE_GET(*class, _iface); | |
12 | + | |
13 | + while(NULL == iface && HAS_PARENT(*class)) { | |
14 | + *class = (*class)->parent; | |
15 | + iface = (void *)IFACE_GET(*class, _iface); | |
16 | + } | |
17 | + | |
18 | + return iface; | |
19 | +} | |
20 | + | |
21 | +inline | |
22 | +class_ptr | |
23 | +class_getClass(void * object) | |
24 | +{ | |
25 | + return *(class_ptr *)(object - sizeof(void*)); | |
26 | +} | |
27 | + | |
28 | +// vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -17,7 +17,7 @@ void daemonize(void) { |
17 | 17 | setsid(); |
18 | 18 | |
19 | 19 | /* connect all standard streams to /dev/null */ |
20 | - freopen("/dev/null", "w", stderr); | |
21 | - freopen("/dev/null", "r", stdin); | |
22 | - freopen("/dev/null", "w", stdout); | |
20 | + stderr = freopen("/dev/null", "w", stderr); | |
21 | + stdin = freopen("/dev/null", "r", stdin); | |
22 | + stdout = freopen("/dev/null", "w", stdout); | |
23 | 23 | } | ... | ... |
src/interface.c
0 → 100644
1 | +#include <sys/types.h> | |
2 | +#include <stdlib.h> | |
3 | + | |
4 | +#include "interface.h" | |
5 | + | |
6 | +#ifndef TRUE | |
7 | +#define TRUE 1 | |
8 | +#endif // TRUE | |
9 | + | |
10 | +static | |
11 | +inline | |
12 | +int | |
13 | +comp(const void * _a, const void * _b) | |
14 | +{ | |
15 | + const struct interface * a = **(const struct interface ***)_a; | |
16 | + const struct interface * b = **(const struct interface ***)_b; | |
17 | + return ((a)<(b))? -1 : ((a)>(b))? 1 : 0; | |
18 | +} | |
19 | + | |
20 | +/** | |
21 | + * this one is important in selector functions to get the correct interface | |
22 | + * implementation of a class. | |
23 | + */ | |
24 | +struct interface * | |
25 | +interfaceGet(iface_impl_ptr iface_impl, const iface_ptr _iface) | |
26 | +{ | |
27 | + const iface_ptr * iface = &_iface; | |
28 | + void * dummy; | |
29 | + | |
30 | + if (! iface_impl->simpl) { | |
31 | + qsort((void**)(iface_impl->impl), iface_impl->nimpl, sizeof(iface_ptr), comp); | |
32 | + iface_impl->simpl=TRUE; | |
33 | + } | |
34 | + | |
35 | + dummy = bsearch( | |
36 | + &iface, | |
37 | + iface_impl->impl, | |
38 | + iface_impl->nimpl, | |
39 | + sizeof(iface_ptr), | |
40 | + comp); | |
41 | + | |
42 | + return dummy? *(struct interface **)dummy : dummy; | |
43 | +} | |
44 | + | |
45 | +// vim: set ts=4 sw=4: | ... | ... |
src/interface/class.c
0 → 100644
1 | +#include <stdarg.h> | |
2 | +#include <stdlib.h> | |
3 | +#include <assert.h> | |
4 | + | |
5 | +#include "class.h" | |
6 | +#include "interface/class.h" | |
7 | + | |
8 | +const | |
9 | +struct interface i_Class = { | |
10 | + "class", | |
11 | + 3 | |
12 | +}; | |
13 | + | |
14 | +inline | |
15 | +void * | |
16 | +classNew(class_ptr class, ...) | |
17 | +{ | |
18 | + void * object = calloc(1, class->object_size + sizeof(void*)); | |
19 | + va_list params; | |
20 | + | |
21 | + if (class->init) class->init(); | |
22 | + | |
23 | + * (class_ptr *)object = class; | |
24 | + object += sizeof(void*); | |
25 | + | |
26 | + va_start(params, class); | |
27 | + CALL(object, Class, ctor, ¶ms); | |
28 | + va_end(params); | |
29 | + | |
30 | + return object; | |
31 | +} | |
32 | + | |
33 | +inline | |
34 | +void | |
35 | +classDelete(void ** object) | |
36 | +{ | |
37 | + CALL(*object, Class, dtor); | |
38 | + | |
39 | + free(*object - sizeof(void*)); | |
40 | + *object = NULL; | |
41 | +} | |
42 | + | |
43 | +// vim: set ts=4 sw=4: | ... | ... |
src/interface/logger.c
0 → 100644
1 | +#include <stdlib.h> | |
2 | + | |
3 | +#include "logger.h" | |
4 | +#include "interface/logger.h" | |
5 | + | |
6 | +const struct interface i_Logger = { | |
7 | + "logger", | |
8 | + 1 | |
9 | +}; | |
10 | + | |
11 | +inline | |
12 | +void | |
13 | +loggerLog(void * _object, logger_level level, const char * const fmt, ...) { | |
14 | + Logger object = _object; | |
15 | + | |
16 | + if (level >= object->min_level) { | |
17 | + char * msg = NULL; | |
18 | + size_t msg_size = 0; | |
19 | + va_list params; | |
20 | + | |
21 | + va_start(params, fmt); | |
22 | + msg_size = vsnprintf(msg, msg_size, fmt, params); | |
23 | + va_end(params); | |
24 | + | |
25 | + msg = malloc(msg_size + 1); | |
26 | + | |
27 | + va_start(params, fmt); | |
28 | + vsnprintf(msg, msg_size + 1, fmt, params); | |
29 | + va_end(params); | |
30 | + | |
31 | + CALL(_object, Logger, log, level, msg); | |
32 | + | |
33 | + free(msg); | |
34 | + } | |
35 | +} | |
36 | + | |
37 | +// vim: set ts=4 sw=4: | ... | ... |
1 | -#include "logger.h" | |
1 | +#include <stdarg.h> | |
2 | 2 | |
3 | -extern void logger_syslog(int level, const char * msg); | |
3 | +#include "logger.h" | |
4 | +#include "interface/class.h" | |
5 | +#include "interface/logger.h" | |
4 | 6 | |
5 | -INIT_CLASS(LOGGER); | |
7 | +const | |
8 | +char * const | |
9 | +logger_level_str[] = { | |
10 | + "DEBUG", | |
11 | + "INFO", | |
12 | + "NOTICE", | |
13 | + "WARNING", | |
14 | + "ERR", | |
15 | + "CRIT", | |
16 | + "ALERT", | |
17 | + "EMERG" | |
18 | +}; | |
6 | 19 | |
7 | -__construct(LOGGER) | |
20 | +static | |
21 | +void | |
22 | +ctor(void * _this, va_list * params) | |
8 | 23 | { |
9 | - this->logfncts[0] = logger_syslog; | |
10 | - this->logfncts_count = 1; | |
24 | + Logger this = _this; | |
25 | + this->min_level = va_arg(*params, int); | |
11 | 26 | } |
12 | 27 | |
13 | -__destruct(LOGGER) {} | |
14 | -__jsonConst(LOGGER) {} | |
15 | -__toJson(LOGGER) {} | |
16 | -__clear(LOGGER) {} | |
28 | +static void dtor(void * _this) {} | |
29 | + | |
30 | +INIT_IFACE(Class, ctor, dtor, NULL); | |
31 | +CREATE_CLASS(Logger, NULL, IFACE(Class)); | |
17 | 32 | |
18 | 33 | // vim: set ts=4 sw=4: | ... | ... |
src/logger/add.c
deleted
100644 → 0
src/logger/log.c
deleted
100644 → 0
1 | -#define _ISOC99_SOURCE | |
2 | - | |
3 | -#include <stdio.h> | |
4 | -#include <string.h> | |
5 | - | |
6 | -#include "logger.h" | |
7 | - | |
8 | -void | |
9 | -logger_log(LOGGER this, int level, const char * message, ...) { | |
10 | - va_list args; | |
11 | - char buffer[1025]; | |
12 | - logger_logfnct * logfnct; | |
13 | - | |
14 | - int maxBuf = sizeof(buffer)/sizeof(buffer[0]); | |
15 | - | |
16 | - memset(buffer, 0, maxBuf); | |
17 | - | |
18 | - va_start(args, message); | |
19 | - vsnprintf(buffer, 1024, message, args); | |
20 | - va_end(args); | |
21 | - | |
22 | - logfnct = this->logfncts; | |
23 | - | |
24 | - while (NULL != *logfnct) { | |
25 | - (*logfnct)(level, buffer); | |
26 | - logfnct++; | |
27 | - } | |
28 | -} | |
29 | - | |
30 | -// vim: set ts=4 sw=4: |
src/logger/stderr.c
0 → 100644
1 | +#include <stdio.h> | |
2 | + | |
3 | +#include "logger.h" | |
4 | +#include "interface/logger.h" | |
5 | + | |
6 | +static | |
7 | +void | |
8 | +logStderr(void * this, logger_level level, const char * const msg) | |
9 | +{ | |
10 | + fprintf(stderr, "[%s] %s\n", logger_level_str[level], msg); | |
11 | +} | |
12 | + | |
13 | +INIT_IFACE(Logger, logStderr); | |
14 | +CREATE_CLASS(LoggerStderr, Logger, IFACE(Logger)); | |
15 | + | |
16 | +// vim: set ts=4 sw=4: | ... | ... |
1 | 1 | #include <syslog.h> |
2 | 2 | |
3 | -const int priority[] = { | |
4 | - LOG_USER | LOG_EMERG, | |
5 | - LOG_USER | LOG_ALERT, | |
6 | - LOG_USER | LOG_CRIT, | |
7 | - LOG_USER | LOG_ERR, | |
8 | - LOG_USER | LOG_WARNING, | |
9 | - LOG_USER | LOG_NOTICE, | |
10 | - LOG_USER | LOG_INFO, | |
11 | - LOG_USER | LOG_DEBUG | |
3 | +#include "logger.h" | |
4 | +#include "interface/logger.h" | |
5 | + | |
6 | +static | |
7 | +const | |
8 | +int syslog_priority[] = { | |
9 | + LOG_USER | LOG_DEBUG, | |
10 | + LOG_USER | LOG_INFO, | |
11 | + LOG_USER | LOG_NOTICE, | |
12 | + LOG_USER | LOG_WARNING, | |
13 | + LOG_USER | LOG_ERR, | |
14 | + LOG_USER | LOG_CRIT, | |
15 | + LOG_USER | LOG_ALERT, | |
16 | + LOG_USER | LOG_EMERG | |
12 | 17 | }; |
13 | 18 | |
19 | +static | |
14 | 20 | void |
15 | -logger_syslog(int level, const char * msg) | |
21 | +logSyslog(void * this, logger_level level, const char * const msg) | |
16 | 22 | { |
17 | - syslog(priority[level], "%s", msg); | |
23 | + syslog(syslog_priority[level], "[%s] %s", logger_level_str[level], msg); | |
18 | 24 | } |
19 | 25 | |
26 | +INIT_IFACE(Logger, logSyslog); | |
27 | +CREATE_CLASS(LoggerSyslog, Logger, IFACE(Logger)); | |
28 | + | |
20 | 29 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -2,34 +2,38 @@ |
2 | 2 | #include <string.h> /* for memset and stuff */ |
3 | 3 | #include <stdlib.h> /* for getopt */ |
4 | 4 | |
5 | +#include "class.h" | |
5 | 6 | #include "server.h" |
6 | 7 | #include "socket.h" |
7 | -#include "server.h" | |
8 | 8 | #include "logger.h" |
9 | -#include "cclass.h" | |
10 | - | |
11 | -INIT_CLASS(SERVER); | |
9 | +#include "interface/class.h" | |
12 | 10 | |
13 | -__construct(SERVER) | |
11 | +static | |
12 | +void | |
13 | +ctor(void * _this, va_list * params) | |
14 | 14 | { |
15 | + Server this = _this; | |
15 | 16 | in_port_t port; |
16 | 17 | unsigned int backlog; |
17 | 18 | |
18 | - this->logger = va_arg(* params, LOGGER); | |
19 | + this->logger = va_arg(* params, Logger); | |
19 | 20 | port = va_arg(* params, int); |
20 | 21 | backlog = va_arg(* params, unsigned int); |
21 | 22 | |
22 | - this->sock = new(SOCK, this->logger, port); | |
23 | - sock_listen(this->sock, backlog); | |
23 | + this->sock = new(Sock, this->logger, port); | |
24 | + socketListen(this->sock, backlog); | |
24 | 25 | |
25 | 26 | (this->fds)[0].fd = this->sock->handle; |
26 | 27 | (this->fds)[0].events = POLLIN; |
27 | 28 | this->nfds = 1; |
28 | 29 | } |
29 | 30 | |
30 | -__destruct(SERVER) | |
31 | +static | |
32 | +void | |
33 | +dtor(void * _this) | |
31 | 34 | { |
32 | - int i; | |
35 | + Server this = _this; | |
36 | + int i; | |
33 | 37 | |
34 | 38 | for (i=1; i<this->nfds; i++) { |
35 | 39 | /* |
... | ... | @@ -41,8 +45,7 @@ __destruct(SERVER) |
41 | 45 | delete(&this->sock); |
42 | 46 | } |
43 | 47 | |
44 | -__jsonConst(SERVER) {} | |
45 | -__toJson(SERVER) {} | |
46 | -__clear(SERVER) {} | |
48 | +INIT_IFACE(Class, ctor, dtor, NULL); | |
49 | +CREATE_CLASS(Server, NULL, IFACE(Class)); | |
47 | 50 | |
48 | 51 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -4,17 +4,18 @@ |
4 | 4 | #include <errno.h> /* for errno */ |
5 | 5 | #include <unistd.h> |
6 | 6 | |
7 | -#include "include/logger.h" | |
8 | -#include "include/server.h" | |
9 | -#include "include/socket.h" | |
10 | -#include "include/signalHandling.h" | |
7 | +#include "server.h" | |
8 | +#include "socket.h" | |
9 | +#include "logger.h" | |
10 | +#include "signalHandling.h" | |
11 | +#include "interface/class.h" | |
11 | 12 | |
12 | 13 | #undef MAX |
13 | 14 | #define MAX(x,y) ((x) > (y) ? (x) : (y)) |
14 | 15 | |
15 | 16 | static |
16 | 17 | int |
17 | -server_poll(SERVER this) { | |
18 | +serverPoll(Server this) { | |
18 | 19 | int events; |
19 | 20 | |
20 | 21 | /* |
... | ... | @@ -30,7 +31,7 @@ server_poll(SERVER this) { |
30 | 31 | /* Fallthrough */ |
31 | 32 | |
32 | 33 | case EINTR: |
33 | - logger_log(this->logger, LOGGER_CRIT, | |
34 | + loggerLog(this->logger, LOGGER_CRIT, | |
34 | 35 | "poll systemcall failed: [%s] - service terminated", |
35 | 36 | strerror(errno)); |
36 | 37 | //exit(EXIT_FAILURE); /* @TODO do real shutdown here */ |
... | ... | @@ -42,13 +43,13 @@ server_poll(SERVER this) { |
42 | 43 | |
43 | 44 | static |
44 | 45 | void |
45 | -server_handle_accept(SERVER this) | |
46 | +serverHandleAccept(Server this) | |
46 | 47 | { |
47 | 48 | if (0 != ((this->fds)[0].revents & POLLIN)) { |
48 | 49 | char remoteAddr[16] = ""; |
49 | - SOCK acc; | |
50 | + Sock acc; | |
50 | 51 | |
51 | - acc = sock_accept(this->sock, remoteAddr); | |
52 | + acc = socketAccept(this->sock, remoteAddr); | |
52 | 53 | |
53 | 54 | if (-1 != acc->handle) { |
54 | 55 | (this->conns)[this->nfds].sock = acc; // save the socket handle |
... | ... | @@ -65,7 +66,7 @@ server_handle_accept(SERVER this) |
65 | 66 | |
66 | 67 | static |
67 | 68 | int |
68 | -server_read(SERVER this) | |
69 | +serverRead(Server this) | |
69 | 70 | { |
70 | 71 | unsigned int i; |
71 | 72 | size_t _read; |
... | ... | @@ -85,7 +86,8 @@ server_read(SERVER this) |
85 | 86 | * read failure / close connection |
86 | 87 | * FALLTHROUGH |
87 | 88 | */ |
88 | - server_close_conn(this, i); | |
89 | + loggerLog(this->logger, LOGGER_INFO, "connection closed..."); | |
90 | + serverCloseConn(this, i); | |
89 | 91 | break; |
90 | 92 | |
91 | 93 | default: |
... | ... | @@ -102,12 +104,12 @@ server_read(SERVER this) |
102 | 104 | } |
103 | 105 | |
104 | 106 | void |
105 | -server_run(SERVER this) | |
107 | +serverRun(Server this) | |
106 | 108 | { |
107 | 109 | /* |
108 | 110 | * @TODO again...add verbosity to logger.... |
109 | 111 | */ |
110 | - logger_log(this->logger, LOGGER_INFO, "service started"); | |
112 | + loggerLog(this->logger, LOGGER_INFO, "service started"); | |
111 | 113 | |
112 | 114 | while (!doShutdown) /* until error or signal */ |
113 | 115 | { |
... | ... | @@ -116,16 +118,16 @@ server_run(SERVER this) |
116 | 118 | * @TODO take return value of poll into account with |
117 | 119 | * further handling! |
118 | 120 | */ |
119 | - events = server_poll(this); | |
121 | + events = serverPoll(this); | |
120 | 122 | if (doShutdown) break; |
121 | 123 | |
122 | 124 | /* |
123 | 125 | * handle accept |
124 | 126 | */ |
125 | - server_handle_accept(this); | |
127 | + serverHandleAccept(this); | |
126 | 128 | |
127 | 129 | /* handle reads */ |
128 | - server_read(this); | |
130 | + serverRead(this); | |
129 | 131 | } |
130 | 132 | } |
131 | 133 | ... | ... |
1 | -#include <stdio.h> /* for printf() and fprintf() */ | |
2 | -#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | -#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | -#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | -#include <stdlib.h> /* for atoi() and exit() */ | |
6 | -#include <string.h> /* for memset() */ | |
7 | -#include <unistd.h> /* for close() */ | |
8 | -#include <errno.h> /* for errno */ | |
9 | -#include <stdarg.h> | |
1 | +#include <errno.h> | |
2 | +#include <stdlib.h> | |
10 | 3 | |
11 | -#include "logger.h" | |
12 | -#include "cclass.h" | |
13 | 4 | #include "socket.h" |
5 | +#include "logger.h" | |
6 | +#include "interface/class.h" | |
7 | +#include "interface/logger.h" | |
14 | 8 | |
15 | - | |
16 | -INIT_CLASS(SOCK); | |
17 | - | |
18 | -__construct(SOCK) | |
9 | +static | |
10 | +void | |
11 | +ctor(void * _this, va_list * params) | |
19 | 12 | { |
20 | - int reUse = 1; /* TODO: make this configurable */ | |
21 | - | |
22 | - this->logger = va_arg(* params, LOGGER); | |
23 | - this->port = va_arg(* params, int); | |
24 | - | |
25 | - /* Create socket for incoming connections */ | |
26 | - if (-1 == (this->handle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))) { | |
27 | - logger_log(this->logger, LOGGER_CRIT, | |
28 | - "error opening socket: %s - service terminated", | |
29 | - strerror(errno)); | |
30 | - exit(EXIT_FAILURE); | |
31 | - } | |
13 | + Sock this = _this; | |
14 | + int reUse = 1; /* TODO: make this configurable */ | |
15 | + | |
16 | + this->log = va_arg(* params, Logger); | |
17 | + this->port = va_arg(* params, int); | |
18 | + | |
19 | + /* Create socket for incoming connections */ | |
20 | + if (-1 == (this->handle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))) { | |
21 | + loggerLog(this->log, LOGGER_CRIT, | |
22 | + "error opening socket: %s - service terminated", | |
23 | + strerror(errno)); | |
24 | + exit(EXIT_FAILURE); | |
25 | + } | |
32 | 26 | |
33 | - /* Make the socket REUSE a TIME_WAIT socket */ | |
34 | - setsockopt(this->handle, SOL_SOCKET, SO_REUSEADDR, &reUse, sizeof (reUse)); | |
27 | + /* Make the socket REUSE a TIME_WAIT socket */ | |
28 | + setsockopt(this->handle, SOL_SOCKET, SO_REUSEADDR, &reUse, sizeof (reUse)); | |
35 | 29 | } |
36 | 30 | |
37 | -__destruct(SOCK) | |
31 | +static | |
32 | +void | |
33 | +dtor(void * _this) | |
38 | 34 | { |
35 | + Sock this = _this; | |
36 | + | |
39 | 37 | if (0 != this->handle) { |
40 | 38 | shutdown(this->handle, SHUT_RDWR); |
41 | 39 | close(this->handle); |
42 | 40 | } |
43 | 41 | } |
44 | 42 | |
45 | -__jsonConst(SOCK) {} | |
46 | -__toJson(SOCK) {} | |
47 | -__clear(SOCK) {} | |
43 | +INIT_IFACE(Class, ctor, dtor, NULL); | |
44 | +CREATE_CLASS(Sock, NULL, IFACE(Class)); | |
48 | 45 | |
49 | 46 | // vim: set ts=4 sw=4: | ... | ... |
1 | -#include <stdio.h> /* for printf() and fprintf() */ | |
2 | -#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | -#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | -#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | -#include <stdlib.h> /* for atoi() and exit() */ | |
6 | -#include <string.h> /* for memset() */ | |
7 | -#include <unistd.h> /* for close() */ | |
8 | 1 | #include <errno.h> /* for errno */ |
9 | -#include <stdarg.h> | |
10 | 2 | |
11 | -#include "logger.h" | |
12 | -#include "cclass.h" | |
13 | 3 | #include "socket.h" |
4 | +#include "interface/class.h" | |
5 | +#include "interface/logger.h" | |
14 | 6 | |
15 | -SOCK | |
16 | -sock_accept(SOCK this, char remoteAddr[16]) | |
7 | +Sock | |
8 | +socketAccept(Sock this, char remoteAddr[16]) | |
17 | 9 | { |
18 | - SOCK sock; /* Socket for client */ | |
10 | + Sock sock; /* Socket for client */ | |
19 | 11 | unsigned int len; /* Length of client address data structure */ |
20 | 12 | |
21 | 13 | /* Set the size of the in-out parameter */ |
22 | 14 | len = sizeof(this->addr); |
23 | 15 | |
24 | - sock = new(SOCK, this->logger, this->port); | |
16 | + sock = new(Sock, this->log, this->port); | |
25 | 17 | /** |
26 | 18 | * @TODO: change port to remote port on success |
27 | 19 | */ |
... | ... | @@ -29,10 +21,10 @@ sock_accept(SOCK this, char remoteAddr[16]) |
29 | 21 | /* Wait for a client to connect */ |
30 | 22 | sock->handle = accept(this->handle, (struct sockaddr *) &(sock->addr), &len); |
31 | 23 | if (-1 == sock->handle) { |
32 | - logger_log(this->logger, LOGGER_WARNING, | |
24 | + loggerLog(this->log, LOGGER_WARNING, | |
33 | 25 | "error acception connection: %s", strerror(errno)); |
34 | 26 | } else { |
35 | - logger_log(this->logger, LOGGER_INFO, | |
27 | + loggerLog(this->log, LOGGER_INFO, | |
36 | 28 | "handling client %s\n", inet_ntoa((sock->addr).sin_addr)); |
37 | 29 | } |
38 | 30 | ... | ... |
1 | -#include <stdio.h> /* for printf() and fprintf() */ | |
2 | -#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | -#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | -#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | 1 | #include <stdlib.h> /* for atoi() and exit() */ |
6 | -#include <string.h> /* for memset() */ | |
7 | -#include <unistd.h> /* for close() */ | |
8 | 2 | #include <errno.h> /* for errno */ |
9 | -#include <stdarg.h> | |
10 | 3 | |
11 | -#include "logger.h" | |
12 | -#include "cclass.h" | |
13 | 4 | #include "socket.h" |
5 | +#include "interface/class.h" | |
6 | +#include "interface/logger.h" | |
14 | 7 | |
15 | 8 | |
16 | 9 | void |
17 | -sock_connect(SOCK this, const char * addr) | |
10 | +socketConnect(Sock this, const char * addr) | |
18 | 11 | { |
19 | 12 | inet_pton(AF_INET, addr, &((this->addr).sin_addr)); |
20 | 13 | (this->addr).sin_family = AF_INET; /* Internet address family */ |
21 | 14 | (this->addr).sin_port = htons(this->port); /* Local port */ |
22 | 15 | |
23 | 16 | if (-1 == connect(this->handle, (struct sockaddr*) &(this->addr), sizeof(this->addr))) { |
24 | - logger_log(this->logger, LOGGER_CRIT, | |
17 | + loggerLog(this->log, LOGGER_CRIT, | |
25 | 18 | "error connection socket: %s - service terminated", |
26 | 19 | strerror(errno)); |
27 | 20 | exit(EXIT_FAILURE); | ... | ... |
1 | -#include <stdio.h> /* for printf() and fprintf() */ | |
2 | -#include <sys/types.h> /* SO_REUSEADDR */ | |
3 | -#include <sys/socket.h> /* for socket(), bind(), and connect() */ | |
4 | -#include <arpa/inet.h> /* for sockaddr_in and inet_ntoa() */ | |
5 | 1 | #include <stdlib.h> /* for atoi() and exit() */ |
6 | -#include <string.h> /* for memset() */ | |
7 | -#include <unistd.h> /* for close() */ | |
8 | 2 | #include <errno.h> /* for errno */ |
9 | -#include <stdarg.h> | |
10 | 3 | |
11 | -#include "logger.h" | |
12 | -#include "cclass.h" | |
13 | 4 | #include "socket.h" |
5 | +#include "interface/class.h" | |
6 | +#include "interface/logger.h" | |
14 | 7 | |
15 | 8 | |
16 | 9 | void |
17 | -sock_listen(SOCK this, int backlog) | |
10 | +socketListen(Sock this, int backlog) | |
18 | 11 | { |
19 | 12 | (this->addr).sin_family = AF_INET; /* Internet address family */ |
20 | 13 | (this->addr).sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ |
... | ... | @@ -22,7 +15,7 @@ sock_listen(SOCK this, int backlog) |
22 | 15 | |
23 | 16 | /* Bind to the local address */ |
24 | 17 | if (-1 == bind(this->handle, (struct sockaddr *) &(this->addr), sizeof(this->addr))) { |
25 | - logger_log(this->logger, LOGGER_CRIT, | |
18 | + loggerLog(this->log, LOGGER_CRIT, | |
26 | 19 | "error binding socket: %s - service terminated", |
27 | 20 | strerror(errno)); |
28 | 21 | exit(EXIT_FAILURE); |
... | ... | @@ -30,7 +23,7 @@ sock_listen(SOCK this, int backlog) |
30 | 23 | |
31 | 24 | /* Mark the socket so it will listen for incoming connections */ |
32 | 25 | if (-1 == listen(this->handle, backlog)) { |
33 | - logger_log(this->logger, LOGGER_CRIT, | |
26 | + loggerLog(this->log, LOGGER_CRIT, | |
34 | 27 | "error binding socket: %s - service terminated", |
35 | 28 | strerror(errno)); |
36 | 29 | exit(EXIT_FAILURE); | ... | ... |
... | ... | @@ -3,7 +3,9 @@ |
3 | 3 | #include <string.h> |
4 | 4 | |
5 | 5 | #include "server.h" |
6 | +#include "logger.h" | |
6 | 7 | #include "signalHandling.h" |
8 | +#include "interface/class.h" | |
7 | 9 | |
8 | 10 | static void |
9 | 11 | read_hook(const char * _buffer, size_t size) |
... | ... | @@ -11,7 +13,7 @@ read_hook(const char * _buffer, size_t size) |
11 | 13 | char buffer[1025]; |
12 | 14 | |
13 | 15 | memset(buffer, 0, 1025); |
14 | - snprintf(buffer, size, _buffer); | |
16 | + snprintf(buffer, 1025>size? size : 1024, "%s", _buffer); | |
15 | 17 | |
16 | 18 | printf("%s\n", buffer); |
17 | 19 | } |
... | ... | @@ -19,13 +21,13 @@ read_hook(const char * _buffer, size_t size) |
19 | 21 | int |
20 | 22 | main() |
21 | 23 | { |
22 | - LOGGER logger = new(LOGGER, NULL); | |
23 | - SERVER server = new(SERVER, logger, 11212, SOMAXCONN); | |
24 | + Logger logger = new(LoggerStderr, LOGGER_INFO); | |
25 | + Server server = new(Server, logger, 11212, SOMAXCONN); | |
24 | 26 | |
25 | 27 | server->read_hook = read_hook; |
26 | 28 | |
27 | 29 | init_signals(); |
28 | - server_run(server); | |
30 | + serverRun(server); | |
29 | 31 | |
30 | 32 | delete(&server); |
31 | 33 | delete(&logger); | ... | ... |
Please
register
or
login
to post a comment