diff options
Diffstat (limited to 'src/syslog-port.c')
-rw-r--r-- | src/syslog-port.c | 124 |
1 files changed, 22 insertions, 102 deletions
diff --git a/src/syslog-port.c b/src/syslog-port.c index 4b27ef9..4388c10 100644 --- a/src/syslog-port.c +++ b/src/syslog-port.c | |||
@@ -28,7 +28,7 @@ typedef off_t scm_t_off; | |||
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #define GAMMA_SYSLOG_PORT_BUFSIZE 1024 | 30 | #define GAMMA_SYSLOG_PORT_BUFSIZE 1024 |
31 | static scm_t_bits scm_tc16_syslog_port; | 31 | static scm_t_port_type *scm_syslog_port_type; |
32 | struct _gamma_syslog_port { | 32 | struct _gamma_syslog_port { |
33 | int prio; | 33 | int prio; |
34 | }; | 34 | }; |
@@ -37,118 +37,40 @@ static SCM | |||
37 | _make_syslog_port(int prio) | 37 | _make_syslog_port(int prio) |
38 | { | 38 | { |
39 | struct _gamma_syslog_port *dp; | 39 | struct _gamma_syslog_port *dp; |
40 | SCM port; | ||
41 | scm_port *pt; | ||
42 | 40 | ||
43 | dp = scm_gc_malloc (sizeof (struct _gamma_syslog_port), "syslog-port"); | 41 | dp = scm_gc_typed_calloc (struct _gamma_syslog_port); |
44 | dp->prio = prio; | 42 | dp->prio = prio; |
45 | 43 | return scm_c_make_port(scm_syslog_port_type, | |
46 | port = scm_new_port_table_entry(scm_tc16_syslog_port); | 44 | SCM_OPN | SCM_WRTNG | SCM_BUFLINE, |
47 | pt = SCM_PTAB_ENTRY(port); | 45 | (scm_t_bits) dp); |
48 | pt->rw_random = 0; | ||
49 | pt->write_buf = scm_gc_malloc(GAMMA_SYSLOG_PORT_BUFSIZE, | ||
50 | "syslog port buffer"); | ||
51 | pt->write_pos = pt->write_buf; | ||
52 | pt->write_buf_size = GAMMA_SYSLOG_PORT_BUFSIZE; | ||
53 | pt->write_end = pt->write_buf + pt->write_buf_size; | ||
54 | SCM_SET_CELL_TYPE(port, | ||
55 | (scm_tc16_syslog_port | | ||
56 | SCM_OPN | SCM_WRTNG | SCM_BUFLINE)); | ||
57 | SCM_SETSTREAM(port, dp); | ||
58 | return port; | ||
59 | } | 46 | } |
60 | 47 | ||
61 | #define SYSLOG_PORT(x) ((struct _gamma_syslog_port *) SCM_STREAM (x)) | 48 | #define SYSLOG_PORT(x) ((struct _gamma_syslog_port *) SCM_STREAM (x)) |
62 | 49 | ||
63 | static SCM | ||
64 | _syslog_port_mark(SCM port) | ||
65 | { | ||
66 | return SCM_BOOL_F; | ||
67 | } | ||
68 | |||
69 | static void | 50 | static void |
70 | _syslog_port_flush(SCM port) | ||
71 | { | ||
72 | struct _gamma_syslog_port *dp = SYSLOG_PORT(port); | ||
73 | scm_port *pt = SCM_PTAB_ENTRY(port); | ||
74 | size_t size = pt->write_pos - pt->write_buf; | ||
75 | unsigned char *nl = memchr(pt->write_buf, '\n', size); | ||
76 | int wrsize; | ||
77 | |||
78 | if (!nl) | ||
79 | return; | ||
80 | |||
81 | wrsize = nl - pt->write_buf; | ||
82 | |||
83 | *nl = 0; | ||
84 | syslog (dp->prio, "%s", (char *) pt->write_buf); | ||
85 | *nl = '\n'; | ||
86 | |||
87 | if (wrsize < size) { | ||
88 | size_t write_start; | ||
89 | |||
90 | nl++; | ||
91 | write_start = pt->write_pos - nl; | ||
92 | memmove(pt->write_buf, nl, write_start); | ||
93 | pt->write_pos = pt->write_buf + write_start; | ||
94 | } else | ||
95 | pt->write_pos = pt->write_buf; | ||
96 | } | ||
97 | |||
98 | static int | ||
99 | _syslog_port_close(SCM port) | 51 | _syslog_port_close(SCM port) |
100 | { | 52 | { |
101 | struct _gamma_syslog_port *dp = SYSLOG_PORT(port); | 53 | struct _gamma_syslog_port *dp = SYSLOG_PORT(port); |
102 | 54 | /* nothing */ | |
103 | if (dp) { | ||
104 | _syslog_port_flush(port); | ||
105 | SCM_SETSTREAM(port, NULL); | ||
106 | scm_gc_free(dp, sizeof(struct _gamma_syslog_port), | ||
107 | "syslog-port"); | ||
108 | } | ||
109 | return 0; | ||
110 | } | 55 | } |
111 | 56 | ||
112 | static scm_sizet | 57 | static size_t |
113 | _syslog_port_free(SCM port) | 58 | _syslog_port_free(SCM port) |
59 | /* FIXME: basically, a no-op */ | ||
114 | { | 60 | { |
115 | _syslog_port_close(port); | 61 | _syslog_port_close(port); |
116 | return 0; | 62 | return 0; |
117 | } | 63 | } |
118 | 64 | ||
119 | static int | 65 | static size_t |
120 | _syslog_port_fill_input(SCM port) | 66 | _syslog_port_write(SCM port, SCM src, size_t start, size_t count) |
121 | { | ||
122 | return EOF; | ||
123 | } | ||
124 | |||
125 | static void | ||
126 | _syslog_port_write(SCM port, const void *data, size_t size) | ||
127 | { | 67 | { |
128 | scm_port *pt = SCM_PTAB_ENTRY (port); | 68 | struct _gamma_syslog_port *dp = SYSLOG_PORT(port); |
129 | size_t space = pt->write_end - pt->write_pos; | 69 | syslog(dp->prio, "%*.*s", |
130 | if (space < size) { | 70 | (int) count, |
131 | size_t start = pt->write_pos - pt->write_buf; | 71 | (int) count, |
132 | size_t new_size = pt->write_buf_size; | 72 | SCM_BYTEVECTOR_CONTENTS(src) + start); |
133 | 73 | return count; | |
134 | do { | ||
135 | /*FIXME*/ | ||
136 | new_size *= 2; | ||
137 | } while (new_size - start < size); | ||
138 | |||
139 | pt->write_buf = scm_gc_realloc(pt->write_buf, | ||
140 | pt->write_buf_size, | ||
141 | new_size, | ||
142 | "syslog port buffer"); | ||
143 | pt->write_buf_size = new_size; | ||
144 | pt->write_end = pt->write_buf + pt->write_buf_size; | ||
145 | pt->write_pos = pt->write_buf + start; | ||
146 | } | ||
147 | memcpy(pt->write_pos, data, size); | ||
148 | pt->write_pos += size; | ||
149 | |||
150 | if (memchr (data, '\n', size)) | ||
151 | _syslog_port_flush(port); | ||
152 | } | 74 | } |
153 | 75 | ||
154 | static scm_t_off | 76 | static scm_t_off |
@@ -180,15 +102,13 @@ SCM_DEFINE_PUBLIC(scm_open_syslog_port, "open-syslog-port", 1, 0, 0, | |||
180 | void | 102 | void |
181 | _gamma_init_syslog_port() | 103 | _gamma_init_syslog_port() |
182 | { | 104 | { |
183 | scm_tc16_syslog_port = scm_make_port_type("syslog-port", | 105 | scm_syslog_port_type = scm_make_port_type("syslog-port", |
184 | _syslog_port_fill_input, | 106 | NULL, |
185 | _syslog_port_write); | 107 | _syslog_port_write); |
186 | scm_set_port_mark(scm_tc16_syslog_port, _syslog_port_mark); | 108 | scm_set_port_free(scm_syslog_port_type, _syslog_port_free); |
187 | scm_set_port_free(scm_tc16_syslog_port, _syslog_port_free); | 109 | scm_set_port_print(scm_syslog_port_type, _syslog_port_print); |
188 | scm_set_port_print(scm_tc16_syslog_port, _syslog_port_print); | 110 | scm_set_port_close(scm_syslog_port_type, _syslog_port_close); |
189 | scm_set_port_flush(scm_tc16_syslog_port, _syslog_port_flush); | 111 | scm_set_port_seek(scm_syslog_port_type, _syslog_port_seek); |
190 | scm_set_port_close(scm_tc16_syslog_port, _syslog_port_close); | ||
191 | scm_set_port_seek(scm_tc16_syslog_port, _syslog_port_seek); | ||
192 | #include <syslog-port.x> | 112 | #include <syslog-port.x> |
193 | } | 113 | } |
194 | 114 | ||