aboutsummaryrefslogtreecommitdiff
path: root/src/syslog-port.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/syslog-port.c')
-rw-r--r--src/syslog-port.c124
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
31static scm_t_bits scm_tc16_syslog_port; 31static scm_t_port_type *scm_syslog_port_type;
32struct _gamma_syslog_port { 32struct _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
63static SCM
64_syslog_port_mark(SCM port)
65{
66 return SCM_BOOL_F;
67}
68
69static void 50static 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
98static 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
112static scm_sizet 57static 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
119static int 65static 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
125static 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
154static scm_t_off 76static scm_t_off
@@ -180,15 +102,13 @@ SCM_DEFINE_PUBLIC(scm_open_syslog_port, "open-syslog-port", 1, 0, 0,
180void 102void
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

Return to:

Send suggestions and report system problems to the System administrator.