In order to provide inheritance, it is necessary to make
the base functions/methods visible so the extended object could reuse some base methods if necessary. Inheritance is possible because we always add to the end of the vtable structure new functions. For example, mime_t object will be also a message_t. and it will be possible to do { mime_t mime; header_t header; ... message_get_header ((message_t)mime, header); } Another example is tcpstream(socket stream) extends fdstream(file description stream); Also the name of the functions have change to match better there purpose. * mailbox2/Makefile.am: lockfile.c added. * mailbox2/bstream.c: Reoganisation to make the functions visible. * mailbox2/dattribute.c: Likewise. * mailbox2/dotlock.c: Likewise. * mailbox2/fdstream.c: Likewise. * mailbox2/fstream.c: Likewise. * mailbox2/mapstream.c: Likewise. * mailbox2/memstream.c: Likewise. * mailbox2/pticket.c: Likewise. * mailbox2/sdebug.c: Likewise. * mailbox2/tcpstream.c: Likewise. * mailbox2/include/mailutils/Makefile.am: lockfile.h added. * mailbox2/include/mailutils/attribute.h: Add the new prototypes. * mailbox2/include/mailutils/mbox.h: Add the new prototypes. * mailbox2/include/mailutils/stream.h: Add the new prototypes. * mailbox2/include/mailutils/sys/Makefile.am: dattribute.h lockfile.h mapstream.h pticket.h added. * mailbox2/include/mailutils/sys/bstream.h: Add new prototypes. * mailbox2/include/mailutils/sys/fdstream.h: Likewise. * mailbox2/include/mailutils/sys/fstream.h: Likewise. * mailbox2/include/mailutils/sys/mbox.h: Likewise. * mailbox2/include/mailutils/sys/memstream.h: Likewise. * mailbox2/include/mailutils/sys/sdebug.h: Likewise. * mailbox2/include/mailutils/sys/tcpstream.h: Likewise.
Showing
31 changed files
with
1354 additions
and
742 deletions
1 | 2001-09-22 Alain Magloire | ||
2 | |||
3 | In order to provide inheritance, it is necessary to make | ||
4 | the base functions/methods visible so the extended object | ||
5 | could reuse some base methods if necessary. Inheritance | ||
6 | is possible because we always add to the end of the vtable | ||
7 | structure new functions. | ||
8 | For example, mime_t object will be also a message_t. | ||
9 | and it will be possible to do | ||
10 | { | ||
11 | mime_t mime; | ||
12 | header_t header; | ||
13 | ... | ||
14 | message_get_header ((message_t)mime, header); | ||
15 | } | ||
16 | Another example is tcpstream(socket stream) extends | ||
17 | fdstream(file description stream); | ||
18 | Also the name of the functions have change to match better | ||
19 | there purpose. | ||
20 | |||
21 | * mailbox2/Makefile.am: lockfile.c added. | ||
22 | * mailbox2/bstream.c: Reoganisation to make the | ||
23 | functions visible. | ||
24 | * mailbox2/dattribute.c: Likewise. | ||
25 | * mailbox2/dotlock.c: Likewise. | ||
26 | * mailbox2/fdstream.c: Likewise. | ||
27 | * mailbox2/fstream.c: Likewise. | ||
28 | * mailbox2/mapstream.c: Likewise. | ||
29 | * mailbox2/memstream.c: Likewise. | ||
30 | * mailbox2/pticket.c: Likewise. | ||
31 | * mailbox2/sdebug.c: Likewise. | ||
32 | * mailbox2/tcpstream.c: Likewise. | ||
33 | |||
34 | * mailbox2/include/mailutils/Makefile.am: lockfile.h added. | ||
35 | * mailbox2/include/mailutils/attribute.h: Add the new prototypes. | ||
36 | * mailbox2/include/mailutils/mbox.h: Add the new prototypes. | ||
37 | * mailbox2/include/mailutils/stream.h: Add the new prototypes. | ||
38 | |||
39 | * mailbox2/include/mailutils/sys/Makefile.am: dattribute.h lockfile.h | ||
40 | mapstream.h pticket.h added. | ||
41 | * mailbox2/include/mailutils/sys/bstream.h: Add new prototypes. | ||
42 | * mailbox2/include/mailutils/sys/fdstream.h: Likewise. | ||
43 | * mailbox2/include/mailutils/sys/fstream.h: Likewise. | ||
44 | * mailbox2/include/mailutils/sys/mbox.h: Likewise. | ||
45 | * mailbox2/include/mailutils/sys/memstream.h: Likewise. | ||
46 | * mailbox2/include/mailutils/sys/sdebug.h: Likewise. | ||
47 | * mailbox2/include/mailutils/sys/tcpstream.h: Likewise. | ||
48 | |||
1 | 2001-09-20 Sergey Poznyakoff | 49 | 2001-09-20 Sergey Poznyakoff |
2 | 50 | ||
3 | * frm/frm.c: Print newline not depending on the presence | 51 | * frm/frm.c: Print newline not depending on the presence |
... | @@ -21,22 +69,21 @@ | ... | @@ -21,22 +69,21 @@ |
21 | * mailbox2/sdebug.c (mu_debug_stream_create): New function | 69 | * mailbox2/sdebug.c (mu_debug_stream_create): New function |
22 | replace mu_debug_stdio_create(). | 70 | replace mu_debug_stdio_create(). |
23 | * mailbox2/fdstream.c (_fds_desroy): Do not close the stream | 71 | * mailbox2/fdstream.c (_fds_desroy): Do not close the stream |
24 | when distroying, it should have been done explicitely with | 72 | when destroying, it should have been done explicitely with |
25 | stream_close (); | 73 | stream_close (); |
26 | * mailbox2/fstream.c (_fs_desroy): Do not close the stream | 74 | * mailbox2/fstream.c (_fs_desroy): Do not close the stream |
27 | when distroying, it should have been done explicitely with | 75 | when destroying, it should have been done explicitely with |
28 | stream_close (); | 76 | stream_close (); |
29 | * mailbox2/mapstream.c (_map_desroy): Do not close the stream | 77 | * mailbox2/mapstream.c (_map_desroy): Do not close the stream |
30 | when distroying, it should have been done explicitely with | 78 | when destroying, it should have been done explicitely with |
31 | stream_close (); | 79 | stream_close (); |
32 | * mailbox2/memstream.c (_memory_desroy): Do not close the stream | 80 | * mailbox2/memstream.c (_memory_desroy): Do not close the stream |
33 | when distroying, it should have been done explicitely with | 81 | when destroying, it should have been done explicitely with |
34 | stream_close (); | 82 | stream_close (); |
35 | * mailbox2/tcpstream.c (_tcp_desroy): Do not close the stream | 83 | * mailbox2/tcpstream.c (_tcp_desroy): Do not close the stream |
36 | when distroying, it should have been done explicitely with | 84 | when destroying, it should have been done explicitely with |
37 | stream_close (); | 85 | stream_close (); |
38 | 86 | ||
39 | |||
40 | 2001-09-18 Sam Roberts | 87 | 2001-09-18 Sam Roberts |
41 | 88 | ||
42 | * mailbox/mbx_pop.c: Check url authentication type at | 89 | * mailbox/mbx_pop.c: Check url authentication type at |
... | @@ -2144,7 +2191,7 @@ | ... | @@ -2144,7 +2191,7 @@ |
2144 | 2001-04-23 Alain Magloire | 2191 | 2001-04-23 Alain Magloire |
2145 | 2192 | ||
2146 | Sergey Poznyakoff noted: When the user's mailbox has zero size, mmap | 2193 | Sergey Poznyakoff noted: When the user's mailbox has zero size, mmap |
2147 | fails on Solaris. On GNU/Linux it reuturn NULL buf subsequent munmap | 2194 | fails on Solaris. On GNU/Linux it return NULL buf subsequent munmap |
2148 | fails. | 2195 | fails. |
2149 | 2196 | ||
2150 | * mailbox/mapfile_stream.c: To take care of this, mfs->ptr is set | 2197 | * mailbox/mapfile_stream.c: To take care of this, mfs->ptr is set | ... | ... |
... | @@ -25,7 +25,7 @@ libmailbox_la_SOURCES = \ | ... | @@ -25,7 +25,7 @@ libmailbox_la_SOURCES = \ |
25 | header.c \ | 25 | header.c \ |
26 | iterator.c \ | 26 | iterator.c \ |
27 | list.c \ | 27 | list.c \ |
28 | locker.c \ | 28 | lockfile.c \ |
29 | mailbox.c \ | 29 | mailbox.c \ |
30 | md5-rsa.c \ | 30 | md5-rsa.c \ |
31 | memstream.c \ | 31 | memstream.c \ | ... | ... |
... | @@ -37,14 +37,14 @@ | ... | @@ -37,14 +37,14 @@ |
37 | #include <mailutils/sys/bstream.h> | 37 | #include <mailutils/sys/bstream.h> |
38 | 38 | ||
39 | static void | 39 | static void |
40 | _bs_cleanup (void *arg) | 40 | _stream_buffer_cleanup (void *arg) |
41 | { | 41 | { |
42 | struct _bs *bs = arg; | 42 | struct _stream_buffer *bs = arg; |
43 | mu_refcount_unlock (bs->refcount); | 43 | mu_refcount_unlock (bs->refcount); |
44 | } | 44 | } |
45 | 45 | ||
46 | static int | 46 | static int |
47 | refill (struct _bs *bs) | 47 | refill (struct _stream_buffer *bs) |
48 | { | 48 | { |
49 | int status; | 49 | int status; |
50 | if (bs->rbuffer.base == NULL) | 50 | if (bs->rbuffer.base == NULL) |
... | @@ -60,17 +60,17 @@ refill (struct _bs *bs) | ... | @@ -60,17 +60,17 @@ refill (struct _bs *bs) |
60 | return status; | 60 | return status; |
61 | } | 61 | } |
62 | 62 | ||
63 | static int | 63 | int |
64 | _bs_ref (stream_t stream) | 64 | _stream_buffer_ref (stream_t stream) |
65 | { | 65 | { |
66 | struct _bs *bs = (struct _bs *)stream; | 66 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
67 | return mu_refcount_inc (bs->refcount); | 67 | return mu_refcount_inc (bs->refcount); |
68 | } | 68 | } |
69 | 69 | ||
70 | static void | 70 | void |
71 | _bs_destroy (stream_t *pstream) | 71 | _stream_buffer_destroy (stream_t *pstream) |
72 | { | 72 | { |
73 | struct _bs *bs = (struct _bs *)*pstream; | 73 | struct _stream_buffer *bs = (struct _stream_buffer *)*pstream; |
74 | if (mu_refcount_dec (bs->refcount) == 0) | 74 | if (mu_refcount_dec (bs->refcount) == 0) |
75 | { | 75 | { |
76 | stream_destroy (&bs->stream); | 76 | stream_destroy (&bs->stream); |
... | @@ -79,17 +79,17 @@ _bs_destroy (stream_t *pstream) | ... | @@ -79,17 +79,17 @@ _bs_destroy (stream_t *pstream) |
79 | } | 79 | } |
80 | } | 80 | } |
81 | 81 | ||
82 | static int | 82 | int |
83 | _bs_open (stream_t stream, const char *name, int port, int flags) | 83 | _stream_buffer_open (stream_t stream, const char *name, int port, int flags) |
84 | { | 84 | { |
85 | struct _bs *bs = (struct _bs *)stream; | 85 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
86 | return stream_open (bs->stream, name, port, flags); | 86 | return stream_open (bs->stream, name, port, flags); |
87 | } | 87 | } |
88 | 88 | ||
89 | static int | 89 | int |
90 | _bs_close (stream_t stream) | 90 | _stream_buffer_close (stream_t stream) |
91 | { | 91 | { |
92 | struct _bs *bs = (struct _bs *)stream; | 92 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
93 | mu_refcount_lock (bs->refcount); | 93 | mu_refcount_lock (bs->refcount); |
94 | /* Clear the buffer of any residue left. */ | 94 | /* Clear the buffer of any residue left. */ |
95 | if (bs->rbuffer.base && bs->rbuffer.bufsize) | 95 | if (bs->rbuffer.base && bs->rbuffer.bufsize) |
... | @@ -106,11 +106,11 @@ _bs_close (stream_t stream) | ... | @@ -106,11 +106,11 @@ _bs_close (stream_t stream) |
106 | use as a fully fledge buffer mechanism. It is a simple mechanims for | 106 | use as a fully fledge buffer mechanism. It is a simple mechanims for |
107 | networking. Lots of code between POP and IMAP can be share this way. | 107 | networking. Lots of code between POP and IMAP can be share this way. |
108 | The buffering is on the read only, the writes fall through. */ | 108 | The buffering is on the read only, the writes fall through. */ |
109 | static int | 109 | int |
110 | _bs_read (stream_t stream, void *buf, size_t count, size_t *pnread) | 110 | _stream_buffer_read (stream_t stream, void *buf, size_t count, size_t *pnread) |
111 | { | 111 | { |
112 | int status = 0; | 112 | int status = 0; |
113 | struct _bs *bs = (struct _bs *)stream; | 113 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
114 | 114 | ||
115 | /* Noop. */ | 115 | /* Noop. */ |
116 | if (count == 0) | 116 | if (count == 0) |
... | @@ -131,7 +131,7 @@ _bs_read (stream_t stream, void *buf, size_t count, size_t *pnread) | ... | @@ -131,7 +131,7 @@ _bs_read (stream_t stream, void *buf, size_t count, size_t *pnread) |
131 | int r; | 131 | int r; |
132 | 132 | ||
133 | mu_refcount_lock (bs->refcount); | 133 | mu_refcount_lock (bs->refcount); |
134 | monitor_cleanup_push (_bs_cleanup, bs); | 134 | monitor_cleanup_push (_stream_buffer_cleanup, bs); |
135 | 135 | ||
136 | /* If the amount requested is bigger then the buffer cache size | 136 | /* If the amount requested is bigger then the buffer cache size |
137 | bypass it. Do no waste time and let it through. */ | 137 | bypass it. Do no waste time and let it through. */ |
... | @@ -199,11 +199,11 @@ _bs_read (stream_t stream, void *buf, size_t count, size_t *pnread) | ... | @@ -199,11 +199,11 @@ _bs_read (stream_t stream, void *buf, size_t count, size_t *pnread) |
199 | * Read at most n-1 characters. | 199 | * Read at most n-1 characters. |
200 | * Stop when a newline has been read, or the count runs out. | 200 | * Stop when a newline has been read, or the count runs out. |
201 | */ | 201 | */ |
202 | static int | 202 | int |
203 | _bs_readline (stream_t stream, char *buf, size_t count, size_t *pnread) | 203 | _stream_buffer_readline (stream_t stream, char *buf, size_t count, size_t *pnread) |
204 | { | 204 | { |
205 | int status = 0; | 205 | int status = 0; |
206 | struct _bs *bs = (struct _bs *)stream; | 206 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
207 | 207 | ||
208 | /* Noop. */ | 208 | /* Noop. */ |
209 | if (count == 0) | 209 | if (count == 0) |
... | @@ -224,7 +224,7 @@ _bs_readline (stream_t stream, char *buf, size_t count, size_t *pnread) | ... | @@ -224,7 +224,7 @@ _bs_readline (stream_t stream, char *buf, size_t count, size_t *pnread) |
224 | size_t total = 0; | 224 | size_t total = 0; |
225 | 225 | ||
226 | mu_refcount_lock (bs->refcount); | 226 | mu_refcount_lock (bs->refcount); |
227 | monitor_cleanup_push (_bs_cleanup, bs); | 227 | monitor_cleanup_push (_stream_buffer_cleanup, bs); |
228 | 228 | ||
229 | count--; /* Leave space for the null. */ | 229 | count--; /* Leave space for the null. */ |
230 | 230 | ||
... | @@ -277,91 +277,74 @@ _bs_readline (stream_t stream, char *buf, size_t count, size_t *pnread) | ... | @@ -277,91 +277,74 @@ _bs_readline (stream_t stream, char *buf, size_t count, size_t *pnread) |
277 | return status; | 277 | return status; |
278 | } | 278 | } |
279 | 279 | ||
280 | static int | 280 | int |
281 | _bs_write (stream_t stream, const void *buf, size_t count, size_t *pnwrite) | 281 | _stream_buffer_write (stream_t stream, const void *buf, size_t count, |
282 | size_t *pnwrite) | ||
282 | { | 283 | { |
283 | struct _bs *bs = (struct _bs *)stream; | 284 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
284 | int err = 0; | 285 | return stream_write (bs->stream, buf, count, pnwrite); |
285 | size_t nwriten = 0; | ||
286 | size_t total = 0; | ||
287 | int nleft = count; | ||
288 | const char *p = buf; | ||
289 | |||
290 | /* First try to send it all. */ | ||
291 | while (nleft > 0) | ||
292 | { | ||
293 | err = stream_write (bs->stream, p, nleft, &nwriten); | ||
294 | if (err != 0 || nwriten == 0) | ||
295 | break; | ||
296 | nleft -= nwriten; | ||
297 | total += nwriten; | ||
298 | p += nwriten; | ||
299 | } | ||
300 | if (pnwrite) | ||
301 | *pnwrite = total; | ||
302 | return err; | ||
303 | } | 286 | } |
304 | 287 | ||
305 | static int | 288 | int |
306 | _bs_get_fd (stream_t stream, int *pfd) | 289 | _stream_buffer_get_fd (stream_t stream, int *pfd) |
307 | { | 290 | { |
308 | struct _bs *bs = (struct _bs *)stream; | 291 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
309 | return stream_get_fd (bs->stream, pfd); | 292 | return stream_get_fd (bs->stream, pfd); |
310 | } | 293 | } |
311 | 294 | ||
312 | static int | 295 | int |
313 | _bs_get_flags (stream_t stream, int *pfl) | 296 | _stream_buffer_get_flags (stream_t stream, int *pfl) |
314 | { | 297 | { |
315 | struct _bs *bs = (struct _bs *)stream; | 298 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
316 | return stream_get_flags (bs->stream, pfl); | 299 | return stream_get_flags (bs->stream, pfl); |
317 | } | 300 | } |
318 | 301 | ||
319 | static int | 302 | int |
320 | _bs_get_size (stream_t stream, off_t *psize) | 303 | _stream_buffer_get_size (stream_t stream, off_t *psize) |
321 | { | 304 | { |
322 | struct _bs *bs = (struct _bs *)stream; | 305 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
323 | return stream_get_size (bs->stream, psize); | 306 | return stream_get_size (bs->stream, psize); |
324 | } | 307 | } |
325 | 308 | ||
326 | static int | 309 | int |
327 | _bs_truncate (stream_t stream, off_t len) | 310 | _stream_buffer_truncate (stream_t stream, off_t len) |
328 | { | 311 | { |
329 | struct _bs *bs = (struct _bs *)stream; | 312 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
330 | return stream_truncate (bs->stream, len); | 313 | return stream_truncate (bs->stream, len); |
331 | } | 314 | } |
332 | 315 | ||
333 | static int | 316 | int |
334 | _bs_flush (stream_t stream) | 317 | _stream_buffer_flush (stream_t stream) |
335 | { | 318 | { |
336 | struct _bs *bs = (struct _bs *)stream; | 319 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
337 | return stream_flush (bs->stream); | 320 | return stream_flush (bs->stream); |
338 | } | 321 | } |
339 | 322 | ||
340 | static int | 323 | int |
341 | _bs_get_state (stream_t stream, enum stream_state *pstate) | 324 | _stream_buffer_get_state (stream_t stream, enum stream_state *pstate) |
342 | { | 325 | { |
343 | struct _bs *bs = (struct _bs *)stream; | 326 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
344 | return stream_get_state (bs->stream, pstate); | 327 | return stream_get_state (bs->stream, pstate); |
345 | } | 328 | } |
346 | 329 | ||
347 | static int | 330 | int |
348 | _bs_seek (stream_t stream, off_t off, enum stream_whence whence) | 331 | _stream_buffer_seek (stream_t stream, off_t off, enum stream_whence whence) |
349 | { | 332 | { |
350 | struct _bs *bs = (struct _bs *)stream; | 333 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
351 | return stream_seek (bs->stream, off, whence); | 334 | return stream_seek (bs->stream, off, whence); |
352 | } | 335 | } |
353 | 336 | ||
354 | static int | 337 | int |
355 | _bs_tell (stream_t stream, off_t *off) | 338 | _stream_buffer_tell (stream_t stream, off_t *off) |
356 | { | 339 | { |
357 | struct _bs *bs = (struct _bs *)stream; | 340 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
358 | return stream_tell (bs->stream, off); | 341 | return stream_tell (bs->stream, off); |
359 | } | 342 | } |
360 | 343 | ||
361 | static int | 344 | int |
362 | _bs_is_readready (stream_t stream, int timeout) | 345 | _stream_buffer_is_readready (stream_t stream, int timeout) |
363 | { | 346 | { |
364 | struct _bs *bs = (struct _bs *)stream; | 347 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
365 | /* Drain our buffer first. */ | 348 | /* Drain our buffer first. */ |
366 | mu_refcount_lock (bs->refcount); | 349 | mu_refcount_lock (bs->refcount); |
367 | if (bs->rbuffer.count > 0) | 350 | if (bs->rbuffer.count > 0) |
... | @@ -373,62 +356,84 @@ _bs_is_readready (stream_t stream, int timeout) | ... | @@ -373,62 +356,84 @@ _bs_is_readready (stream_t stream, int timeout) |
373 | return stream_is_readready (bs->stream, timeout); | 356 | return stream_is_readready (bs->stream, timeout); |
374 | } | 357 | } |
375 | 358 | ||
376 | static int | 359 | int |
377 | _bs_is_writeready (stream_t stream, int timeout) | 360 | _stream_buffer_is_writeready (stream_t stream, int timeout) |
378 | { | 361 | { |
379 | struct _bs *bs = (struct _bs *)stream; | 362 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
380 | return stream_is_writeready (bs->stream, timeout); | 363 | return stream_is_writeready (bs->stream, timeout); |
381 | } | 364 | } |
382 | 365 | ||
383 | static int | 366 | int |
384 | _bs_is_exceptionpending (stream_t stream, int timeout) | 367 | _stream_buffer_is_exceptionpending (stream_t stream, int timeout) |
385 | { | 368 | { |
386 | struct _bs *bs = (struct _bs *)stream; | 369 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
387 | return stream_is_exceptionpending (bs->stream, timeout); | 370 | return stream_is_exceptionpending (bs->stream, timeout); |
388 | } | 371 | } |
389 | 372 | ||
390 | static int | 373 | int |
391 | _bs_is_open (stream_t stream) | 374 | _stream_buffer_is_open (stream_t stream) |
392 | { | 375 | { |
393 | struct _bs *bs = (struct _bs *)stream; | 376 | struct _stream_buffer *bs = (struct _stream_buffer *)stream; |
394 | return stream_is_open (bs->stream); | 377 | return stream_is_open (bs->stream); |
395 | } | 378 | } |
396 | 379 | ||
397 | 380 | ||
398 | static struct _stream_vtable _bs_vtable = | 381 | static struct _stream_vtable _stream_buffer_vtable = |
399 | { | 382 | { |
400 | _bs_ref, | 383 | _stream_buffer_ref, |
401 | _bs_destroy, | 384 | _stream_buffer_destroy, |
402 | 385 | ||
403 | _bs_open, | 386 | _stream_buffer_open, |
404 | _bs_close, | 387 | _stream_buffer_close, |
405 | 388 | ||
406 | _bs_read, | 389 | _stream_buffer_read, |
407 | _bs_readline, | 390 | _stream_buffer_readline, |
408 | _bs_write, | 391 | _stream_buffer_write, |
409 | 392 | ||
410 | _bs_seek, | 393 | _stream_buffer_seek, |
411 | _bs_tell, | 394 | _stream_buffer_tell, |
412 | 395 | ||
413 | _bs_get_size, | 396 | _stream_buffer_get_size, |
414 | _bs_truncate, | 397 | _stream_buffer_truncate, |
415 | _bs_flush, | 398 | _stream_buffer_flush, |
416 | 399 | ||
417 | _bs_get_fd, | 400 | _stream_buffer_get_fd, |
418 | _bs_get_flags, | 401 | _stream_buffer_get_flags, |
419 | _bs_get_state, | 402 | _stream_buffer_get_state, |
420 | 403 | ||
421 | _bs_is_readready, | 404 | _stream_buffer_is_readready, |
422 | _bs_is_writeready, | 405 | _stream_buffer_is_writeready, |
423 | _bs_is_exceptionpending, | 406 | _stream_buffer_is_exceptionpending, |
424 | 407 | ||
425 | _bs_is_open | 408 | _stream_buffer_is_open |
426 | }; | 409 | }; |
427 | 410 | ||
428 | int | 411 | int |
412 | _stream_buffer_ctor (struct _stream_buffer *bs, stream_t stream, | ||
413 | size_t bufsize) | ||
414 | { | ||
415 | mu_refcount_create (&(bs->refcount)); | ||
416 | if (bs->refcount == NULL) | ||
417 | return MU_ERROR_NO_MEMORY; | ||
418 | |||
419 | bs->stream = stream; | ||
420 | bs->rbuffer.bufsize = bufsize; | ||
421 | bs->base.vtable = &_stream_buffer_vtable; | ||
422 | return 0; | ||
423 | } | ||
424 | |||
425 | void | ||
426 | _stream_buffer_dtor (struct _stream_buffer *bs) | ||
427 | { | ||
428 | stream_destroy (&bs->stream); | ||
429 | mu_refcount_destroy (&bs->refcount); | ||
430 | } | ||
431 | |||
432 | int | ||
429 | stream_buffer_create (stream_t *pstream, stream_t stream, size_t bufsize) | 433 | stream_buffer_create (stream_t *pstream, stream_t stream, size_t bufsize) |
430 | { | 434 | { |
431 | struct _bs *bs; | 435 | struct _stream_buffer *bs; |
436 | int status; | ||
432 | 437 | ||
433 | if (pstream == NULL || stream == NULL || bufsize == 0) | 438 | if (pstream == NULL || stream == NULL || bufsize == 0) |
434 | return MU_ERROR_INVALID_PARAMETER; | 439 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -437,16 +442,9 @@ stream_buffer_create (stream_t *pstream, stream_t stream, size_t bufsize) | ... | @@ -437,16 +442,9 @@ stream_buffer_create (stream_t *pstream, stream_t stream, size_t bufsize) |
437 | if (bs == NULL) | 442 | if (bs == NULL) |
438 | return MU_ERROR_NO_MEMORY; | 443 | return MU_ERROR_NO_MEMORY; |
439 | 444 | ||
440 | mu_refcount_create (&(bs->refcount)); | 445 | status = _stream_buffer_ctor (bs, stream, bufsize); |
441 | if (bs->refcount == NULL) | 446 | if (status != 0) |
442 | { | 447 | return status; |
443 | free (bs); | ||
444 | return MU_ERROR_NO_MEMORY; | ||
445 | } | ||
446 | |||
447 | bs->stream = stream; | ||
448 | bs->rbuffer.bufsize = bufsize; | ||
449 | bs->base.vtable = &_bs_vtable; | ||
450 | *pstream = &bs->base; | 448 | *pstream = &bs->base; |
451 | return 0; | 449 | return 0; |
452 | } | 450 | } | ... | ... |
... | @@ -28,19 +28,19 @@ | ... | @@ -28,19 +28,19 @@ |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #include <mailutils/error.h> | 30 | #include <mailutils/error.h> |
31 | #include <mailutils/sys/attribute.h> | 31 | #include <mailutils/sys/dattribute.h> |
32 | 32 | ||
33 | static int | 33 | int |
34 | _da_ref (attribute_t attribute) | 34 | _attribute_default_ref (attribute_t attribute) |
35 | { | 35 | { |
36 | struct _da *da = (struct _da *)attribute; | 36 | struct _attribute_default *da = (struct _attribute_default *)attribute; |
37 | return mu_refcount_inc (da->refcount); | 37 | return mu_refcount_inc (da->refcount); |
38 | } | 38 | } |
39 | 39 | ||
40 | static void | 40 | void |
41 | _da_destroy (attribute_t *pattribute) | 41 | _attribute_default_destroy (attribute_t *pattribute) |
42 | { | 42 | { |
43 | struct _da *da = (struct _da *)*pattribute; | 43 | struct _attribute_default *da = (struct _attribute_default *)*pattribute; |
44 | if (mu_refcount_dec (da->refcount) == 0) | 44 | if (mu_refcount_dec (da->refcount) == 0) |
45 | { | 45 | { |
46 | mu_refcount_destroy (&da->refcount); | 46 | mu_refcount_destroy (&da->refcount); |
... | @@ -48,10 +48,10 @@ _da_destroy (attribute_t *pattribute) | ... | @@ -48,10 +48,10 @@ _da_destroy (attribute_t *pattribute) |
48 | } | 48 | } |
49 | } | 49 | } |
50 | 50 | ||
51 | static int | 51 | int |
52 | _da_get_flags (attribute_t attribute, int *pflags) | 52 | _attribute_default_get_flags (attribute_t attribute, int *pflags) |
53 | { | 53 | { |
54 | struct _da *da = (struct _da *)attribute; | 54 | struct _attribute_default *da = (struct _attribute_default *)attribute; |
55 | mu_refcount_lock (da->refcount); | 55 | mu_refcount_lock (da->refcount); |
56 | if (pflags) | 56 | if (pflags) |
57 | *pflags = da->flags; | 57 | *pflags = da->flags; |
... | @@ -59,20 +59,20 @@ _da_get_flags (attribute_t attribute, int *pflags) | ... | @@ -59,20 +59,20 @@ _da_get_flags (attribute_t attribute, int *pflags) |
59 | return 0; | 59 | return 0; |
60 | } | 60 | } |
61 | 61 | ||
62 | static int | 62 | int |
63 | _da_set_flags (attribute_t attribute, int flags) | 63 | _attribute_default_set_flags (attribute_t attribute, int flags) |
64 | { | 64 | { |
65 | struct _da *da = (struct _da *)attribute; | 65 | struct _attribute_default *da = (struct _attribute_default *)attribute; |
66 | mu_refcount_lock (da->refcount); | 66 | mu_refcount_lock (da->refcount); |
67 | da->flags |= (flags | MU_ATTRIBUTE_MODIFIED); | 67 | da->flags |= (flags | MU_ATTRIBUTE_MODIFIED); |
68 | mu_refcount_unlock (da->refcount); | 68 | mu_refcount_unlock (da->refcount); |
69 | return 0; | 69 | return 0; |
70 | } | 70 | } |
71 | 71 | ||
72 | static int | 72 | int |
73 | _da_unset_flags (attribute_t attribute, int flags) | 73 | _attribute_default_unset_flags (attribute_t attribute, int flags) |
74 | { | 74 | { |
75 | struct _da *da = (struct _da *)attribute; | 75 | struct _attribute_default *da = (struct _attribute_default *)attribute; |
76 | mu_refcount_lock (da->refcount); | 76 | mu_refcount_lock (da->refcount); |
77 | da->flags &= ~flags; | 77 | da->flags &= ~flags; |
78 | /* If Modified was being unset do not reset it. */ | 78 | /* If Modified was being unset do not reset it. */ |
... | @@ -82,45 +82,115 @@ _da_unset_flags (attribute_t attribute, int flags) | ... | @@ -82,45 +82,115 @@ _da_unset_flags (attribute_t attribute, int flags) |
82 | return 0; | 82 | return 0; |
83 | } | 83 | } |
84 | 84 | ||
85 | static int | 85 | int |
86 | _da_clear_flags (attribute_t attribute) | 86 | _attribute_default_clear_flags (attribute_t attribute) |
87 | { | 87 | { |
88 | struct _da *da = (struct _da *)attribute; | 88 | struct _attribute_default *da = (struct _attribute_default *)attribute; |
89 | mu_refcount_lock (da->refcount); | 89 | mu_refcount_lock (da->refcount); |
90 | da->flags = 0; | 90 | da->flags = 0; |
91 | mu_refcount_unlock (da->refcount); | 91 | mu_refcount_unlock (da->refcount); |
92 | return 0; | 92 | return 0; |
93 | } | 93 | } |
94 | 94 | ||
95 | static struct _attribute_vtable _da_vtable = | 95 | static struct _attribute_vtable _attribute_default_vtable = |
96 | { | 96 | { |
97 | _da_ref, | 97 | _attribute_default_ref, |
98 | _da_destroy, | 98 | _attribute_default_destroy, |
99 | 99 | ||
100 | _da_get_flags, | 100 | _attribute_default_get_flags, |
101 | _da_set_flags, | 101 | _attribute_default_set_flags, |
102 | _da_unset_flags, | 102 | _attribute_default_unset_flags, |
103 | _da_clear_flags | 103 | _attribute_default_clear_flags |
104 | }; | 104 | }; |
105 | 105 | ||
106 | int | 106 | int |
107 | attribute_create (attribute_t *pattribute) | 107 | _attribute_default_ctor (struct _attribute_default *da) |
108 | { | 108 | { |
109 | struct _da *da; | 109 | mu_refcount_create (&(da->refcount)); |
110 | if (da->refcount == NULL) | ||
111 | return MU_ERROR_NO_MEMORY; | ||
112 | da->flags = 0; | ||
113 | da->base.vtable = &_attribute_default_vtable; | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | void | ||
118 | _attribute_default_dtor (struct _attribute_default *da) | ||
119 | { | ||
120 | mu_refcount_destroy (&da->refcount); | ||
121 | } | ||
122 | |||
123 | int | ||
124 | attribute_default_create (attribute_t *pattribute) | ||
125 | { | ||
126 | struct _attribute_default *da; | ||
127 | int status; | ||
128 | |||
110 | if (pattribute == NULL) | 129 | if (pattribute == NULL) |
111 | return MU_ERROR_INVALID_PARAMETER; | 130 | return MU_ERROR_INVALID_PARAMETER; |
131 | |||
112 | da = calloc (1, sizeof *da); | 132 | da = calloc (1, sizeof *da); |
113 | if (da == NULL) | 133 | if (da == NULL) |
114 | return MU_ERROR_NO_MEMORY; | 134 | return MU_ERROR_NO_MEMORY; |
115 | 135 | ||
116 | mu_refcount_create (&(da->refcount)); | 136 | status = _attribute_default_ctor (da); |
117 | if (da->refcount == NULL) | 137 | if (status != 0) |
118 | { | 138 | { |
119 | free (da); | 139 | free (da); |
120 | return MU_ERROR_NO_MEMORY; | 140 | return status; |
121 | } | 141 | } |
122 | da->flags = 0; | ||
123 | da->base.vtable = &_da_vtable; | ||
124 | *pattribute = &da->base; | 142 | *pattribute = &da->base; |
125 | return 0; | 143 | return 0; |
126 | } | 144 | } |
145 | |||
146 | int | ||
147 | attribute_status_create (attribute_t *pattribute, const char *field) | ||
148 | { | ||
149 | struct _attribute_default *da; | ||
150 | int status; | ||
151 | char *colon; | ||
152 | |||
153 | if (pattribute == NULL || field == NULL) | ||
154 | return MU_ERROR_INVALID_PARAMETER; | ||
155 | |||
156 | da = calloc (1, sizeof *da); | ||
157 | if (da == NULL) | ||
158 | return MU_ERROR_NO_MEMORY; | ||
159 | |||
160 | status = _attribute_default_ctor (da); | ||
161 | if (status != 0) | ||
162 | { | ||
163 | free (da); | ||
164 | return status; | ||
165 | } | ||
166 | *pattribute = &da->base; | ||
167 | |||
168 | colon = strchr (field, ':'); | ||
169 | if (colon) | ||
170 | field = ++colon; | ||
171 | |||
172 | for (; *field; field++) | ||
173 | { | ||
174 | switch (*field) | ||
175 | { | ||
176 | case 'r': | ||
177 | case 'R': | ||
178 | attribute_set_read (*pattribute); | ||
179 | break; | ||
180 | case 'O': | ||
181 | case 'o': | ||
182 | attribute_set_seen (*pattribute); | ||
183 | break; | ||
184 | case 'a': | ||
185 | case 'A': | ||
186 | attribute_set_answered (*pattribute); | ||
187 | break; | ||
188 | case 'd': | ||
189 | case 'D': | ||
190 | attribute_set_deleted (*pattribute); | ||
191 | break; | ||
192 | } | ||
193 | } | ||
194 | attribute_unset_modified (*pattribute); | ||
195 | return 0; | ||
196 | } | ... | ... |
... | @@ -33,53 +33,35 @@ | ... | @@ -33,53 +33,35 @@ |
33 | #include <signal.h> | 33 | #include <signal.h> |
34 | 34 | ||
35 | #include <mailutils/error.h> | 35 | #include <mailutils/error.h> |
36 | #include <mailutils/sys/locker.h> | 36 | #include <mailutils/sys/dotlock.h> |
37 | #include <mailutils/refcount.h> | 37 | #include <mailutils/refcount.h> |
38 | 38 | ||
39 | /* locking flags */ | ||
40 | #define MU_DOTLOCK_PID 1 | ||
41 | #define MU_DOTLOCK_FCNTL 2 | ||
42 | #define MU_DOTLOCK_TIME 4 | ||
43 | |||
44 | #define MU_DOTLOCK_EXPIRE_TIME (5 * 60) | ||
45 | |||
46 | #define LOCKFILE_ATTR 0444 | ||
47 | |||
48 | /* First draft by Brian Edmond. */ | 39 | /* First draft by Brian Edmond. */ |
49 | 40 | ||
50 | struct _dotlock | 41 | int |
51 | { | 42 | _lockfile_dotlock_ref (lockfile_t lockfile) |
52 | struct _locker base; | ||
53 | mu_refcount_t refcount; | ||
54 | int fd; | ||
55 | int refcnt; | ||
56 | char *fname; | ||
57 | int flags; | ||
58 | }; | ||
59 | |||
60 | static int | ||
61 | _dotlock_ref (locker_t locker) | ||
62 | { | 43 | { |
63 | struct _dotlock *dotlock = (struct _dotlock *)locker; | 44 | struct _lockfile_dotlock *dotlock = (struct _lockfile_dotlock *)lockfile; |
64 | return mu_refcount_inc (dotlock->refcount); | 45 | return mu_refcount_inc (dotlock->refcount); |
65 | } | 46 | } |
66 | 47 | ||
67 | static void | 48 | void |
68 | _dotlock_destroy (locker_t *plocker) | 49 | _lockfile_dotlock_destroy (lockfile_t *plockfile) |
69 | { | 50 | { |
70 | struct _dotlock *dotlock = (struct _dotlock *)*plocker; | 51 | struct _lockfile_dotlock *dotlock = (struct _lockfile_dotlock *)*plockfile; |
71 | if (mu_refcount_dec (dotlock->refcount) == 0) | 52 | if (mu_refcount_dec (dotlock->refcount) == 0) |
72 | { | 53 | { |
73 | mu_refcount_destroy (&dotlock->refcount); | 54 | mu_refcount_destroy (&dotlock->refcount); |
74 | free (dotlock->fname); | 55 | if (dotlock->fname) |
56 | free (dotlock->fname); | ||
75 | free (dotlock); | 57 | free (dotlock); |
76 | } | 58 | } |
77 | } | 59 | } |
78 | 60 | ||
79 | static int | 61 | int |
80 | _dotlock_lock (locker_t locker) | 62 | _lockfile_dotlock_lock (lockfile_t lockfile) |
81 | { | 63 | { |
82 | struct _dotlock *dotlock = (struct _dotlock *)locker; | 64 | struct _lockfile_dotlock *dotlock = (struct _lockfile_dotlock *)lockfile; |
83 | int fd = -1; | 65 | int fd = -1; |
84 | char buf[16]; | 66 | char buf[16]; |
85 | pid_t pid; | 67 | pid_t pid; |
... | @@ -104,31 +86,34 @@ _dotlock_lock (locker_t locker) | ... | @@ -104,31 +86,34 @@ _dotlock_lock (locker_t locker) |
104 | if (fd != -1) | 86 | if (fd != -1) |
105 | { | 87 | { |
106 | /* Check to see if this process is still running. */ | 88 | /* Check to see if this process is still running. */ |
107 | if (dotlock->flags & MU_DOTLOCK_PID) | 89 | if (dotlock->flags & MU_LOCKFILE_DOTLOCK_PID) |
108 | { | 90 | { |
109 | int nread = read (fd, buf, sizeof (buf) - 1); | 91 | int nread = read (fd, buf, sizeof (buf) - 1); |
110 | if (nread > 0) | 92 | if (nread > 0) |
111 | { | 93 | { |
112 | buf[nread] = '\0'; | 94 | buf[nread] = '\0'; |
113 | pid = strtol (buf, NULL, 10); | 95 | switch (pid = strtol (buf, NULL, 10)) |
114 | if (pid > 0) | 96 | { |
115 | { | 97 | case LONG_MIN: |
116 | /* Process is gone so we try to remove the lock. */ | 98 | case LONG_MAX: |
117 | if (kill (pid, 0) == -1) | 99 | if (errno == ERANGE) |
118 | removed = 1; | 100 | removed = 1; |
119 | } | 101 | break; |
120 | else | 102 | default: |
121 | removed = 1; /* Corrupted file, remove the lock. */ | 103 | /* Process is gone so we try to remove the lock. */ |
122 | } | 104 | if (kill (pid, 0) == -1) |
105 | removed = 1; | ||
106 | } | ||
107 | } | ||
123 | } | 108 | } |
124 | /* Check to see if the lock expired. */ | 109 | /* Check to see if the lock expired. */ |
125 | if (dotlock->flags & MU_DOTLOCK_TIME) | 110 | if (dotlock->flags & MU_LOCKFILE_DOTLOCK_TIME) |
126 | { | 111 | { |
127 | struct stat stbuf; | 112 | struct stat stbuf; |
128 | 113 | ||
129 | fstat (fd, &stbuf); | 114 | fstat (fd, &stbuf); |
130 | /* The lock has expired. */ | 115 | /* The lock has expired. */ |
131 | if ((time (NULL) - stbuf.st_mtime) > MU_DOTLOCK_EXPIRE_TIME) | 116 | if ((time (NULL) - stbuf.st_mtime) > MU_LOCKFILE_DOTLOCK_EXPIRE_TIME) |
132 | removed = 1; | 117 | removed = 1; |
133 | } | 118 | } |
134 | 119 | ||
... | @@ -138,7 +123,7 @@ _dotlock_lock (locker_t locker) | ... | @@ -138,7 +123,7 @@ _dotlock_lock (locker_t locker) |
138 | } | 123 | } |
139 | 124 | ||
140 | /* Try to create the lockfile. */ | 125 | /* Try to create the lockfile. */ |
141 | fd = open (dotlock->fname, O_WRONLY | O_CREAT | O_EXCL, LOCKFILE_ATTR); | 126 | fd = open (dotlock->fname, O_WRONLY | O_CREAT | O_EXCL, MU_LOCKFILE_DOTLOCK_ATTR); |
142 | if (fd == -1) | 127 | if (fd == -1) |
143 | return errno; | 128 | return errno; |
144 | else | 129 | else |
... | @@ -165,7 +150,7 @@ _dotlock_lock (locker_t locker) | ... | @@ -165,7 +150,7 @@ _dotlock_lock (locker_t locker) |
165 | write (fd, buf, strlen (buf)); | 150 | write (fd, buf, strlen (buf)); |
166 | 151 | ||
167 | /* Try to get a file lock. */ | 152 | /* Try to get a file lock. */ |
168 | if (dotlock->flags & MU_DOTLOCK_FCNTL) | 153 | if (dotlock->flags & MU_LOCKFILE_DOTLOCK_FCNTL) |
169 | { | 154 | { |
170 | struct flock fl; | 155 | struct flock fl; |
171 | 156 | ||
... | @@ -186,26 +171,26 @@ _dotlock_lock (locker_t locker) | ... | @@ -186,26 +171,26 @@ _dotlock_lock (locker_t locker) |
186 | return 0; | 171 | return 0; |
187 | } | 172 | } |
188 | 173 | ||
189 | static int | 174 | int |
190 | _dotlock_touchlock (locker_t locker) | 175 | _lockfile_dotlock_touchlock (lockfile_t lockfile) |
191 | { | 176 | { |
192 | struct _dotlock *dotlock = (struct _dotlock *)locker; | 177 | struct _lockfile_dotlock *dotlock = (struct _lockfile_dotlock *)lockfile; |
193 | if (!dotlock || !dotlock->fname || dotlock->fd == -1) | 178 | if (!dotlock || !dotlock->fname || dotlock->fd == -1) |
194 | return MU_ERROR_INVALID_PARAMETER; | 179 | return MU_ERROR_INVALID_PARAMETER; |
195 | return utime (dotlock->fname, NULL); | 180 | return utime (dotlock->fname, NULL); |
196 | } | 181 | } |
197 | 182 | ||
198 | static int | 183 | int |
199 | _dotlock_unlock (locker_t locker) | 184 | _lockfile_dotlock_unlock (lockfile_t lockfile) |
200 | { | 185 | { |
201 | struct _dotlock *dotlock = (struct _dotlock *)locker; | 186 | struct _lockfile_dotlock *dotlock = (struct _lockfile_dotlock *)lockfile; |
202 | if (!dotlock || !dotlock->fname || dotlock->fd == -1 || dotlock->refcnt <= 0) | 187 | if (!dotlock || !dotlock->fname || dotlock->fd == -1 || dotlock->refcnt <= 0) |
203 | return EINVAL; | 188 | return EINVAL; |
204 | 189 | ||
205 | if (--dotlock->refcnt > 0) | 190 | if (--dotlock->refcnt > 0) |
206 | return 0; | 191 | return 0; |
207 | 192 | ||
208 | if (dotlock->flags & MU_DOTLOCK_FCNTL) | 193 | if (dotlock->flags & MU_LOCKFILE_DOTLOCK_FCNTL) |
209 | { | 194 | { |
210 | struct flock fl; | 195 | struct flock fl; |
211 | 196 | ||
... | @@ -221,48 +206,68 @@ _dotlock_unlock (locker_t locker) | ... | @@ -221,48 +206,68 @@ _dotlock_unlock (locker_t locker) |
221 | return 0; | 206 | return 0; |
222 | } | 207 | } |
223 | 208 | ||
224 | static struct _locker_vtable _dotlock_vtable = | 209 | static struct _lockfile_vtable _lockfile_dotlock_vtable = |
225 | { | 210 | { |
226 | _dotlock_ref, | 211 | _lockfile_dotlock_ref, |
227 | _dotlock_destroy, | 212 | _lockfile_dotlock_destroy, |
228 | 213 | ||
229 | _dotlock_lock, | 214 | _lockfile_dotlock_lock, |
230 | _dotlock_touchlock, | 215 | _lockfile_dotlock_touchlock, |
231 | _dotlock_unlock, | 216 | _lockfile_dotlock_unlock, |
232 | }; | 217 | }; |
233 | 218 | ||
234 | int | 219 | int |
235 | locker_dotlock_create (locker_t *plocker, const char *filename) | 220 | _lockfile_dotlock_ctor (struct _lockfile_dotlock *dotlock, |
221 | const char *filename) | ||
236 | { | 222 | { |
237 | struct _dotlock *dotlock; | ||
238 | |||
239 | if (plocker == NULL || filename == NULL) | ||
240 | return MU_ERROR_INVALID_PARAMETER; | ||
241 | |||
242 | dotlock = calloc (1, sizeof *dotlock); | ||
243 | if (dotlock == NULL) | ||
244 | return MU_ERROR_NO_MEMORY; | ||
245 | |||
246 | mu_refcount_create (&dotlock->refcount); | 223 | mu_refcount_create (&dotlock->refcount); |
247 | if (dotlock->refcount) | 224 | if (dotlock->refcount) |
248 | { | 225 | return MU_ERROR_NO_MEMORY; |
249 | free (dotlock); | ||
250 | return MU_ERROR_NO_MEMORY; | ||
251 | } | ||
252 | 226 | ||
253 | dotlock->fname = calloc (strlen (filename) + 5 /*strlen(".lock")*/ + 1, 1); | 227 | dotlock->fname = calloc (strlen (filename) + 5 /*strlen(".lock")*/ + 1, 1); |
254 | if (dotlock->fname == NULL) | 228 | if (dotlock->fname == NULL) |
255 | { | 229 | { |
256 | free (dotlock); | 230 | mu_refcount_destroy (&dotlock->refcount); |
257 | return MU_ERROR_NO_MEMORY; | 231 | return MU_ERROR_NO_MEMORY; |
258 | } | 232 | } |
259 | strcpy (dotlock->fname, filename); | 233 | strcpy (dotlock->fname, filename); |
260 | strcat (dotlock->fname, ".lock"); | 234 | strcat (dotlock->fname, ".lock"); |
261 | 235 | ||
262 | dotlock->flags = MU_DOTLOCK_PID | MU_DOTLOCK_TIME | MU_DOTLOCK_FCNTL; | 236 | dotlock->flags = MU_LOCKFILE_DOTLOCK_PID | MU_LOCKFILE_DOTLOCK_TIME |
237 | | MU_LOCKFILE_DOTLOCK_FCNTL; | ||
263 | dotlock->fd = -1; | 238 | dotlock->fd = -1; |
264 | dotlock->refcnt = 0; | 239 | dotlock->refcnt = 0; |
265 | dotlock->base.vtable = &_dotlock_vtable; | 240 | dotlock->base.vtable = &_lockfile_dotlock_vtable; |
266 | *plocker = &dotlock->base; | 241 | return 0; |
242 | } | ||
243 | |||
244 | void | ||
245 | _lockfile_dotlock_dtor (struct _lockfile_dotlock *dotlock) | ||
246 | { | ||
247 | mu_refcount_destroy (&dotlock->refcount); | ||
248 | if (dotlock->fname) | ||
249 | free (dotlock->fname); | ||
250 | } | ||
251 | |||
252 | int | ||
253 | lockfile_dotlock_create (lockfile_t *plockfile, const char *filename) | ||
254 | { | ||
255 | struct _lockfile_dotlock *dotlock; | ||
256 | int status; | ||
257 | |||
258 | if (plockfile == NULL || filename == NULL) | ||
259 | return MU_ERROR_INVALID_PARAMETER; | ||
260 | |||
261 | dotlock = calloc (1, sizeof *dotlock); | ||
262 | if (dotlock == NULL) | ||
263 | return MU_ERROR_NO_MEMORY; | ||
264 | |||
265 | status = _lockfile_dotlock_ctor (dotlock, filename); | ||
266 | if (status != 0) | ||
267 | { | ||
268 | free (dotlock); | ||
269 | return status; | ||
270 | } | ||
271 | *plockfile = &dotlock->base; | ||
267 | return 0; | 272 | return 0; |
268 | } | 273 | } | ... | ... |
... | @@ -33,23 +33,23 @@ | ... | @@ -33,23 +33,23 @@ |
33 | #include <mailutils/error.h> | 33 | #include <mailutils/error.h> |
34 | 34 | ||
35 | static void | 35 | static void |
36 | _fds_cleanup (void *arg) | 36 | _stream_fd_cleanup (void *arg) |
37 | { | 37 | { |
38 | struct _fds *fds = arg; | 38 | struct _stream_fd *fds = arg; |
39 | mu_refcount_unlock (fds->refcount); | 39 | mu_refcount_unlock (fds->refcount); |
40 | } | 40 | } |
41 | 41 | ||
42 | static int | 42 | int |
43 | _fds_ref (stream_t stream) | 43 | _stream_fd_ref (stream_t stream) |
44 | { | 44 | { |
45 | struct _fds *fds = (struct _fds *)stream; | 45 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
46 | return mu_refcount_inc (fds->refcount); | 46 | return mu_refcount_inc (fds->refcount); |
47 | } | 47 | } |
48 | 48 | ||
49 | static void | 49 | void |
50 | _fds_destroy (stream_t *pstream) | 50 | _stream_fd_destroy (stream_t *pstream) |
51 | { | 51 | { |
52 | struct _fds *fds = (struct _fds *)*pstream; | 52 | struct _stream_fd *fds = (struct _stream_fd *)*pstream; |
53 | if (mu_refcount_dec (fds->refcount) == 0) | 53 | if (mu_refcount_dec (fds->refcount) == 0) |
54 | { | 54 | { |
55 | mu_refcount_destroy (&fds->refcount); | 55 | mu_refcount_destroy (&fds->refcount); |
... | @@ -58,39 +58,40 @@ _fds_destroy (stream_t *pstream) | ... | @@ -58,39 +58,40 @@ _fds_destroy (stream_t *pstream) |
58 | } | 58 | } |
59 | 59 | ||
60 | static int | 60 | static int |
61 | _fds_close0 (stream_t stream) | 61 | _stream_fd_close0 (stream_t stream) |
62 | { | 62 | { |
63 | struct _fds *fds = (struct _fds *)stream; | 63 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
64 | fds->state = MU_STREAM_STATE_CLOSE; | ||
64 | if (fds->fd != -1) | 65 | if (fds->fd != -1) |
65 | close (fds->fd); | 66 | close (fds->fd); |
66 | fds->fd = -1; | 67 | fds->fd = -1; |
67 | return 0; | 68 | return 0; |
68 | } | 69 | } |
69 | 70 | ||
70 | static int | 71 | int |
71 | _fds_close (stream_t stream) | 72 | _stream_fd_close (stream_t stream) |
72 | { | 73 | { |
73 | struct _fds *fds = (struct _fds *)stream; | 74 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
74 | 75 | ||
75 | mu_refcount_lock (fds->refcount); | 76 | mu_refcount_lock (fds->refcount); |
76 | monitor_cleanup_push (_fds_cleanup, fds); | 77 | monitor_cleanup_push (_stream_fd_cleanup, fds); |
77 | _fds_close0 (stream); | 78 | _stream_fd_close0 (stream); |
78 | mu_refcount_unlock (fds->refcount); | 79 | mu_refcount_unlock (fds->refcount); |
79 | monitor_cleanup_pop (0); | 80 | monitor_cleanup_pop (0); |
80 | return 0; | 81 | return 0; |
81 | } | 82 | } |
82 | 83 | ||
83 | static int | 84 | int |
84 | _fds_open (stream_t stream, const char *name, int port, int flags) | 85 | _stream_fd_open (stream_t stream, const char *name, int port, int flags) |
85 | { | 86 | { |
86 | (void)stream; (void)name; (void)port; (void)flags; | 87 | (void)stream; (void)name; (void)port; (void)flags; |
87 | return MU_ERROR_NOT_SUPPORTED; | 88 | return MU_ERROR_NOT_SUPPORTED; |
88 | } | 89 | } |
89 | 90 | ||
90 | static int | 91 | int |
91 | _fds_get_fd (stream_t stream, int *fd) | 92 | _stream_fd_get_fd (stream_t stream, int *fd) |
92 | { | 93 | { |
93 | struct _fds *fds = (struct _fds *)stream; | 94 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
94 | 95 | ||
95 | if (fd == NULL || fds->fd == -1) | 96 | if (fd == NULL || fds->fd == -1) |
96 | return MU_ERROR_INVALID_PARAMETER; | 97 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -99,13 +100,14 @@ _fds_get_fd (stream_t stream, int *fd) | ... | @@ -99,13 +100,14 @@ _fds_get_fd (stream_t stream, int *fd) |
99 | return 0; | 100 | return 0; |
100 | } | 101 | } |
101 | 102 | ||
102 | static int | 103 | int |
103 | _fds_read (stream_t stream, void *buf, size_t buf_size, size_t *br) | 104 | _stream_fd_read (stream_t stream, void *buf, size_t buf_size, size_t *br) |
104 | { | 105 | { |
105 | struct _fds *fds = (struct _fds *)stream; | 106 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
106 | int bytes = 0; | 107 | int bytes = 0; |
107 | int status = 0; | 108 | int status = 0; |
108 | 109 | ||
110 | fds->state = MU_STREAM_STATE_READ; | ||
109 | bytes = read (fds->fd, buf, buf_size); | 111 | bytes = read (fds->fd, buf, buf_size); |
110 | if (bytes == -1) | 112 | if (bytes == -1) |
111 | { | 113 | { |
... | @@ -117,15 +119,16 @@ _fds_read (stream_t stream, void *buf, size_t buf_size, size_t *br) | ... | @@ -117,15 +119,16 @@ _fds_read (stream_t stream, void *buf, size_t buf_size, size_t *br) |
117 | return status; | 119 | return status; |
118 | } | 120 | } |
119 | 121 | ||
120 | static int | 122 | int |
121 | _fds_readline (stream_t stream, char *buf, size_t buf_size, size_t *br) | 123 | _stream_fd_readline (stream_t stream, char *buf, size_t buf_size, size_t *br) |
122 | { | 124 | { |
123 | struct _fds *fds = (struct _fds *)stream; | 125 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
124 | int status = 0; | 126 | int status = 0; |
125 | size_t n; | 127 | size_t n; |
126 | int nr = 0; | 128 | int nr = 0; |
127 | char c; | 129 | char c; |
128 | 130 | ||
131 | fds->state = MU_STREAM_STATE_READ; | ||
129 | /* Grossly inefficient hopefully they override this */ | 132 | /* Grossly inefficient hopefully they override this */ |
130 | for (n = 1; n < buf_size; n++) | 133 | for (n = 1; n < buf_size; n++) |
131 | { | 134 | { |
... | @@ -154,13 +157,14 @@ _fds_readline (stream_t stream, char *buf, size_t buf_size, size_t *br) | ... | @@ -154,13 +157,14 @@ _fds_readline (stream_t stream, char *buf, size_t buf_size, size_t *br) |
154 | return status; | 157 | return status; |
155 | } | 158 | } |
156 | 159 | ||
157 | static int | 160 | int |
158 | _fds_write (stream_t stream, const void *buf, size_t buf_size, size_t *bw) | 161 | _stream_fd_write (stream_t stream, const void *buf, size_t buf_size, size_t *bw) |
159 | { | 162 | { |
160 | struct _fds *fds = (struct _fds *)stream; | 163 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
161 | int bytes = 0; | 164 | int bytes = 0; |
162 | int status = 0; | 165 | int status = 0; |
163 | 166 | ||
167 | fds->state = MU_STREAM_STATE_WRITE; | ||
164 | bytes = write (fds->fd, buf, buf_size); | 168 | bytes = write (fds->fd, buf, buf_size); |
165 | if (bytes == -1) | 169 | if (bytes == -1) |
166 | { | 170 | { |
... | @@ -172,10 +176,10 @@ _fds_write (stream_t stream, const void *buf, size_t buf_size, size_t *bw) | ... | @@ -172,10 +176,10 @@ _fds_write (stream_t stream, const void *buf, size_t buf_size, size_t *bw) |
172 | return status; | 176 | return status; |
173 | } | 177 | } |
174 | 178 | ||
175 | static int | 179 | int |
176 | _fds_seek (stream_t stream, off_t off, enum stream_whence whence) | 180 | _stream_fd_seek (stream_t stream, off_t off, enum stream_whence whence) |
177 | { | 181 | { |
178 | struct _fds *fds = (struct _fds *)stream; | 182 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
179 | int err = 0; | 183 | int err = 0; |
180 | if (fds->fd) | 184 | if (fds->fd) |
181 | { | 185 | { |
... | @@ -193,10 +197,10 @@ _fds_seek (stream_t stream, off_t off, enum stream_whence whence) | ... | @@ -193,10 +197,10 @@ _fds_seek (stream_t stream, off_t off, enum stream_whence whence) |
193 | return err; | 197 | return err; |
194 | } | 198 | } |
195 | 199 | ||
196 | static int | 200 | int |
197 | _fds_tell (stream_t stream, off_t *off) | 201 | _stream_fd_tell (stream_t stream, off_t *off) |
198 | { | 202 | { |
199 | struct _fds *fds = (struct _fds *)stream; | 203 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
200 | int err = 0; | 204 | int err = 0; |
201 | if (off) | 205 | if (off) |
202 | { | 206 | { |
... | @@ -207,13 +211,13 @@ _fds_tell (stream_t stream, off_t *off) | ... | @@ -207,13 +211,13 @@ _fds_tell (stream_t stream, off_t *off) |
207 | *off = 0; | 211 | *off = 0; |
208 | } | 212 | } |
209 | } | 213 | } |
210 | return err;; | 214 | return err; |
211 | } | 215 | } |
212 | 216 | ||
213 | static int | 217 | int |
214 | _fds_get_size (stream_t stream, off_t *psize) | 218 | _stream_fd_get_size (stream_t stream, off_t *psize) |
215 | { | 219 | { |
216 | struct _fds *fds = (struct _fds *)stream; | 220 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
217 | struct stat stbuf; | 221 | struct stat stbuf; |
218 | int err = 0; | 222 | int err = 0; |
219 | stbuf.st_size = 0; | 223 | stbuf.st_size = 0; |
... | @@ -224,47 +228,47 @@ _fds_get_size (stream_t stream, off_t *psize) | ... | @@ -224,47 +228,47 @@ _fds_get_size (stream_t stream, off_t *psize) |
224 | return err; | 228 | return err; |
225 | } | 229 | } |
226 | 230 | ||
227 | static int | 231 | int |
228 | _fds_truncate (stream_t stream, off_t len) | 232 | _stream_fd_truncate (stream_t stream, off_t len) |
229 | { | 233 | { |
230 | struct _fds *fds = (struct _fds *)stream; | 234 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
231 | int err = 0; | 235 | int err = 0; |
232 | if (ftruncate (fds->fd, len) == -1) | 236 | if (ftruncate (fds->fd, len) == -1) |
233 | err = errno ; | 237 | err = errno; |
234 | return err; | 238 | return err; |
235 | } | 239 | } |
236 | 240 | ||
237 | static int | 241 | int |
238 | _fds_flush (stream_t stream) | 242 | _stream_fd_flush (stream_t stream) |
239 | { | 243 | { |
240 | (void)stream; | 244 | (void)stream; |
241 | return 0; | 245 | return 0; |
242 | } | 246 | } |
243 | 247 | ||
244 | static int | 248 | int |
245 | _fds_get_flags (stream_t stream, int *flags) | 249 | _stream_fd_get_flags (stream_t stream, int *flags) |
246 | { | 250 | { |
247 | struct _fds *fds = (struct _fds *)stream; | 251 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
248 | if (flags == NULL) | 252 | if (flags == NULL) |
249 | return MU_ERROR_INVALID_PARAMETER; | 253 | return MU_ERROR_INVALID_PARAMETER; |
250 | *flags = fds->flags; | 254 | *flags = fds->flags; |
251 | return 0; | 255 | return 0; |
252 | } | 256 | } |
253 | 257 | ||
254 | static int | 258 | int |
255 | _fds_get_state (stream_t stream, enum stream_state *state) | 259 | _stream_fd_get_state (stream_t stream, enum stream_state *state) |
256 | { | 260 | { |
257 | (void)stream; | 261 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
258 | if (state == NULL) | 262 | if (state == NULL) |
259 | return MU_ERROR_INVALID_PARAMETER; | 263 | return MU_ERROR_INVALID_PARAMETER; |
260 | *state = MU_STREAM_NO_STATE; | 264 | *state = fds->state; |
261 | return 0; | 265 | return 0; |
262 | } | 266 | } |
263 | 267 | ||
264 | static int | 268 | int |
265 | _fds_is_readready (stream_t stream, int timeout) | 269 | _stream_fd_is_readready (stream_t stream, int timeout) |
266 | { | 270 | { |
267 | struct _fds *fds = (struct _fds *)stream; | 271 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
268 | int ready = 0; | 272 | int ready = 0; |
269 | 273 | ||
270 | if (fds->fd >= 0) | 274 | if (fds->fd >= 0) |
... | @@ -285,13 +289,13 @@ _fds_is_readready (stream_t stream, int timeout) | ... | @@ -285,13 +289,13 @@ _fds_is_readready (stream_t stream, int timeout) |
285 | return ready; | 289 | return ready; |
286 | } | 290 | } |
287 | 291 | ||
288 | static int | 292 | int |
289 | _fds_is_writeready (stream_t stream, int timeout) | 293 | _stream_fd_is_writeready (stream_t stream, int timeout) |
290 | { | 294 | { |
291 | struct _fds *fds = (struct _fds *)stream; | 295 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
292 | int ready = 0; | 296 | int ready = 0; |
293 | 297 | ||
294 | if (fds->fd) | 298 | if (fds->fd >= 0) |
295 | { | 299 | { |
296 | struct timeval tv; | 300 | struct timeval tv; |
297 | fd_set fset; | 301 | fd_set fset; |
... | @@ -309,13 +313,13 @@ _fds_is_writeready (stream_t stream, int timeout) | ... | @@ -309,13 +313,13 @@ _fds_is_writeready (stream_t stream, int timeout) |
309 | return ready; | 313 | return ready; |
310 | } | 314 | } |
311 | 315 | ||
312 | static int | 316 | int |
313 | _fds_is_exceptionpending (stream_t stream, int timeout) | 317 | _stream_fd_is_exceptionpending (stream_t stream, int timeout) |
314 | { | 318 | { |
315 | struct _fds *fds = (struct _fds *)stream; | 319 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
316 | int ready = 0; | 320 | int ready = 0; |
317 | 321 | ||
318 | if (fds->fd) | 322 | if (fds->fd >= 0) |
319 | { | 323 | { |
320 | struct timeval tv; | 324 | struct timeval tv; |
321 | fd_set fset; | 325 | fd_set fset; |
... | @@ -333,47 +337,66 @@ _fds_is_exceptionpending (stream_t stream, int timeout) | ... | @@ -333,47 +337,66 @@ _fds_is_exceptionpending (stream_t stream, int timeout) |
333 | return 0; | 337 | return 0; |
334 | } | 338 | } |
335 | 339 | ||
336 | static int | 340 | int |
337 | _fds_is_open (stream_t stream) | 341 | _stream_fd_is_open (stream_t stream) |
338 | { | 342 | { |
339 | struct _fds *fds = (struct _fds *)stream; | 343 | struct _stream_fd *fds = (struct _stream_fd *)stream; |
340 | return fds->fd >= 0; | 344 | return fds->fd >= 0; |
341 | } | 345 | } |
342 | 346 | ||
343 | static struct _stream_vtable _fds_vtable = | 347 | static struct _stream_vtable _stream_fd_vtable = |
344 | { | 348 | { |
345 | _fds_ref, | 349 | _stream_fd_ref, |
346 | _fds_destroy, | 350 | _stream_fd_destroy, |
347 | 351 | ||
348 | _fds_open, | 352 | _stream_fd_open, |
349 | _fds_close, | 353 | _stream_fd_close, |
350 | 354 | ||
351 | _fds_read, | 355 | _stream_fd_read, |
352 | _fds_readline, | 356 | _stream_fd_readline, |
353 | _fds_write, | 357 | _stream_fd_write, |
354 | 358 | ||
355 | _fds_seek, | 359 | _stream_fd_seek, |
356 | _fds_tell, | 360 | _stream_fd_tell, |
357 | 361 | ||
358 | _fds_get_size, | 362 | _stream_fd_get_size, |
359 | _fds_truncate, | 363 | _stream_fd_truncate, |
360 | _fds_flush, | 364 | _stream_fd_flush, |
361 | 365 | ||
362 | _fds_get_fd, | 366 | _stream_fd_get_fd, |
363 | _fds_get_flags, | 367 | _stream_fd_get_flags, |
364 | _fds_get_state, | 368 | _stream_fd_get_state, |
365 | 369 | ||
366 | _fds_is_readready, | 370 | _stream_fd_is_readready, |
367 | _fds_is_writeready, | 371 | _stream_fd_is_writeready, |
368 | _fds_is_exceptionpending, | 372 | _stream_fd_is_exceptionpending, |
369 | 373 | ||
370 | _fds_is_open | 374 | _stream_fd_is_open |
371 | }; | 375 | }; |
372 | 376 | ||
377 | |||
378 | int | ||
379 | _stream_fd_ctor (struct _stream_fd *fds, int fd) | ||
380 | { | ||
381 | mu_refcount_create (&fds->refcount); | ||
382 | if (fds->refcount == NULL) | ||
383 | return MU_ERROR_NO_MEMORY; | ||
384 | fds->fd = fd; | ||
385 | fds->base.vtable = &_stream_fd_vtable; | ||
386 | return 0; | ||
387 | } | ||
388 | |||
389 | void | ||
390 | _stream_fd_dtor (struct _stream_fd *fds) | ||
391 | { | ||
392 | mu_refcount_destroy (&fds->refcount); | ||
393 | } | ||
394 | |||
373 | int | 395 | int |
374 | stream_fd_create (stream_t *pstream, int fd) | 396 | stream_fd_create (stream_t *pstream, int fd) |
375 | { | 397 | { |
376 | struct _fds *fds; | 398 | struct _stream_fd *fds; |
399 | int status; | ||
377 | 400 | ||
378 | if (pstream == NULL || fd < 0) | 401 | if (pstream == NULL || fd < 0) |
379 | return MU_ERROR_INVALID_PARAMETER; | 402 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -382,14 +405,12 @@ stream_fd_create (stream_t *pstream, int fd) | ... | @@ -382,14 +405,12 @@ stream_fd_create (stream_t *pstream, int fd) |
382 | if (fds == NULL) | 405 | if (fds == NULL) |
383 | return MU_ERROR_NO_MEMORY; | 406 | return MU_ERROR_NO_MEMORY; |
384 | 407 | ||
385 | mu_refcount_create (&fds->refcount); | 408 | status = _stream_fd_ctor (fds, fd); |
386 | if (fds->refcount == NULL) | 409 | if (status != 0) |
387 | { | 410 | { |
388 | free (fds); | 411 | free (fds); |
389 | return MU_ERROR_NO_MEMORY; | 412 | return status; |
390 | } | 413 | } |
391 | fds->fd = fd; | ||
392 | fds->base.vtable = &_fds_vtable; | ||
393 | *pstream = &fds->base; | 414 | *pstream = &fds->base; |
394 | return 0; | 415 | return 0; |
395 | } | 416 | } | ... | ... |
... | @@ -34,17 +34,17 @@ | ... | @@ -34,17 +34,17 @@ |
34 | #include <mailutils/error.h> | 34 | #include <mailutils/error.h> |
35 | 35 | ||
36 | 36 | ||
37 | static int | 37 | int |
38 | _fs_ref (stream_t stream) | 38 | _stream_stdio_ref (stream_t stream) |
39 | { | 39 | { |
40 | struct _fs *fs = (struct _fs *)stream; | 40 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
41 | return mu_refcount_inc (fs->refcount); | 41 | return mu_refcount_inc (fs->refcount); |
42 | } | 42 | } |
43 | 43 | ||
44 | static void | 44 | void |
45 | _fs_destroy (stream_t *pstream) | 45 | _stream_stdio_destroy (stream_t *pstream) |
46 | { | 46 | { |
47 | struct _fs *fs = (struct _fs *)*pstream; | 47 | struct _stream_stdio *fs = (struct _stream_stdio *)*pstream; |
48 | if (mu_refcount_dec (fs->refcount) == 0) | 48 | if (mu_refcount_dec (fs->refcount) == 0) |
49 | { | 49 | { |
50 | mu_refcount_destroy (&fs->refcount); | 50 | mu_refcount_destroy (&fs->refcount); |
... | @@ -52,10 +52,10 @@ _fs_destroy (stream_t *pstream) | ... | @@ -52,10 +52,10 @@ _fs_destroy (stream_t *pstream) |
52 | } | 52 | } |
53 | } | 53 | } |
54 | 54 | ||
55 | static int | 55 | int |
56 | _fs_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) | 56 | _stream_stdio_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) |
57 | { | 57 | { |
58 | struct _fs *fs = (struct _fs *)stream; | 58 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
59 | size_t n = 0; | 59 | size_t n = 0; |
60 | int err = 0; | 60 | int err = 0; |
61 | 61 | ||
... | @@ -74,10 +74,10 @@ _fs_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) | ... | @@ -74,10 +74,10 @@ _fs_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) |
74 | return err; | 74 | return err; |
75 | } | 75 | } |
76 | 76 | ||
77 | static int | 77 | int |
78 | _fs_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) | 78 | _stream_stdio_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) |
79 | { | 79 | { |
80 | struct _fs *fs = (struct _fs *)stream; | 80 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
81 | size_t n = 0; | 81 | size_t n = 0; |
82 | int err = 0; | 82 | int err = 0; |
83 | 83 | ||
... | @@ -99,10 +99,10 @@ _fs_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) | ... | @@ -99,10 +99,10 @@ _fs_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) |
99 | return err; | 99 | return err; |
100 | } | 100 | } |
101 | 101 | ||
102 | static int | 102 | int |
103 | _fs_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) | 103 | _stream_stdio_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) |
104 | { | 104 | { |
105 | struct _fs *fs = (struct _fs *)stream; | 105 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
106 | size_t n = 0; | 106 | size_t n = 0; |
107 | int err = 0; | 107 | int err = 0; |
108 | 108 | ||
... | @@ -123,19 +123,19 @@ _fs_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) | ... | @@ -123,19 +123,19 @@ _fs_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) |
123 | return err; | 123 | return err; |
124 | } | 124 | } |
125 | 125 | ||
126 | static int | 126 | int |
127 | _fs_truncate (stream_t stream, off_t len) | 127 | _stream_stdio_truncate (stream_t stream, off_t len) |
128 | { | 128 | { |
129 | struct _fs *fs = (struct _fs *)stream; | 129 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
130 | if (fs->file && ftruncate (fileno (fs->file), len) != 0) | 130 | if (fs->file && ftruncate (fileno (fs->file), len) != 0) |
131 | return MU_ERROR_IO; | 131 | return MU_ERROR_IO; |
132 | return 0; | 132 | return 0; |
133 | } | 133 | } |
134 | 134 | ||
135 | static int | 135 | int |
136 | _fs_get_size (stream_t stream, off_t *psize) | 136 | _stream_stdio_get_size (stream_t stream, off_t *psize) |
137 | { | 137 | { |
138 | struct _fs *fs = (struct _fs *)stream; | 138 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
139 | struct stat stbuf; | 139 | struct stat stbuf; |
140 | stbuf.st_size = 0; | 140 | stbuf.st_size = 0; |
141 | if (fs->file) | 141 | if (fs->file) |
... | @@ -149,19 +149,19 @@ _fs_get_size (stream_t stream, off_t *psize) | ... | @@ -149,19 +149,19 @@ _fs_get_size (stream_t stream, off_t *psize) |
149 | return 0; | 149 | return 0; |
150 | } | 150 | } |
151 | 151 | ||
152 | static int | 152 | int |
153 | _fs_flush (stream_t stream) | 153 | _stream_stdio_flush (stream_t stream) |
154 | { | 154 | { |
155 | struct _fs *fs = (struct _fs *)stream; | 155 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
156 | if (fs->file) | 156 | if (fs->file) |
157 | return fflush (fs->file); | 157 | return fflush (fs->file); |
158 | return 0; | 158 | return 0; |
159 | } | 159 | } |
160 | 160 | ||
161 | static int | 161 | int |
162 | _fs_get_fd (stream_t stream, int *pfd) | 162 | _stream_stdio_get_fd (stream_t stream, int *pfd) |
163 | { | 163 | { |
164 | struct _fs *fs = (struct _fs *)stream; | 164 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
165 | int status = 0; | 165 | int status = 0; |
166 | if (pfd) | 166 | if (pfd) |
167 | { | 167 | { |
... | @@ -173,10 +173,10 @@ _fs_get_fd (stream_t stream, int *pfd) | ... | @@ -173,10 +173,10 @@ _fs_get_fd (stream_t stream, int *pfd) |
173 | return status; | 173 | return status; |
174 | } | 174 | } |
175 | 175 | ||
176 | static int | 176 | int |
177 | _fs_seek (stream_t stream, off_t off, enum stream_whence whence) | 177 | _stream_stdio_seek (stream_t stream, off_t off, enum stream_whence whence) |
178 | { | 178 | { |
179 | struct _fs *fs = (struct _fs *)stream; | 179 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
180 | int err = 0; | 180 | int err = 0; |
181 | if (fs->file) | 181 | if (fs->file) |
182 | { | 182 | { |
... | @@ -194,28 +194,28 @@ _fs_seek (stream_t stream, off_t off, enum stream_whence whence) | ... | @@ -194,28 +194,28 @@ _fs_seek (stream_t stream, off_t off, enum stream_whence whence) |
194 | return err; | 194 | return err; |
195 | } | 195 | } |
196 | 196 | ||
197 | static int | 197 | int |
198 | _fs_tell (stream_t stream, off_t *off) | 198 | _stream_stdio_tell (stream_t stream, off_t *off) |
199 | { | 199 | { |
200 | struct _fs *fs = (struct _fs *)stream; | 200 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
201 | if (off == NULL) | 201 | if (off == NULL) |
202 | return MU_ERROR_INVALID_PARAMETER; | 202 | return MU_ERROR_INVALID_PARAMETER; |
203 | *off = (fs->file) ? ftell (fs->file) : 0; | 203 | *off = (fs->file) ? ftell (fs->file) : 0; |
204 | return 0; | 204 | return 0; |
205 | } | 205 | } |
206 | 206 | ||
207 | static int | 207 | int |
208 | _fs_get_flags (stream_t stream, int *flags) | 208 | _stream_stdio_get_flags (stream_t stream, int *flags) |
209 | { | 209 | { |
210 | struct _fs *fs = (struct _fs *)stream; | 210 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
211 | if (flags == NULL) | 211 | if (flags == NULL) |
212 | return MU_ERROR_INVALID_PARAMETER; | 212 | return MU_ERROR_INVALID_PARAMETER; |
213 | *flags = fs->flags; | 213 | *flags = fs->flags; |
214 | return 0; | 214 | return 0; |
215 | } | 215 | } |
216 | 216 | ||
217 | static int | 217 | int |
218 | _fs_get_state (stream_t stream, enum stream_state *state) | 218 | _stream_stdio_get_state (stream_t stream, enum stream_state *state) |
219 | { | 219 | { |
220 | (void)stream; | 220 | (void)stream; |
221 | if (state == NULL) | 221 | if (state == NULL) |
... | @@ -224,40 +224,39 @@ _fs_get_state (stream_t stream, enum stream_state *state) | ... | @@ -224,40 +224,39 @@ _fs_get_state (stream_t stream, enum stream_state *state) |
224 | return 0; | 224 | return 0; |
225 | } | 225 | } |
226 | 226 | ||
227 | static int | 227 | int |
228 | _fs_is_open (stream_t stream) | 228 | _stream_stdio_is_open (stream_t stream) |
229 | { | 229 | { |
230 | struct _fs *fs = (struct _fs *)stream; | 230 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
231 | return (fs->file) ? 1 : 0; | 231 | return (fs->file) ? 1 : 0; |
232 | } | 232 | } |
233 | 233 | ||
234 | static int | 234 | int |
235 | _fs_is_readready (stream_t stream, int timeout) | 235 | _stream_stdio_is_readready (stream_t stream, int timeout) |
236 | { | 236 | { |
237 | (void)timeout; | 237 | (void)timeout; |
238 | return _fs_is_open (stream); | 238 | return _stream_stdio_is_open (stream); |
239 | } | 239 | } |
240 | 240 | ||
241 | static int | 241 | int |
242 | _fs_is_writeready (stream_t stream, int timeout) | 242 | _stream_stdio_is_writeready (stream_t stream, int timeout) |
243 | { | 243 | { |
244 | (void)timeout; | 244 | (void)timeout; |
245 | return _fs_is_open (stream); | 245 | return _stream_stdio_is_open (stream); |
246 | } | 246 | } |
247 | 247 | ||
248 | static int | 248 | int |
249 | _fs_is_exceptionpending (stream_t stream, int timeout) | 249 | _stream_stdio_is_exceptionpending (stream_t stream, int timeout) |
250 | { | 250 | { |
251 | (void)stream; | 251 | (void)stream; |
252 | (void)timeout; | 252 | (void)timeout; |
253 | return 0; | 253 | return 0; |
254 | } | 254 | } |
255 | 255 | ||
256 | 256 | int | |
257 | static int | 257 | _stream_stdio_close (stream_t stream) |
258 | _fs_close (stream_t stream) | ||
259 | { | 258 | { |
260 | struct _fs *fs = (struct _fs *)stream; | 259 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
261 | int err = 0; | 260 | int err = 0; |
262 | if (fs->file) | 261 | if (fs->file) |
263 | { | 262 | { |
... | @@ -268,10 +267,10 @@ _fs_close (stream_t stream) | ... | @@ -268,10 +267,10 @@ _fs_close (stream_t stream) |
268 | return err; | 267 | return err; |
269 | } | 268 | } |
270 | 269 | ||
271 | static int | 270 | int |
272 | _fs_open (stream_t stream, const char *filename, int port, int flags) | 271 | _stream_stdio_open (stream_t stream, const char *filename, int port, int flags) |
273 | { | 272 | { |
274 | struct _fs *fs = (struct _fs *)stream; | 273 | struct _stream_stdio *fs = (struct _stream_stdio *)stream; |
275 | int flg; | 274 | int flg; |
276 | int fd; | 275 | int fd; |
277 | const char *mode; | 276 | const char *mode; |
... | @@ -371,40 +370,60 @@ _fs_open (stream_t stream, const char *filename, int port, int flags) | ... | @@ -371,40 +370,60 @@ _fs_open (stream_t stream, const char *filename, int port, int flags) |
371 | return 0; | 370 | return 0; |
372 | } | 371 | } |
373 | 372 | ||
374 | static struct _stream_vtable _fs_vtable = | 373 | static struct _stream_vtable _stream_stdio_vtable = |
375 | { | 374 | { |
376 | _fs_ref, | 375 | _stream_stdio_ref, |
377 | _fs_destroy, | 376 | _stream_stdio_destroy, |
378 | 377 | ||
379 | _fs_open, | 378 | _stream_stdio_open, |
380 | _fs_close, | 379 | _stream_stdio_close, |
381 | 380 | ||
382 | _fs_read, | 381 | _stream_stdio_read, |
383 | _fs_readline, | 382 | _stream_stdio_readline, |
384 | _fs_write, | 383 | _stream_stdio_write, |
385 | 384 | ||
386 | _fs_seek, | 385 | _stream_stdio_seek, |
387 | _fs_tell, | 386 | _stream_stdio_tell, |
388 | 387 | ||
389 | _fs_get_size, | 388 | _stream_stdio_get_size, |
390 | _fs_truncate, | 389 | _stream_stdio_truncate, |
391 | _fs_flush, | 390 | _stream_stdio_flush, |
392 | 391 | ||
393 | _fs_get_fd, | 392 | _stream_stdio_get_fd, |
394 | _fs_get_flags, | 393 | _stream_stdio_get_flags, |
395 | _fs_get_state, | 394 | _stream_stdio_get_state, |
396 | 395 | ||
397 | _fs_is_readready, | 396 | _stream_stdio_is_readready, |
398 | _fs_is_writeready, | 397 | _stream_stdio_is_writeready, |
399 | _fs_is_exceptionpending, | 398 | _stream_stdio_is_exceptionpending, |
400 | 399 | ||
401 | _fs_is_open | 400 | _stream_stdio_is_open |
402 | }; | 401 | }; |
403 | 402 | ||
404 | int | 403 | int |
404 | _stream_stdio_ctor (struct _stream_stdio *fs, FILE *fp) | ||
405 | { | ||
406 | mu_refcount_create (&fs->refcount); | ||
407 | if (fs->refcount == NULL) | ||
408 | return MU_ERROR_NO_MEMORY ; | ||
409 | fs->file = fp; | ||
410 | fs->flags = 0; | ||
411 | fs->base.vtable = &_stream_stdio_vtable; | ||
412 | return 0; | ||
413 | } | ||
414 | |||
415 | void | ||
416 | _stream_stdio_dtor (struct _stream_stdio *fs) | ||
417 | { | ||
418 | mu_refcount_destroy (&fs->refcount); | ||
419 | /* We may leak if they did not close the FILE * */ | ||
420 | fs->file = NULL; | ||
421 | } | ||
422 | |||
423 | int | ||
405 | stream_file_create (stream_t *pstream) | 424 | stream_file_create (stream_t *pstream) |
406 | { | 425 | { |
407 | struct _fs *fs; | 426 | struct _stream_stdio *fs; |
408 | 427 | ||
409 | if (pstream == NULL) | 428 | if (pstream == NULL) |
410 | return MU_ERROR_INVALID_PARAMETER; | 429 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -421,7 +440,7 @@ stream_file_create (stream_t *pstream) | ... | @@ -421,7 +440,7 @@ stream_file_create (stream_t *pstream) |
421 | } | 440 | } |
422 | fs->file = NULL; | 441 | fs->file = NULL; |
423 | fs->flags = 0; | 442 | fs->flags = 0; |
424 | fs->base.vtable = &_fs_vtable; | 443 | fs->base.vtable = &_stream_stdio_vtable; |
425 | *pstream = &fs->base; | 444 | *pstream = &fs->base; |
426 | return 0; | 445 | return 0; |
427 | } | 446 | } |
... | @@ -429,7 +448,7 @@ stream_file_create (stream_t *pstream) | ... | @@ -429,7 +448,7 @@ stream_file_create (stream_t *pstream) |
429 | int | 448 | int |
430 | stream_stdio_create (stream_t *pstream, FILE *fp) | 449 | stream_stdio_create (stream_t *pstream, FILE *fp) |
431 | { | 450 | { |
432 | struct _fs *fs; | 451 | struct _stream_stdio *fs; |
433 | 452 | ||
434 | if (pstream == NULL) | 453 | if (pstream == NULL) |
435 | return MU_ERROR_INVALID_PARAMETER; | 454 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -446,7 +465,7 @@ stream_stdio_create (stream_t *pstream, FILE *fp) | ... | @@ -446,7 +465,7 @@ stream_stdio_create (stream_t *pstream, FILE *fp) |
446 | } | 465 | } |
447 | fs->file = fp; | 466 | fs->file = fp; |
448 | fs->flags = 0; | 467 | fs->flags = 0; |
449 | fs->base.vtable = &_fs_vtable; | 468 | fs->base.vtable = &_stream_stdio_vtable; |
450 | *pstream = &fs->base; | 469 | *pstream = &fs->base; |
451 | return 0; | 470 | return 0; |
452 | } | 471 | } | ... | ... |
... | @@ -42,8 +42,6 @@ typedef struct _attribute * attribute_t; | ... | @@ -42,8 +42,6 @@ typedef struct _attribute * attribute_t; |
42 | #define MU_ATTRIBUTE_MODIFIED 0x1000 | 42 | #define MU_ATTRIBUTE_MODIFIED 0x1000 |
43 | #define MU_ATTRIBUTE_RECENT 0x0000 | 43 | #define MU_ATTRIBUTE_RECENT 0x0000 |
44 | 44 | ||
45 | extern int attribute_create __P ((attribute_t *)); | ||
46 | |||
47 | extern int attribute_ref __P ((attribute_t)); | 45 | extern int attribute_ref __P ((attribute_t)); |
48 | extern void attribute_destroy __P ((attribute_t *)); | 46 | extern void attribute_destroy __P ((attribute_t *)); |
49 | 47 | ||
... | @@ -83,6 +81,8 @@ extern int attribute_clear_flags __P ((attribute_t)); | ... | @@ -83,6 +81,8 @@ extern int attribute_clear_flags __P ((attribute_t)); |
83 | extern int attribute_is_equal __P ((attribute_t, attribute_t)); | 81 | extern int attribute_is_equal __P ((attribute_t, attribute_t)); |
84 | extern int attribute_copy __P ((attribute_t dst, attribute_t src)); | 82 | extern int attribute_copy __P ((attribute_t dst, attribute_t src)); |
85 | 83 | ||
84 | extern int attribute_default_create __P ((attribute_t *)); | ||
85 | extern int attribute_status_create __P ((attribute_t *, const char *)); | ||
86 | 86 | ||
87 | #ifdef __cplusplus | 87 | #ifdef __cplusplus |
88 | } | 88 | } | ... | ... |
... | @@ -15,8 +15,8 @@ | ... | @@ -15,8 +15,8 @@ |
15 | along with this program; if not, write to the Free Software | 15 | along with this program; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
17 | 17 | ||
18 | #ifndef _MAILUTILS_LOCKER_H | 18 | #ifndef _MAILUTILS_LOCKFILE_H |
19 | #define _MAILUTILS_LOCKER_H | 19 | #define _MAILUTILS_LOCKFILE_H |
20 | 20 | ||
21 | #include <sys/types.h> | 21 | #include <sys/types.h> |
22 | 22 | ||
... | @@ -32,21 +32,21 @@ extern "C" { | ... | @@ -32,21 +32,21 @@ extern "C" { |
32 | # endif | 32 | # endif |
33 | #endif /*__P */ | 33 | #endif /*__P */ |
34 | 34 | ||
35 | struct _locker; | 35 | struct _lockfile; |
36 | typedef struct _locker *locker_t; | 36 | typedef struct _lockfile *lockfile_t; |
37 | 37 | ||
38 | extern int locker_ref __P ((locker_t)); | 38 | extern int lockfile_ref __P ((lockfile_t)); |
39 | extern void locker_destroy __P ((locker_t *)); | 39 | extern void lockfile_destroy __P ((lockfile_t *)); |
40 | 40 | ||
41 | extern int locker_lock __P ((locker_t)); | 41 | extern int lockfile_lock __P ((lockfile_t)); |
42 | extern int locker_touchlock __P ((locker_t)); | 42 | extern int lockfile_touchlock __P ((lockfile_t)); |
43 | extern int locker_unlock __P ((locker_t)); | 43 | extern int lockfile_unlock __P ((lockfile_t)); |
44 | 44 | ||
45 | extern int locker_dotlock_create __P ((locker_t *, const char *filename)); | 45 | extern int lockfile_dotlock_create __P ((lockfile_t *, const char *filename)); |
46 | extern int locker_nfslock_create __P ((locker_t *, const char *filename)); | 46 | extern int lockfile_nfslock_create __P ((lockfile_t *, const char *filename)); |
47 | 47 | ||
48 | #ifdef __cplusplus | 48 | #ifdef __cplusplus |
49 | } | 49 | } |
50 | #endif | 50 | #endif |
51 | 51 | ||
52 | #endif /* _MAILUTILS_MAILBOX_H */ | 52 | #endif /* _MAILUTILS_LOCKFILE_H */ | ... | ... |
... | @@ -41,7 +41,7 @@ extern int mbox_create __P ((mbox_t *)); | ... | @@ -41,7 +41,7 @@ extern int mbox_create __P ((mbox_t *)); |
41 | extern void mbox_destroy __P ((mbox_t *)); | 41 | extern void mbox_destroy __P ((mbox_t *)); |
42 | 42 | ||
43 | extern int mbox_get_uidvalidity __P ((mbox_t, unsigned long *)); | 43 | extern int mbox_get_uidvalidity __P ((mbox_t, unsigned long *)); |
44 | extern int mbox_get_uidnext __P ((mbox_t, unsigned long)); | 44 | extern int mbox_get_uidnext __P ((mbox_t, unsigned long *)); |
45 | 45 | ||
46 | extern int mbox_open __P ((mbox_t, const char *, int)); | 46 | extern int mbox_open __P ((mbox_t, const char *, int)); |
47 | extern int mbox_close __P ((mbox_t)); | 47 | extern int mbox_close __P ((mbox_t)); |
... | @@ -57,7 +57,7 @@ extern int mbox_set_hstream __P ((mbox_t, unsigned int, stream_t)); | ... | @@ -57,7 +57,7 @@ extern int mbox_set_hstream __P ((mbox_t, unsigned int, stream_t)); |
57 | extern int mbox_get_hsize __P ((mbox_t, unsigned int, unsigned int *)); | 57 | extern int mbox_get_hsize __P ((mbox_t, unsigned int, unsigned int *)); |
58 | extern int mbox_get_hlines __P ((mbox_t, unsigned int, unsigned int *)); | 58 | extern int mbox_get_hlines __P ((mbox_t, unsigned int, unsigned int *)); |
59 | 59 | ||
60 | extern int mbox_get_bstream __P ((mbox_t, unsigned int, stream_t int *)); | 60 | extern int mbox_get_bstream __P ((mbox_t, unsigned int, stream_t *)); |
61 | extern int mbox_set_bstream __P ((mbox_t, unsigned int, stream_t)); | 61 | extern int mbox_set_bstream __P ((mbox_t, unsigned int, stream_t)); |
62 | extern int mbox_get_bsize __P ((mbox_t, unsigned int, unsigned int *)); | 62 | extern int mbox_get_bsize __P ((mbox_t, unsigned int, unsigned int *)); |
63 | extern int mbox_get_blines __P ((mbox_t, unsigned int, unsigned int *)); | 63 | extern int mbox_get_blines __P ((mbox_t, unsigned int, unsigned int *)); |
... | @@ -75,12 +75,18 @@ extern int mbox_set_newmsg_cb __P ((mbox_t, int (*) __P ((int, void *)), void | ... | @@ -75,12 +75,18 @@ extern int mbox_set_newmsg_cb __P ((mbox_t, int (*) __P ((int, void *)), void |
75 | extern int mbox_newmsg_cb __P ((mbox_t, int)); | 75 | extern int mbox_newmsg_cb __P ((mbox_t, int)); |
76 | extern int mbox_progress_cb __P ((mbox_t, int)); | 76 | extern int mbox_progress_cb __P ((mbox_t, int)); |
77 | 77 | ||
78 | extern int mbox_scan __P ((mbox_t, unsigned int, unsigned int *)); | 78 | extern int mbox_scan __P ((mbox_t, unsigned int, unsigned int *, int)); |
79 | extern int mbox_messages_count __P ((mbox_t, unsigned int *)); | 79 | extern int mbox_messages_count __P ((mbox_t, unsigned int *)); |
80 | 80 | ||
81 | extern int mbox_append __P ((mbox_t, const char *, stream_t)); | 81 | extern int mbox_append __P ((mbox_t, const char *, stream_t)); |
82 | extern int mbox_append_hb __P ((mbox_t, const char *, stream_t, stream_t)); | 82 | extern int mbox_append_hb __P ((mbox_t, const char *, stream_t, stream_t)); |
83 | 83 | ||
84 | extern int mbox_get_carrier __P ((mbox_t, stream_t *)); | ||
85 | extern int mbox_set_carrier __P ((mbox_t, stream_t)); | ||
86 | |||
87 | extern int mbox_set_hcache __P ((mbox_t, char **, unsigned int)); | ||
88 | extern int mbox_hcache_get_value __P ((mbox_t, const char *, char *, size_t, | ||
89 | size_t *)); | ||
84 | 90 | ||
85 | #ifdef __cplusplus | 91 | #ifdef __cplusplus |
86 | } | 92 | } | ... | ... |
... | @@ -81,8 +81,8 @@ extern int stream_is_open __P ((stream_t)); | ... | @@ -81,8 +81,8 @@ extern int stream_is_open __P ((stream_t)); |
81 | /* Misc. */ | 81 | /* Misc. */ |
82 | extern int stream_file_create __P ((stream_t *)); | 82 | extern int stream_file_create __P ((stream_t *)); |
83 | extern int stream_stdio_create __P ((stream_t *, FILE *)); | 83 | extern int stream_stdio_create __P ((stream_t *, FILE *)); |
84 | extern int stream_mapfile_create __P ((stream_t *)); | 84 | extern int stream_mmap_create __P ((stream_t *)); |
85 | extern int stream_memory_create __P ((stream_t *)); | 85 | extern int stream_memory_create __P ((stream_t *, size_t)); |
86 | extern int stream_tcp_create __P ((stream_t *)); | 86 | extern int stream_tcp_create __P ((stream_t *)); |
87 | extern int stream_fd_create __P ((stream_t *, int)); | 87 | extern int stream_fd_create __P ((stream_t *, int)); |
88 | extern int stream_buffer_create __P ((stream_t *, stream_t, size_t)); | 88 | extern int stream_buffer_create __P ((stream_t *, stream_t, size_t)); | ... | ... |
... | @@ -5,6 +5,7 @@ pkginclude_HEADERS = \ | ... | @@ -5,6 +5,7 @@ pkginclude_HEADERS = \ |
5 | attribute.h \ | 5 | attribute.h \ |
6 | authority.h \ | 6 | authority.h \ |
7 | bstream.h \ | 7 | bstream.h \ |
8 | dattribute.h \ | ||
8 | debug.h \ | 9 | debug.h \ |
9 | envelope.h \ | 10 | envelope.h \ |
10 | folder.h \ | 11 | folder.h \ |
... | @@ -12,15 +13,16 @@ pkginclude_HEADERS = \ | ... | @@ -12,15 +13,16 @@ pkginclude_HEADERS = \ |
12 | header.h \ | 13 | header.h \ |
13 | iterator.h \ | 14 | iterator.h \ |
14 | list.h \ | 15 | list.h \ |
15 | locker.h \ | 16 | lockfile.h \ |
16 | mailbox.h \ | 17 | mailbox.h \ |
17 | mbox.h \ | 18 | mbox.h \ |
19 | mapstream.h \ | ||
18 | memstream.h \ | 20 | memstream.h \ |
19 | message.h \ | 21 | message.h \ |
20 | mstream.h \ | ||
21 | observable.h \ | 22 | observable.h \ |
22 | observer.h \ | 23 | observer.h \ |
23 | pop3.h \ | 24 | pop3.h \ |
25 | pticket.h \ | ||
24 | refcount.h \ | 26 | refcount.h \ |
25 | sdebug.h \ | 27 | sdebug.h \ |
26 | stream.h \ | 28 | stream.h \ | ... | ... |
... | @@ -21,6 +21,10 @@ | ... | @@ -21,6 +21,10 @@ |
21 | #include <mailutils/sys/stream.h> | 21 | #include <mailutils/sys/stream.h> |
22 | #include <mailutils/refcount.h> | 22 | #include <mailutils/refcount.h> |
23 | 23 | ||
24 | #ifdef __cplusplus | ||
25 | extern "C" { | ||
26 | #endif | ||
27 | |||
24 | /* Read buffer */ | 28 | /* Read buffer */ |
25 | struct _rbuffer | 29 | struct _rbuffer |
26 | { | 30 | { |
... | @@ -30,7 +34,7 @@ struct _rbuffer | ... | @@ -30,7 +34,7 @@ struct _rbuffer |
30 | size_t bufsize; | 34 | size_t bufsize; |
31 | }; | 35 | }; |
32 | 36 | ||
33 | struct _bs | 37 | struct _stream_buffer |
34 | { | 38 | { |
35 | struct _stream base; | 39 | struct _stream base; |
36 | mu_refcount_t refcount; | 40 | mu_refcount_t refcount; |
... | @@ -38,4 +42,30 @@ struct _bs | ... | @@ -38,4 +42,30 @@ struct _bs |
38 | struct _rbuffer rbuffer; | 42 | struct _rbuffer rbuffer; |
39 | }; | 43 | }; |
40 | 44 | ||
45 | extern int _stream_buffer_ctor __P ((struct _stream_buffer *, stream_t, size_t)); | ||
46 | extern void _stream_buffer_dtor __P ((struct _stream_buffer *)); | ||
47 | extern int _stream_buffer_ref __P ((stream_t)); | ||
48 | extern void _stream_buffer_destroy __P ((stream_t *)); | ||
49 | extern int _stream_buffer_open __P ((stream_t, const char *, int, int)); | ||
50 | extern int _stream_buffer_close __P ((stream_t)); | ||
51 | extern int _stream_buffer_read __P ((stream_t, void *, size_t, size_t *)); | ||
52 | extern int _stream_buffer_readline __P ((stream_t, char *, size_t, size_t *)); | ||
53 | extern int _stream_buffer_write __P ((stream_t, const void *, size_t, size_t *)); | ||
54 | extern int _stream_buffer_get_fd __P ((stream_t, int *)); | ||
55 | extern int _stream_buffer_get_flags __P ((stream_t, int *)); | ||
56 | extern int _stream_buffer_get_size __P ((stream_t, off_t *)); | ||
57 | extern int _stream_buffer_truncate __P ((stream_t, off_t)); | ||
58 | extern int _stream_buffer_flush __P ((stream_t)); | ||
59 | extern int _stream_buffer_get_state __P ((stream_t, enum stream_state *)); | ||
60 | extern int _stream_buffer_seek __P ((stream_t, off_t, enum stream_whence)); | ||
61 | extern int _stream_buffer_tell __P ((stream_t, off_t *)); | ||
62 | extern int _stream_buffer_is_readready __P ((stream_t, int )); | ||
63 | extern int _stream_buffer_is_writeready __P ((stream_t, int)); | ||
64 | extern int _stream_buffer_is_exceptionpending __P ((stream_t, int)); | ||
65 | extern int _stream_buffer_is_open __P ((stream_t)); | ||
66 | |||
67 | #ifdef __cplusplus | ||
68 | } | ||
69 | #endif | ||
70 | |||
41 | #endif /* _MAILUTILS_SYS_BSTREAM_H */ | 71 | #endif /* _MAILUTILS_SYS_BSTREAM_H */ | ... | ... |
mailbox2/include/mailutils/sys/dattribute.h
0 → 100644
1 | /* GNU mailutils - a suite of utilities for electronic mail | ||
2 | Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Library Public License as published by | ||
6 | the Free Software Foundation; either version 2, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU Library General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU Library General Public License | ||
15 | along with this program; if not, write to the Free Software | ||
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
17 | |||
18 | #ifndef _MAILUTILS_SYS_DATTRIBUTE_H | ||
19 | # define _MAILUTILS_SYS_DATTRIBUTE_H | ||
20 | |||
21 | #ifdef DMALLOC | ||
22 | # include <dmalloc.h> | ||
23 | #endif | ||
24 | |||
25 | #include <mailutils/sys/attribute.h> | ||
26 | #include <mailutils/refcount.h> | ||
27 | |||
28 | #ifdef __cplusplus | ||
29 | extern "C" { | ||
30 | #endif | ||
31 | |||
32 | /* A simple default attribute implementation. */ | ||
33 | struct _attribute_default | ||
34 | { | ||
35 | struct _attribute base; | ||
36 | mu_refcount_t refcount; | ||
37 | int flags; | ||
38 | }; | ||
39 | |||
40 | extern int _attribute_default_ctor __P ((struct _attribute_default *)); | ||
41 | extern void _attribute_default_dtor __P ((struct _attribute_default *)); | ||
42 | extern int _attribute_default_ref __P ((attribute_t)); | ||
43 | extern void _attribute_default_destroy __P ((attribute_t *)); | ||
44 | |||
45 | extern int _attribute_default_get_flags __P ((attribute_t, int *)); | ||
46 | extern int _attribute_default_set_flags __P ((attribute_t, int)); | ||
47 | extern int _attribute_default_unset_flags __P ((attribute_t, int)); | ||
48 | extern int _attribute_default_clear_flags __P ((attribute_t)); | ||
49 | |||
50 | #ifdef __cplusplus | ||
51 | } | ||
52 | #endif | ||
53 | |||
54 | #endif /* _MAILUTILS_SYS_ATTRIBUTE_H */ |
mailbox2/include/mailutils/sys/dotlock.h
0 → 100644
1 | /* GNU mailutils - a suite of utilities for electronic mail | ||
2 | Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Library Public License as published by | ||
6 | the Free Software Foundation; either version 2, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU Library General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU Library General Public License | ||
15 | along with this program; if not, write to the Free Software | ||
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
17 | |||
18 | #ifndef _MAILUTILS_SYS_DOTLOCK_H | ||
19 | #define _MAILUTILS_SYS_DOTLOCK_H | ||
20 | |||
21 | #ifdef DMALLOC | ||
22 | #include <dmalloc.h> | ||
23 | #endif | ||
24 | |||
25 | #include <mailutils/refcount.h> | ||
26 | #include <mailutils/sys/lockfile.h> | ||
27 | |||
28 | #ifdef __cplusplus | ||
29 | extern "C" { | ||
30 | #endif | ||
31 | |||
32 | /* locking flags */ | ||
33 | #define MU_LOCKFILE_DOTLOCK_PID 1 | ||
34 | #define MU_LOCKFILE_DOTLOCK_FCNTL 2 | ||
35 | #define MU_LOCKFILE_DOTLOCK_TIME 4 | ||
36 | |||
37 | #define MU_LOCKFILE_DOTLOCK_EXPIRE_TIME (5 * 60) | ||
38 | |||
39 | #define MU_LOCKFILE_DOTLOCK_ATTR 0444 | ||
40 | |||
41 | struct _lockfile_dotlock | ||
42 | { | ||
43 | struct _lockfile base; | ||
44 | mu_refcount_t refcount; | ||
45 | int fd; | ||
46 | int refcnt; /* For recursive file locking. */ | ||
47 | char *fname; | ||
48 | int flags; | ||
49 | }; | ||
50 | |||
51 | extern int _lockfile_dotlock_ctor __P ((struct _lockfile_dotlock *, const char *)); | ||
52 | extern void _lockfile_dotlock_dtor __P ((struct _lockfile_dotlock *)); | ||
53 | extern int _lockfile_dotlock_ref __P ((lockfile_t)); | ||
54 | extern void _lockfile_dotlock_destroy __P ((lockfile_t *)); | ||
55 | |||
56 | extern int _lockfile_dotlock_lock __P ((lockfile_t)); | ||
57 | extern int _lockfile_dotlock_touchlock __P ((lockfile_t)); | ||
58 | extern int _lockfile_dotlock_unlock __P ((lockfile_t)); | ||
59 | |||
60 | #ifdef __cplusplus | ||
61 | } | ||
62 | #endif | ||
63 | |||
64 | #endif /* _MAILUTILS_SYS_DOTLOCK_H */ |
... | @@ -21,7 +21,11 @@ | ... | @@ -21,7 +21,11 @@ |
21 | #include <mailutils/refcount.h> | 21 | #include <mailutils/refcount.h> |
22 | #include <mailutils/sys/stream.h> | 22 | #include <mailutils/sys/stream.h> |
23 | 23 | ||
24 | struct _fds | 24 | #ifdef __cplusplus |
25 | extern "C" { | ||
26 | #endif | ||
27 | |||
28 | struct _stream_fd | ||
25 | { | 29 | { |
26 | struct _stream base; | 30 | struct _stream base; |
27 | mu_refcount_t refcount; | 31 | mu_refcount_t refcount; |
... | @@ -30,4 +34,31 @@ struct _fds | ... | @@ -30,4 +34,31 @@ struct _fds |
30 | int flags; | 34 | int flags; |
31 | }; | 35 | }; |
32 | 36 | ||
37 | int _stream_fd_ctor __P ((struct _stream_fd *, int)); | ||
38 | void _stream_fd_dtor __P ((struct _stream_fd *)); | ||
39 | |||
40 | int _stream_fd_ref __P ((stream_t)); | ||
41 | void _stream_fd_destroy __P ((stream_t *)); | ||
42 | int _stream_fd_open __P ((stream_t, const char *, int, int)); | ||
43 | int _stream_fd_close __P ((stream_t)); | ||
44 | int _stream_fd_read __P ((stream_t, void *, size_t, size_t *)); | ||
45 | int _stream_fd_readline __P ((stream_t, char *, size_t, size_t *)); | ||
46 | int _stream_fd_write __P ((stream_t, const void *, size_t, size_t *)); | ||
47 | int _stream_fd_get_fd __P ((stream_t, int *)); | ||
48 | int _stream_fd_get_flags __P ((stream_t, int *)); | ||
49 | int _stream_fd_get_size __P ((stream_t, off_t *)); | ||
50 | int _stream_fd_truncate __P ((stream_t, off_t)); | ||
51 | int _stream_fd_flush __P ((stream_t)); | ||
52 | int _stream_fd_get_state __P ((stream_t, enum stream_state *)); | ||
53 | int _stream_fd_seek __P ((stream_t, off_t, enum stream_whence)); | ||
54 | int _stream_fd_tell __P ((stream_t, off_t *)); | ||
55 | int _stream_fd_is_readready __P ((stream_t, int )); | ||
56 | int _stream_fd_is_writeready __P ((stream_t, int)); | ||
57 | int _stream_fd_is_exceptionpending __P ((stream_t, int)); | ||
58 | int _stream_fd_is_open __P ((stream_t)); | ||
59 | |||
60 | #ifdef __cplusplus | ||
61 | } | ||
62 | #endif | ||
63 | |||
33 | #endif /* _MAILUTILS_SYS_FDSTREAM_H */ | 64 | #endif /* _MAILUTILS_SYS_FDSTREAM_H */ | ... | ... |
... | @@ -21,7 +21,11 @@ | ... | @@ -21,7 +21,11 @@ |
21 | #include <mailutils/sys/stream.h> | 21 | #include <mailutils/sys/stream.h> |
22 | #include <mailutils/refcount.h> | 22 | #include <mailutils/refcount.h> |
23 | 23 | ||
24 | struct _fs | 24 | #ifdef __cplusplus |
25 | extern "C" { | ||
26 | #endif | ||
27 | |||
28 | struct _stream_stdio | ||
25 | { | 29 | { |
26 | struct _stream base; | 30 | struct _stream base; |
27 | mu_refcount_t refcount; | 31 | mu_refcount_t refcount; |
... | @@ -29,4 +33,30 @@ struct _fs | ... | @@ -29,4 +33,30 @@ struct _fs |
29 | FILE *file; | 33 | FILE *file; |
30 | }; | 34 | }; |
31 | 35 | ||
36 | extern int _stream_stdio_ctor __P ((struct _stream_stdio *, FILE *)); | ||
37 | extern void _stream_stdio_dtor __P ((struct _stream_stdio *)); | ||
38 | extern int _stream_stdio_ref __P ((stream_t)); | ||
39 | extern void _stream_stdio_destroy __P ((stream_t *)); | ||
40 | extern int _stream_stdio_open __P ((stream_t, const char *, int, int)); | ||
41 | extern int _stream_stdio_close __P ((stream_t)); | ||
42 | extern int _stream_stdio_read __P ((stream_t, void *, size_t, size_t *)); | ||
43 | extern int _stream_stdio_readline __P ((stream_t, char *, size_t, size_t *)); | ||
44 | extern int _stream_stdio_write __P ((stream_t, const void *, size_t, size_t *)); | ||
45 | extern int _stream_stdio_get_fd __P ((stream_t, int *)); | ||
46 | extern int _stream_stdio_get_flags __P ((stream_t, int *)); | ||
47 | extern int _stream_stdio_get_size __P ((stream_t, off_t *)); | ||
48 | extern int _stream_stdio_truncate __P ((stream_t, off_t)); | ||
49 | extern int _stream_stdio_flush __P ((stream_t)); | ||
50 | extern int _stream_stdio_get_state __P ((stream_t, enum stream_state *)); | ||
51 | extern int _stream_stdio_seek __P ((stream_t, off_t, enum stream_whence)); | ||
52 | extern int _stream_stdio_tell __P ((stream_t, off_t *)); | ||
53 | extern int _stream_stdio_is_readready __P ((stream_t, int )); | ||
54 | extern int _stream_stdio_is_writeready __P ((stream_t, int)); | ||
55 | extern int _stream_stdio_is_exceptionpending __P ((stream_t, int)); | ||
56 | extern int _stream_stdio_is_open __P ((stream_t)); | ||
57 | |||
58 | #ifdef __cplusplus | ||
59 | } | ||
60 | #endif | ||
61 | |||
32 | #endif /* _MAILUTILS_SYS_FSTREAM_H */ | 62 | #endif /* _MAILUTILS_SYS_FSTREAM_H */ | ... | ... |
... | @@ -15,14 +15,14 @@ | ... | @@ -15,14 +15,14 @@ |
15 | along with this program; if not, write to the Free Software | 15 | along with this program; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
17 | 17 | ||
18 | #ifndef _MAILUTILS_SYS_LOCKER_H | 18 | #ifndef _MAILUTILS_SYS_LOCKFILE_H |
19 | #define _MAILUTILS_SYS_LOCKER_H | 19 | #define _MAILUTILS_SYS_LOCKFILE_H |
20 | 20 | ||
21 | #ifdef DMALLOC | 21 | #ifdef DMALLOC |
22 | #include <dmalloc.h> | 22 | #include <dmalloc.h> |
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | #include <mailutils/locker.h> | 25 | #include <mailutils/lockfile.h> |
26 | 26 | ||
27 | #ifdef __cplusplus | 27 | #ifdef __cplusplus |
28 | extern "C" { | 28 | extern "C" { |
... | @@ -36,23 +36,23 @@ extern "C" { | ... | @@ -36,23 +36,23 @@ extern "C" { |
36 | # endif | 36 | # endif |
37 | #endif /*__P */ | 37 | #endif /*__P */ |
38 | 38 | ||
39 | struct _locker_vtable | 39 | struct _lockfile_vtable |
40 | { | 40 | { |
41 | int (*ref) __P ((locker_t)); | 41 | int (*ref) __P ((lockfile_t)); |
42 | void (*destroy) __P ((locker_t *)); | 42 | void (*destroy) __P ((lockfile_t *)); |
43 | 43 | ||
44 | int (*lock) __P ((locker_t)); | 44 | int (*lock) __P ((lockfile_t)); |
45 | int (*touchlock) __P ((locker_t)); | 45 | int (*touchlock) __P ((lockfile_t)); |
46 | int (*unlock) __P ((locker_t)); | 46 | int (*unlock) __P ((lockfile_t)); |
47 | }; | 47 | }; |
48 | 48 | ||
49 | struct _locker | 49 | struct _lockfile |
50 | { | 50 | { |
51 | struct _locker_vtable *vtable; | 51 | struct _lockfile_vtable *vtable; |
52 | }; | 52 | }; |
53 | 53 | ||
54 | #ifdef __cplusplus | 54 | #ifdef __cplusplus |
55 | } | 55 | } |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | #endif /* _MAILUTILS_SYS_ENVELOPE_H */ | 58 | #endif /* _MAILUTILS_SYS_LOCKFILE_H */ | ... | ... |
... | @@ -18,10 +18,18 @@ | ... | @@ -18,10 +18,18 @@ |
18 | #ifndef MAILUTILS_SYS_MSTREAM_H | 18 | #ifndef MAILUTILS_SYS_MSTREAM_H |
19 | #define MAILUTILS_SYS_MSTREAM_H | 19 | #define MAILUTILS_SYS_MSTREAM_H |
20 | 20 | ||
21 | #include <unistd.h> | ||
22 | |||
21 | #include <mailutils/sys/stream.h> | 23 | #include <mailutils/sys/stream.h> |
22 | #include <mailutils/refcount.h> | 24 | #include <mailutils/refcount.h> |
23 | 25 | ||
24 | struct _ms | 26 | #ifdef _POSIX_MAPPED_FILES |
27 | |||
28 | #ifdef __cplusplus | ||
29 | extern "C" { | ||
30 | #endif | ||
31 | |||
32 | struct _stream_mmap | ||
25 | { | 33 | { |
26 | struct _stream base; | 34 | struct _stream base; |
27 | mu_refcount_t refcount; | 35 | mu_refcount_t refcount; |
... | @@ -33,4 +41,31 @@ struct _ms | ... | @@ -33,4 +41,31 @@ struct _ms |
33 | off_t offset; | 41 | off_t offset; |
34 | }; | 42 | }; |
35 | 43 | ||
44 | extern int _stream_mmap_ctor __P ((struct _stream_mmap *)); | ||
45 | extern void _stream_mmap_dtor __P ((struct _stream_mmap *)); | ||
46 | extern int _stream_mmap_ref __P ((stream_t)); | ||
47 | extern void _stream_mmap_destroy __P ((stream_t *)); | ||
48 | extern int _stream_mmap_open __P ((stream_t, const char *, int, int)); | ||
49 | extern int _stream_mmap_close __P ((stream_t)); | ||
50 | extern int _stream_mmap_read __P ((stream_t, void *, size_t, size_t *)); | ||
51 | extern int _stream_mmap_readline __P ((stream_t, char *, size_t, size_t *)); | ||
52 | extern int _stream_mmap_write __P ((stream_t, const void *, size_t, size_t *)); | ||
53 | extern int _stream_mmap_get_fd __P ((stream_t, int *)); | ||
54 | extern int _stream_mmap_get_flags __P ((stream_t, int *)); | ||
55 | extern int _stream_mmap_get_size __P ((stream_t, off_t *)); | ||
56 | extern int _stream_mmap_truncate __P ((stream_t, off_t)); | ||
57 | extern int _stream_mmap_flush __P ((stream_t)); | ||
58 | extern int _stream_mmap_get_state __P ((stream_t, enum stream_state *)); | ||
59 | extern int _stream_mmap_seek __P ((stream_t, off_t, enum stream_whence)); | ||
60 | extern int _stream_mmap_tell __P ((stream_t, off_t *)); | ||
61 | extern int _stream_mmap_is_readready __P ((stream_t, int )); | ||
62 | extern int _stream_mmap_is_writeready __P ((stream_t, int)); | ||
63 | extern int _stream_mmap_is_exceptionpending __P ((stream_t, int)); | ||
64 | extern int _stream_mmap_is_open __P ((stream_t)); | ||
65 | #endif | ||
66 | |||
67 | #ifdef __cplusplus | ||
68 | } | ||
69 | #endif | ||
70 | |||
36 | #endif /* _MAILUTILS_SYS_MSTREAM_H */ | 71 | #endif /* _MAILUTILS_SYS_MSTREAM_H */ | ... | ... |
... | @@ -19,7 +19,7 @@ | ... | @@ -19,7 +19,7 @@ |
19 | #define _MAILUTILS_SYS_MBOX_H | 19 | #define _MAILUTILS_SYS_MBOX_H |
20 | 20 | ||
21 | #include <time.h> | 21 | #include <time.h> |
22 | #include <mailutils/locker.h> | 22 | #include <mailutils/lockfile.h> |
23 | #include <mailutils/mbox.h> | 23 | #include <mailutils/mbox.h> |
24 | 24 | ||
25 | #ifdef __cplusplus | 25 | #ifdef __cplusplus |
... | @@ -28,35 +28,6 @@ extern "C" { | ... | @@ -28,35 +28,6 @@ extern "C" { |
28 | 28 | ||
29 | typedef struct _mbox_message* mbox_message_t; | 29 | typedef struct _mbox_message* mbox_message_t; |
30 | 30 | ||
31 | |||
32 | /* Keep the file positions of where the headers and bodies start and end. | ||
33 | attribute is the "Status:" message. */ | ||
34 | struct _mbox_message | ||
35 | { | ||
36 | /* Offset of the messages in the mailbox. */ | ||
37 | off_t from_; | ||
38 | |||
39 | /* Fast header retrieve, we save here the most common headers. This will | ||
40 | speed the header search. The entire headers are copied, when modified, | ||
41 | by the header_t object, we do not have to worry about updating them. */ | ||
42 | char **fhdr; | ||
43 | |||
44 | struct | ||
45 | { | ||
46 | stream_t stream; | ||
47 | unsigned int lines; | ||
48 | unsigned int size; | ||
49 | off_t start; | ||
50 | off_t end; | ||
51 | } header, body; | ||
52 | |||
53 | /* UID i.e. see IMAP */ | ||
54 | unsigned long uid; | ||
55 | attribute_t attribute; /* The attr_flags contains the "Status:" attribute */ | ||
56 | |||
57 | mbox_t mbox; /* Back pointer. */ | ||
58 | }; | ||
59 | |||
60 | /* The umessages is an array of pointers that contains umessages_count of | 31 | /* The umessages is an array of pointers that contains umessages_count of |
61 | mbox_message_t*; umessages[umessages_count]. We do it this way because | 32 | mbox_message_t*; umessages[umessages_count]. We do it this way because |
62 | realloc() can move everything to a new memory region and invalidate all | 33 | realloc() can move everything to a new memory region and invalidate all |
... | @@ -85,8 +56,7 @@ struct _mbox | ... | @@ -85,8 +56,7 @@ struct _mbox |
85 | MBOX_STATE_APPEND_BODY | 56 | MBOX_STATE_APPEND_BODY |
86 | } state ; | 57 | } state ; |
87 | 58 | ||
88 | locker_t locker; | 59 | lockfile_t lockfile; |
89 | |||
90 | struct | 60 | struct |
91 | { | 61 | { |
92 | int (*cb) __P ((int, void *)); | 62 | int (*cb) __P ((int, void *)); |
... | @@ -94,6 +64,35 @@ struct _mbox | ... | @@ -94,6 +64,35 @@ struct _mbox |
94 | } newmsg, progress, corrupt; | 64 | } newmsg, progress, corrupt; |
95 | }; | 65 | }; |
96 | 66 | ||
67 | /* Keep the file positions of where the headers and bodies start and end. | ||
68 | attribute is the "Status:" message. */ | ||
69 | struct _mbox_message | ||
70 | { | ||
71 | /* Offset of the messages in the mailbox. */ | ||
72 | off_t from_; | ||
73 | |||
74 | /* Fast header retrieve, we save here the most common headers. This will | ||
75 | speed the header search. The entire headers are copied, when modified, | ||
76 | by the header_t object, we do not have to worry about updating them. */ | ||
77 | char **fhdr; | ||
78 | |||
79 | struct | ||
80 | { | ||
81 | stream_t stream; | ||
82 | unsigned int lines; | ||
83 | unsigned int size; | ||
84 | off_t start; | ||
85 | off_t end; | ||
86 | } header, body; | ||
87 | |||
88 | /* UID i.e. see IMAP */ | ||
89 | unsigned long uid; | ||
90 | unsigned int attr_flags; | ||
91 | attribute_t attribute; /* The attr_flags contains the "Status:" attribute */ | ||
92 | |||
93 | mbox_t mbox; /* Back pointer. */ | ||
94 | }; | ||
95 | |||
97 | #ifdef __cplusplus | 96 | #ifdef __cplusplus |
98 | } | 97 | } |
99 | #endif | 98 | #endif | ... | ... |
... | @@ -23,14 +23,49 @@ | ... | @@ -23,14 +23,49 @@ |
23 | #include <mailutils/refcount.h> | 23 | #include <mailutils/refcount.h> |
24 | #include <mailutils/sys/stream.h> | 24 | #include <mailutils/sys/stream.h> |
25 | 25 | ||
26 | struct _memory_stream | 26 | #ifdef __cplusplus |
27 | extern "C" { | ||
28 | #endif | ||
29 | |||
30 | #ifndef MU_STREAM_MEMORY_BLOCKSIZE | ||
31 | #define MU_STREAM_MEMORY_BLOCKSIZE 512 | ||
32 | #endif | ||
33 | |||
34 | struct _stream_memory | ||
27 | { | 35 | { |
28 | struct _stream base; | 36 | struct _stream base; |
29 | mu_refcount_t refcount; | 37 | mu_refcount_t refcount; |
30 | char *ptr; | 38 | char *ptr; |
31 | size_t size; | 39 | size_t capacity; |
32 | off_t offset; | 40 | size_t size; |
41 | off_t offset; | ||
33 | int flags; | 42 | int flags; |
34 | }; | 43 | }; |
35 | 44 | ||
45 | extern int _stream_memory_ctor __P ((struct _stream_memory *, size_t)); | ||
46 | extern void _stream_memory_dtor __P ((struct _stream_memory *)); | ||
47 | extern int _stream_memory_ref __P ((stream_t)); | ||
48 | extern void _stream_memory_destroy __P ((stream_t *)); | ||
49 | extern int _stream_memory_open __P ((stream_t, const char *, int, int)); | ||
50 | extern int _stream_memory_close __P ((stream_t)); | ||
51 | extern int _stream_memory_read __P ((stream_t, void *, size_t, size_t *)); | ||
52 | extern int _stream_memory_readline __P ((stream_t, char *, size_t, size_t *)); | ||
53 | extern int _stream_memory_write __P ((stream_t, const void *, size_t, size_t *)); | ||
54 | extern int _stream_memory_get_fd __P ((stream_t, int *)); | ||
55 | extern int _stream_memory_get_flags __P ((stream_t, int *)); | ||
56 | extern int _stream_memory_get_size __P ((stream_t, off_t *)); | ||
57 | extern int _stream_memory_truncate __P ((stream_t, off_t)); | ||
58 | extern int _stream_memory_flush __P ((stream_t)); | ||
59 | extern int _stream_memory_get_state __P ((stream_t, enum stream_state *)); | ||
60 | extern int _stream_memory_seek __P ((stream_t, off_t, enum stream_whence)); | ||
61 | extern int _stream_memory_tell __P ((stream_t, off_t *)); | ||
62 | extern int _stream_memory_is_readready __P ((stream_t, int )); | ||
63 | extern int _stream_memory_is_writeready __P ((stream_t, int)); | ||
64 | extern int _stream_memory_is_exceptionpending __P ((stream_t, int)); | ||
65 | extern int _stream_memory_is_open __P ((stream_t)); | ||
66 | |||
67 | #ifdef __cplusplus | ||
68 | } | ||
69 | #endif | ||
70 | |||
36 | #endif /* _MAILUTILS_SYS_MEMSTREAM_H */ | 71 | #endif /* _MAILUTILS_SYS_MEMSTREAM_H */ | ... | ... |
mailbox2/include/mailutils/sys/pticket.h
0 → 100644
1 | /* GNU mailutils - a suite of utilities for electronic mail | ||
2 | Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. | ||
3 | |||
4 | This program is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Library Public License as published by | ||
6 | the Free Software Foundation; either version 2, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU Library General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU Library General Public License | ||
15 | along with this program; if not, write to the Free Software | ||
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
17 | |||
18 | #ifndef _MAILUTILS_SYS_PTICKET_H | ||
19 | #define _MAILUTILS_SYS_PTICKET_H | ||
20 | |||
21 | #include <mailutils/sys/ticket.h> | ||
22 | |||
23 | #ifdef __cplusplus | ||
24 | extern "C" { | ||
25 | #endif | ||
26 | |||
27 | struct _ticket_prompt | ||
28 | { | ||
29 | struct _ticket base; | ||
30 | mu_refcount_t refcount; | ||
31 | }; | ||
32 | |||
33 | extern int _ticket_prompt_ctor __P ((struct _ticket_prompt *)); | ||
34 | extern void _ticket_prompt_dtor __P ((struct _ticket_prompt *)); | ||
35 | extern int _ticket_prompt_ref __P ((ticket_t)); | ||
36 | extern void _ticket_prompt_destroy __P ((ticket_t *)); | ||
37 | extern int _ticket_prompt_pop __P ((ticket_t, const char *, char **)); | ||
38 | |||
39 | #ifdef __cplusplus | ||
40 | } | ||
41 | #endif | ||
42 | |||
43 | #endif /* _MAILUTILS_SYS_PTICKET_H */ |
... | @@ -29,15 +29,7 @@ | ... | @@ -29,15 +29,7 @@ |
29 | extern "C" { | 29 | extern "C" { |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #ifndef __P | 32 | struct _mu_debug_stream |
33 | # ifdef __STDC__ | ||
34 | # define __P(args) args | ||
35 | # else | ||
36 | # define __P(args) () | ||
37 | # endif | ||
38 | #endif /*__P */ | ||
39 | |||
40 | struct _sdebug | ||
41 | { | 33 | { |
42 | struct _mu_debug base; | 34 | struct _mu_debug base; |
43 | mu_refcount_t refcount; | 35 | mu_refcount_t refcount; |
... | @@ -46,6 +38,14 @@ struct _sdebug | ... | @@ -46,6 +38,14 @@ struct _sdebug |
46 | int close_on_destroy; | 38 | int close_on_destroy; |
47 | }; | 39 | }; |
48 | 40 | ||
41 | int _mu_debug_stream_ctor __P ((struct _mu_debug_stream *)); | ||
42 | int _mu_debug_stream_dtor __P ((struct _mu_debug_stream *)); | ||
43 | int _mu_debug_stream_ref __P ((mu_debug_t)); | ||
44 | void _mu_debug_stream_destroy __P ((mu_debug_t *)); | ||
45 | int _mu_debug_stream_set_level __P ((mu_debug_t, size_t)); | ||
46 | int _mu_debug_stream_get_level __P ((mu_debug_t, size_t *)); | ||
47 | int _mu_debug_stream_print __P ((mu_debug_t, size_t, const char *)); | ||
48 | |||
49 | #ifdef __cplusplus | 49 | #ifdef __cplusplus |
50 | } | 50 | } |
51 | #endif | 51 | #endif | ... | ... |
... | @@ -19,9 +19,13 @@ | ... | @@ -19,9 +19,13 @@ |
19 | #define MAILUTILS_SYS_TCP_H | 19 | #define MAILUTILS_SYS_TCP_H |
20 | 20 | ||
21 | #include <mailutils/refcount.h> | 21 | #include <mailutils/refcount.h> |
22 | #include <mailutils/sys/stream.h> | 22 | #include <mailutils/sys/fdstream.h> |
23 | 23 | ||
24 | enum _tcp_state | 24 | #ifdef __cplusplus |
25 | extern "C" { | ||
26 | #endif | ||
27 | |||
28 | enum _stream_tcp_state | ||
25 | { | 29 | { |
26 | TCP_STATE_INIT, | 30 | TCP_STATE_INIT, |
27 | TCP_STATE_RESOLVE, | 31 | TCP_STATE_RESOLVE, |
... | @@ -30,16 +34,21 @@ enum _tcp_state | ... | @@ -30,16 +34,21 @@ enum _tcp_state |
30 | TCP_STATE_CONNECTED | 34 | TCP_STATE_CONNECTED |
31 | }; | 35 | }; |
32 | 36 | ||
33 | struct _tcp_instance | 37 | struct _stream_tcp |
34 | { | 38 | { |
35 | struct _stream base; | 39 | struct _stream_fd base; |
36 | mu_refcount_t refcount; | ||
37 | int fd; | ||
38 | char *host; | 40 | char *host; |
39 | int port; | 41 | int port; |
40 | int state; | 42 | int state; |
41 | int flags; | ||
42 | unsigned long address; | 43 | unsigned long address; |
43 | }; | 44 | }; |
44 | 45 | ||
46 | void _stream_tcp_destroy __P ((stream_t *)); | ||
47 | int _stream_tcp_close __P ((stream_t)); | ||
48 | int _stream_tcp_open __P ((stream_t, const char *, int, int)); | ||
49 | |||
50 | #ifdef __cplusplus | ||
51 | } | ||
52 | #endif | ||
53 | |||
45 | #endif /* _MAILUTILS_SYS_TCP_H */ | 54 | #endif /* _MAILUTILS_SYS_TCP_H */ | ... | ... |
... | @@ -21,52 +21,52 @@ | ... | @@ -21,52 +21,52 @@ |
21 | 21 | ||
22 | #include <stdlib.h> | 22 | #include <stdlib.h> |
23 | #include <mailutils/error.h> | 23 | #include <mailutils/error.h> |
24 | #include <mailutils/sys/locker.h> | 24 | #include <mailutils/sys/lockfile.h> |
25 | 25 | ||
26 | int | 26 | int |
27 | locker_ref (locker_t locker) | 27 | lockfile_ref (lockfile_t lockfile) |
28 | { | 28 | { |
29 | if (locker == NULL || locker->vtable == NULL | 29 | if (lockfile == NULL || lockfile->vtable == NULL |
30 | || locker->vtable->ref == NULL) | 30 | || lockfile->vtable->ref == NULL) |
31 | return MU_ERROR_NOT_SUPPORTED; | 31 | return MU_ERROR_NOT_SUPPORTED; |
32 | return locker->vtable->ref (locker); | 32 | return lockfile->vtable->ref (lockfile); |
33 | } | 33 | } |
34 | 34 | ||
35 | void | 35 | void |
36 | locker_destroy (locker_t *plocker) | 36 | lockfile_destroy (lockfile_t *plockfile) |
37 | { | 37 | { |
38 | if (plocker && *plocker) | 38 | if (plockfile && *plockfile) |
39 | { | 39 | { |
40 | locker_t locker = *plocker; | 40 | lockfile_t lockfile = *plockfile; |
41 | if (locker->vtable && locker->vtable->destroy) | 41 | if (lockfile->vtable && lockfile->vtable->destroy) |
42 | locker->vtable->destroy (plocker); | 42 | lockfile->vtable->destroy (plockfile); |
43 | *plocker = NULL; | 43 | *plockfile = NULL; |
44 | } | 44 | } |
45 | } | 45 | } |
46 | 46 | ||
47 | int | 47 | int |
48 | locker_lock (locker_t locker) | 48 | lockfile_lock (lockfile_t lockfile) |
49 | { | 49 | { |
50 | if (locker == NULL || locker->vtable == NULL | 50 | if (lockfile == NULL || lockfile->vtable == NULL |
51 | || locker->vtable->lock == NULL) | 51 | || lockfile->vtable->lock == NULL) |
52 | return MU_ERROR_NOT_SUPPORTED; | 52 | return MU_ERROR_NOT_SUPPORTED; |
53 | return locker->vtable->lock (locker); | 53 | return lockfile->vtable->lock (lockfile); |
54 | } | 54 | } |
55 | 55 | ||
56 | int | 56 | int |
57 | locker_touchlock (locker_t locker) | 57 | lockfile_touchlock (lockfile_t lockfile) |
58 | { | 58 | { |
59 | if (locker == NULL || locker->vtable == NULL | 59 | if (lockfile == NULL || lockfile->vtable == NULL |
60 | || locker->vtable->lock == NULL) | 60 | || lockfile->vtable->lock == NULL) |
61 | return MU_ERROR_NOT_SUPPORTED; | 61 | return MU_ERROR_NOT_SUPPORTED; |
62 | return locker->vtable->lock (locker); | 62 | return lockfile->vtable->lock (lockfile); |
63 | } | 63 | } |
64 | 64 | ||
65 | int | 65 | int |
66 | locker_unlock (locker_t locker) | 66 | lockfile_unlock (lockfile_t lockfile) |
67 | { | 67 | { |
68 | if (locker == NULL || locker->vtable == NULL | 68 | if (lockfile == NULL || lockfile->vtable == NULL |
69 | || locker->vtable->lock == NULL) | 69 | || lockfile->vtable->lock == NULL) |
70 | return MU_ERROR_NOT_SUPPORTED; | 70 | return MU_ERROR_NOT_SUPPORTED; |
71 | return locker->vtable->lock (locker); | 71 | return lockfile->vtable->lock (lockfile); |
72 | } | 72 | } | ... | ... |
... | @@ -29,7 +29,7 @@ | ... | @@ -29,7 +29,7 @@ |
29 | #include <fcntl.h> | 29 | #include <fcntl.h> |
30 | #include <unistd.h> | 30 | #include <unistd.h> |
31 | 31 | ||
32 | #include <mailutils/sys/mstream.h> | 32 | #include <mailutils/sys/mapstream.h> |
33 | #include <mailutils/error.h> | 33 | #include <mailutils/error.h> |
34 | 34 | ||
35 | #ifdef _POSIX_MAPPED_FILES | 35 | #ifdef _POSIX_MAPPED_FILES |
... | @@ -39,17 +39,17 @@ | ... | @@ -39,17 +39,17 @@ |
39 | # define MAP_FAILED (void*)-1 | 39 | # define MAP_FAILED (void*)-1 |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | static int | 42 | int |
43 | _map_ref (stream_t stream) | 43 | _stream_mmap_ref (stream_t stream) |
44 | { | 44 | { |
45 | struct _ms *ms = (struct _ms *)stream; | 45 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
46 | return mu_refcount_inc (ms->refcount); | 46 | return mu_refcount_inc (ms->refcount); |
47 | } | 47 | } |
48 | 48 | ||
49 | static void | 49 | void |
50 | _map_destroy (stream_t *pstream) | 50 | _stream_mmap_destroy (stream_t *pstream) |
51 | { | 51 | { |
52 | struct _ms *ms = (struct _ms *)*pstream; | 52 | struct _stream_mmap *ms = (struct _stream_mmap *)*pstream; |
53 | 53 | ||
54 | if (mu_refcount_dec (ms->refcount) == 0) | 54 | if (mu_refcount_dec (ms->refcount) == 0) |
55 | { | 55 | { |
... | @@ -58,10 +58,10 @@ _map_destroy (stream_t *pstream) | ... | @@ -58,10 +58,10 @@ _map_destroy (stream_t *pstream) |
58 | } | 58 | } |
59 | } | 59 | } |
60 | 60 | ||
61 | static int | 61 | int |
62 | _map_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) | 62 | _stream_mmap_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) |
63 | { | 63 | { |
64 | struct _ms *ms = (struct _ms *)stream; | 64 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
65 | size_t n = 0; | 65 | size_t n = 0; |
66 | 66 | ||
67 | mu_refcount_lock (ms->refcount); | 67 | mu_refcount_lock (ms->refcount); |
... | @@ -82,10 +82,10 @@ _map_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) | ... | @@ -82,10 +82,10 @@ _map_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) |
82 | return 0; | 82 | return 0; |
83 | } | 83 | } |
84 | 84 | ||
85 | static int | 85 | int |
86 | _map_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) | 86 | _stream_mmap_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) |
87 | { | 87 | { |
88 | struct _ms *ms = (struct _ms *)stream; | 88 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
89 | size_t n = 0; | 89 | size_t n = 0; |
90 | 90 | ||
91 | mu_refcount_lock (ms->refcount); | 91 | mu_refcount_lock (ms->refcount); |
... | @@ -111,10 +111,10 @@ _map_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) | ... | @@ -111,10 +111,10 @@ _map_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) |
111 | return 0; | 111 | return 0; |
112 | } | 112 | } |
113 | 113 | ||
114 | static int | 114 | int |
115 | _map_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) | 115 | _stream_mmap_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) |
116 | { | 116 | { |
117 | struct _ms *ms = (struct _ms *)stream; | 117 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
118 | int err = 0; | 118 | int err = 0; |
119 | size_t n = 0; | 119 | size_t n = 0; |
120 | 120 | ||
... | @@ -157,10 +157,10 @@ _map_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) | ... | @@ -157,10 +157,10 @@ _map_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) |
157 | return err; | 157 | return err; |
158 | } | 158 | } |
159 | 159 | ||
160 | static int | 160 | int |
161 | _map_truncate (stream_t stream, off_t len) | 161 | _stream_mmap_truncate (stream_t stream, off_t len) |
162 | { | 162 | { |
163 | struct _ms *ms = (struct _ms *)stream; | 163 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
164 | int err = 0; | 164 | int err = 0; |
165 | 165 | ||
166 | mu_refcount_lock (ms->refcount); | 166 | mu_refcount_lock (ms->refcount); |
... | @@ -188,10 +188,10 @@ _map_truncate (stream_t stream, off_t len) | ... | @@ -188,10 +188,10 @@ _map_truncate (stream_t stream, off_t len) |
188 | return err; | 188 | return err; |
189 | } | 189 | } |
190 | 190 | ||
191 | static int | 191 | int |
192 | _map_get_size (stream_t stream, off_t *psize) | 192 | _stream_mmap_get_size (stream_t stream, off_t *psize) |
193 | { | 193 | { |
194 | struct _ms *ms = (struct _ms *)stream; | 194 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
195 | struct stat stbuf; | 195 | struct stat stbuf; |
196 | int err = 0; | 196 | int err = 0; |
197 | 197 | ||
... | @@ -232,11 +232,11 @@ _map_get_size (stream_t stream, off_t *psize) | ... | @@ -232,11 +232,11 @@ _map_get_size (stream_t stream, off_t *psize) |
232 | return err; | 232 | return err; |
233 | } | 233 | } |
234 | 234 | ||
235 | static int | 235 | int |
236 | _map_flush (stream_t stream) | 236 | _stream_mmap_flush (stream_t stream) |
237 | { | 237 | { |
238 | int err = 0; | 238 | int err = 0; |
239 | struct _ms *ms = (struct _ms *)stream; | 239 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
240 | mu_refcount_lock (ms->refcount); | 240 | mu_refcount_lock (ms->refcount); |
241 | if (ms->ptr != MAP_FAILED && ms->ptr != NULL) | 241 | if (ms->ptr != MAP_FAILED && ms->ptr != NULL) |
242 | err = msync (ms->ptr, ms->size, MS_SYNC); | 242 | err = msync (ms->ptr, ms->size, MS_SYNC); |
... | @@ -244,27 +244,27 @@ _map_flush (stream_t stream) | ... | @@ -244,27 +244,27 @@ _map_flush (stream_t stream) |
244 | return 0; | 244 | return 0; |
245 | } | 245 | } |
246 | 246 | ||
247 | static int | 247 | int |
248 | _map_get_fd (stream_t stream, int *pfd) | 248 | _stream_mmap_get_fd (stream_t stream, int *pfd) |
249 | { | 249 | { |
250 | struct _ms *ms = (struct _ms *)stream; | 250 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
251 | if (pfd) | 251 | if (pfd) |
252 | *pfd = ms->fd; | 252 | *pfd = ms->fd; |
253 | return 0; | 253 | return 0; |
254 | } | 254 | } |
255 | 255 | ||
256 | static int | 256 | int |
257 | _map_get_flags (stream_t stream, int *flags) | 257 | _stream_mmap_get_flags (stream_t stream, int *flags) |
258 | { | 258 | { |
259 | struct _ms *ms = (struct _ms *)stream; | 259 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
260 | if (flags == NULL) | 260 | if (flags == NULL) |
261 | return MU_ERROR_INVALID_PARAMETER; | 261 | return MU_ERROR_INVALID_PARAMETER; |
262 | *flags = ms->flags; | 262 | *flags = ms->flags; |
263 | return 0; | 263 | return 0; |
264 | } | 264 | } |
265 | 265 | ||
266 | static int | 266 | int |
267 | _map_get_state (stream_t stream, enum stream_state *state) | 267 | _stream_mmap_get_state (stream_t stream, enum stream_state *state) |
268 | { | 268 | { |
269 | (void)stream; | 269 | (void)stream; |
270 | if (state == NULL) | 270 | if (state == NULL) |
... | @@ -273,10 +273,10 @@ _map_get_state (stream_t stream, enum stream_state *state) | ... | @@ -273,10 +273,10 @@ _map_get_state (stream_t stream, enum stream_state *state) |
273 | return 0; | 273 | return 0; |
274 | } | 274 | } |
275 | 275 | ||
276 | static int | 276 | int |
277 | _map_seek (stream_t stream, off_t off, enum stream_whence whence) | 277 | _stream_mmap_seek (stream_t stream, off_t off, enum stream_whence whence) |
278 | { | 278 | { |
279 | struct _ms *ms = (struct _ms *)stream; | 279 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
280 | off_t noff = ms->offset; | 280 | off_t noff = ms->offset; |
281 | int err = 0; | 281 | int err = 0; |
282 | if (whence == MU_STREAM_WHENCE_SET) | 282 | if (whence == MU_STREAM_WHENCE_SET) |
... | @@ -290,7 +290,7 @@ _map_seek (stream_t stream, off_t off, enum stream_whence whence) | ... | @@ -290,7 +290,7 @@ _map_seek (stream_t stream, off_t off, enum stream_whence whence) |
290 | if (noff >= 0) | 290 | if (noff >= 0) |
291 | { | 291 | { |
292 | if (noff > ms->offset) | 292 | if (noff > ms->offset) |
293 | _map_truncate (stream, noff); | 293 | _stream_mmap_truncate (stream, noff); |
294 | ms->offset = noff; | 294 | ms->offset = noff; |
295 | } | 295 | } |
296 | else | 296 | else |
... | @@ -298,20 +298,20 @@ _map_seek (stream_t stream, off_t off, enum stream_whence whence) | ... | @@ -298,20 +298,20 @@ _map_seek (stream_t stream, off_t off, enum stream_whence whence) |
298 | return err; | 298 | return err; |
299 | } | 299 | } |
300 | 300 | ||
301 | static int | 301 | int |
302 | _map_tell (stream_t stream, off_t *off) | 302 | _stream_mmap_tell (stream_t stream, off_t *off) |
303 | { | 303 | { |
304 | struct _ms *ms = (struct _ms *)stream; | 304 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
305 | if (off == NULL) | 305 | if (off == NULL) |
306 | return MU_ERROR_INVALID_PARAMETER; | 306 | return MU_ERROR_INVALID_PARAMETER; |
307 | *off = ms->offset; | 307 | *off = ms->offset; |
308 | return 0; | 308 | return 0; |
309 | } | 309 | } |
310 | 310 | ||
311 | static int | 311 | int |
312 | _map_close (stream_t stream) | 312 | _stream_mmap_close (stream_t stream) |
313 | { | 313 | { |
314 | struct _ms *ms = (struct _ms *)stream; | 314 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
315 | int err = 0; | 315 | int err = 0; |
316 | mu_refcount_lock (ms->refcount); | 316 | mu_refcount_lock (ms->refcount); |
317 | if (ms->ptr != MAP_FAILED) | 317 | if (ms->ptr != MAP_FAILED) |
... | @@ -328,40 +328,39 @@ _map_close (stream_t stream) | ... | @@ -328,40 +328,39 @@ _map_close (stream_t stream) |
328 | return err; | 328 | return err; |
329 | } | 329 | } |
330 | 330 | ||
331 | static int | 331 | int |
332 | _map_is_open (stream_t stream) | 332 | _stream_mmap_is_open (stream_t stream) |
333 | { | 333 | { |
334 | struct _ms *ms = (struct _ms *)stream; | 334 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
335 | return (ms->ptr == MAP_FAILED) ? 0 : 1; | 335 | return (ms->ptr == MAP_FAILED) ? 0 : 1; |
336 | } | 336 | } |
337 | 337 | ||
338 | static int | 338 | int |
339 | _map_is_readready (stream_t stream, int timeout) | 339 | _stream_mmap_is_readready (stream_t stream, int timeout) |
340 | { | 340 | { |
341 | (void)timeout; | 341 | (void)timeout; |
342 | return _map_is_open (stream); | 342 | return _stream_mmap_is_open (stream); |
343 | } | 343 | } |
344 | 344 | ||
345 | static int | 345 | int |
346 | _map_is_writeready (stream_t stream, int timeout) | 346 | _stream_mmap_is_writeready (stream_t stream, int timeout) |
347 | { | 347 | { |
348 | (void)timeout; | 348 | (void)timeout; |
349 | return _map_is_open (stream); | 349 | return _stream_mmap_is_open (stream); |
350 | } | 350 | } |
351 | 351 | ||
352 | static int | 352 | int |
353 | _map_is_exceptionpending (stream_t stream, int timeout) | 353 | _stream_mmap_is_exceptionpending (stream_t stream, int timeout) |
354 | { | 354 | { |
355 | (void)stream; | 355 | (void)stream; |
356 | (void)timeout; | 356 | (void)timeout; |
357 | return 0; | 357 | return 0; |
358 | } | 358 | } |
359 | 359 | ||
360 | 360 | int | |
361 | static int | 361 | _stream_mmap_open (stream_t stream, const char *filename, int port, int flags) |
362 | _map_open (stream_t stream, const char *filename, int port, int flags) | ||
363 | { | 362 | { |
364 | struct _ms *ms = (struct _ms *)stream; | 363 | struct _stream_mmap *ms = (struct _stream_mmap *)stream; |
365 | int mflag, flg; | 364 | int mflag, flg; |
366 | struct stat st; | 365 | struct stat st; |
367 | 366 | ||
... | @@ -400,7 +399,19 @@ _map_open (stream_t stream, const char *filename, int port, int flags) | ... | @@ -400,7 +399,19 @@ _map_open (stream_t stream, const char *filename, int port, int flags) |
400 | flg = O_RDONLY; | 399 | flg = O_RDONLY; |
401 | } | 400 | } |
402 | 401 | ||
403 | ms->fd = open (filename, flg); | 402 | /* Anonymous Mapping. */ |
403 | if (filename == NULL) | ||
404 | { | ||
405 | #ifdef MAP_ANON | ||
406 | mflag |= MAP_ANON; | ||
407 | #else | ||
408 | filename = "/dev/zero"; | ||
409 | ms->fd = open (filename, flg); | ||
410 | #endif | ||
411 | } | ||
412 | else | ||
413 | ms->fd = open (filename, flg); | ||
414 | |||
404 | if (ms->fd < 0) | 415 | if (ms->fd < 0) |
405 | return errno; | 416 | return errno; |
406 | if (fstat (ms->fd, &st) != 0) | 417 | if (fstat (ms->fd, &st) != 0) |
... | @@ -428,45 +439,70 @@ _map_open (stream_t stream, const char *filename, int port, int flags) | ... | @@ -428,45 +439,70 @@ _map_open (stream_t stream, const char *filename, int port, int flags) |
428 | return 0; | 439 | return 0; |
429 | } | 440 | } |
430 | 441 | ||
431 | static struct _stream_vtable _map_vtable = | 442 | static struct _stream_vtable _stream_mmap_vtable = |
432 | { | 443 | { |
433 | _map_ref, | 444 | _stream_mmap_ref, |
434 | _map_destroy, | 445 | _stream_mmap_destroy, |
435 | 446 | ||
436 | _map_open, | 447 | _stream_mmap_open, |
437 | _map_close, | 448 | _stream_mmap_close, |
438 | 449 | ||
439 | _map_read, | 450 | _stream_mmap_read, |
440 | _map_readline, | 451 | _stream_mmap_readline, |
441 | _map_write, | 452 | _stream_mmap_write, |
442 | 453 | ||
443 | _map_seek, | 454 | _stream_mmap_seek, |
444 | _map_tell, | 455 | _stream_mmap_tell, |
445 | 456 | ||
446 | _map_get_size, | 457 | _stream_mmap_get_size, |
447 | _map_truncate, | 458 | _stream_mmap_truncate, |
448 | _map_flush, | 459 | _stream_mmap_flush, |
449 | 460 | ||
450 | _map_get_fd, | 461 | _stream_mmap_get_fd, |
451 | _map_get_flags, | 462 | _stream_mmap_get_flags, |
452 | _map_get_state, | 463 | _stream_mmap_get_state, |
453 | 464 | ||
454 | _map_is_readready, | 465 | _stream_mmap_is_readready, |
455 | _map_is_writeready, | 466 | _stream_mmap_is_writeready, |
456 | _map_is_exceptionpending, | 467 | _stream_mmap_is_exceptionpending, |
457 | 468 | ||
458 | _map_is_open | 469 | _stream_mmap_is_open |
459 | }; | 470 | }; |
460 | 471 | ||
472 | int | ||
473 | _stream_mmap_ctor (struct _stream_mmap *ms) | ||
474 | { | ||
475 | mu_refcount_create (&ms->refcount); | ||
476 | if (ms->refcount == NULL) | ||
477 | return MU_ERROR_NO_MEMORY; | ||
478 | ms->fd = -1; | ||
479 | ms->offset = -1; | ||
480 | ms->flags = 0; | ||
481 | ms->mflags = 0; | ||
482 | ms->base.vtable = &_stream_mmap_vtable; | ||
483 | return 0; | ||
484 | } | ||
485 | |||
486 | void | ||
487 | _stream_mmap_dtor (struct _stream_mmap *ms) | ||
488 | { | ||
489 | mu_refcount_destroy (&ms->refcount); | ||
490 | ms->fd = -1; | ||
491 | ms->offset = -1; | ||
492 | ms->mflags = 0; | ||
493 | ms->ptr = MAP_FAILED; | ||
494 | } | ||
495 | |||
461 | #endif /* _POSIX_MAPPED_FILES */ | 496 | #endif /* _POSIX_MAPPED_FILES */ |
462 | 497 | ||
463 | int | 498 | int |
464 | stream_mapfile_create (stream_t *pstream) | 499 | stream_mmap_create (stream_t *pstream) |
465 | { | 500 | { |
466 | #ifndef _POSIX_MAPPED_FILES | 501 | #ifndef _POSIX_MAPPED_FILES |
467 | return ENOSYS; | 502 | return ENOSYS; |
468 | #else | 503 | #else |
469 | struct _ms *ms; | 504 | struct _stream_mmap *ms; |
505 | int status; | ||
470 | 506 | ||
471 | if (pstream == NULL) | 507 | if (pstream == NULL) |
472 | return MU_ERROR_INVALID_PARAMETER; | 508 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -475,19 +511,10 @@ stream_mapfile_create (stream_t *pstream) | ... | @@ -475,19 +511,10 @@ stream_mapfile_create (stream_t *pstream) |
475 | if (ms == NULL) | 511 | if (ms == NULL) |
476 | return MU_ERROR_NO_MEMORY; | 512 | return MU_ERROR_NO_MEMORY; |
477 | 513 | ||
478 | mu_refcount_create (&ms->refcount); | 514 | status = _stream_mmap_ctor (ms); |
479 | if (ms->refcount == NULL) | 515 | if (status != 0) |
480 | { | 516 | return status; |
481 | free (ms); | ||
482 | return MU_ERROR_NO_MEMORY; | ||
483 | } | ||
484 | ms->fd = -1; | ||
485 | ms->offset = -1; | ||
486 | ms->flags = 0; | ||
487 | ms->mflags = 0; | ||
488 | ms->base.vtable = &_map_vtable; | ||
489 | *pstream = &ms->base; | 517 | *pstream = &ms->base; |
490 | |||
491 | return 0; | 518 | return 0; |
492 | #endif /* _POSIX_MAPPED_FILES */ | 519 | #endif /* _POSIX_MAPPED_FILES */ |
493 | } | 520 | } | ... | ... |
... | @@ -21,22 +21,25 @@ | ... | @@ -21,22 +21,25 @@ |
21 | 21 | ||
22 | #include <errno.h> | 22 | #include <errno.h> |
23 | #include <stdlib.h> | 23 | #include <stdlib.h> |
24 | #include <stdio.h> | ||
24 | #include <string.h> | 25 | #include <string.h> |
26 | #include <sys/stat.h> | ||
27 | #include <unistd.h> | ||
25 | 28 | ||
26 | #include <mailutils/error.h> | 29 | #include <mailutils/error.h> |
27 | #include <mailutils/sys/memstream.h> | 30 | #include <mailutils/sys/memstream.h> |
28 | 31 | ||
29 | static int | 32 | int |
30 | _memory_ref (stream_t stream) | 33 | _stream_memory_ref (stream_t stream) |
31 | { | 34 | { |
32 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 35 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
33 | return mu_refcount_inc (mem->refcount); | 36 | return mu_refcount_inc (mem->refcount); |
34 | } | 37 | } |
35 | 38 | ||
36 | static void | 39 | void |
37 | _memory_destroy (stream_t *pstream) | 40 | _stream_memory_destroy (stream_t *pstream) |
38 | { | 41 | { |
39 | struct _memory_stream *mem = (struct _memory_stream *)*pstream; | 42 | struct _stream_memory *mem = (struct _stream_memory *)*pstream; |
40 | if (mu_refcount_dec (mem->refcount) == 0) | 43 | if (mu_refcount_dec (mem->refcount) == 0) |
41 | { | 44 | { |
42 | mu_refcount_destroy (&mem->refcount); | 45 | mu_refcount_destroy (&mem->refcount); |
... | @@ -44,10 +47,10 @@ _memory_destroy (stream_t *pstream) | ... | @@ -44,10 +47,10 @@ _memory_destroy (stream_t *pstream) |
44 | } | 47 | } |
45 | } | 48 | } |
46 | 49 | ||
47 | static int | 50 | int |
48 | _memory_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) | 51 | _stream_memory_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) |
49 | { | 52 | { |
50 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 53 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
51 | size_t n = 0; | 54 | size_t n = 0; |
52 | 55 | ||
53 | mu_refcount_lock (mem->refcount); | 56 | mu_refcount_lock (mem->refcount); |
... | @@ -64,10 +67,10 @@ _memory_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) | ... | @@ -64,10 +67,10 @@ _memory_read (stream_t stream, void *optr, size_t osize, size_t *nbytes) |
64 | return 0; | 67 | return 0; |
65 | } | 68 | } |
66 | 69 | ||
67 | static int | 70 | int |
68 | _memory_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) | 71 | _stream_memory_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) |
69 | { | 72 | { |
70 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 73 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
71 | char *nl; | 74 | char *nl; |
72 | size_t n = 0; | 75 | size_t n = 0; |
73 | mu_refcount_lock (mem->refcount); | 76 | mu_refcount_lock (mem->refcount); |
... | @@ -88,20 +91,25 @@ _memory_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) | ... | @@ -88,20 +91,25 @@ _memory_readline (stream_t stream, char *optr, size_t osize, size_t *nbytes) |
88 | return 0; | 91 | return 0; |
89 | } | 92 | } |
90 | 93 | ||
91 | static int | 94 | int |
92 | _memory_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) | 95 | _stream_memory_write (stream_t stream, const void *iptr, size_t isize, |
96 | size_t *nbytes) | ||
93 | { | 97 | { |
94 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 98 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
95 | 99 | ||
96 | mu_refcount_lock (mem->refcount); | 100 | mu_refcount_lock (mem->refcount); |
97 | /* Bigger we have to realloc. */ | 101 | /* Bigger we have to realloc. */ |
98 | if (mem->size < (mem->offset + isize)) | 102 | if (mem->capacity < (mem->offset + isize)) |
99 | { | 103 | { |
100 | char *tmp = realloc (mem->ptr, mem->offset + isize); | 104 | /* Realloc by blocks of 512. */ |
105 | int newsize = MU_STREAM_MEMORY_BLOCKSIZE * | ||
106 | (((mem->offset + isize)/MU_STREAM_MEMORY_BLOCKSIZE) + 1); | ||
107 | char *tmp = realloc (mem->ptr, newsize); | ||
101 | if (tmp == NULL) | 108 | if (tmp == NULL) |
102 | return ENOMEM; | 109 | return ENOMEM; |
103 | mem->ptr = tmp; | 110 | mem->ptr = tmp; |
104 | mem->size = mem->offset + isize; | 111 | mem->size = mem->offset + isize; |
112 | mem->capacity = newsize; | ||
105 | } | 113 | } |
106 | 114 | ||
107 | memcpy (mem->ptr + mem->offset, iptr, isize); | 115 | memcpy (mem->ptr + mem->offset, iptr, isize); |
... | @@ -112,10 +120,10 @@ _memory_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) | ... | @@ -112,10 +120,10 @@ _memory_write (stream_t stream, const void *iptr, size_t isize, size_t *nbytes) |
112 | return 0; | 120 | return 0; |
113 | } | 121 | } |
114 | 122 | ||
115 | static int | 123 | int |
116 | _memory_truncate (stream_t stream, off_t len) | 124 | _stream_memory_truncate (stream_t stream, off_t len) |
117 | { | 125 | { |
118 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 126 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
119 | 127 | ||
120 | mu_refcount_lock (mem->refcount); | 128 | mu_refcount_lock (mem->refcount); |
121 | if (len == 0) | 129 | if (len == 0) |
... | @@ -130,16 +138,17 @@ _memory_truncate (stream_t stream, off_t len) | ... | @@ -130,16 +138,17 @@ _memory_truncate (stream_t stream, off_t len) |
130 | return ENOMEM; | 138 | return ENOMEM; |
131 | mem->ptr = tmp; | 139 | mem->ptr = tmp; |
132 | } | 140 | } |
141 | mem->capacity = len; | ||
133 | mem->size = len; | 142 | mem->size = len; |
134 | mem->offset = len; | 143 | mem->offset = len; |
135 | mu_refcount_unlock (mem->refcount); | 144 | mu_refcount_unlock (mem->refcount); |
136 | return 0; | 145 | return 0; |
137 | } | 146 | } |
138 | 147 | ||
139 | static int | 148 | int |
140 | _memory_get_size (stream_t stream, off_t *psize) | 149 | _stream_memory_get_size (stream_t stream, off_t *psize) |
141 | { | 150 | { |
142 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 151 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
143 | mu_refcount_lock (mem->refcount); | 152 | mu_refcount_lock (mem->refcount); |
144 | if (psize) | 153 | if (psize) |
145 | *psize = mem->size; | 154 | *psize = mem->size; |
... | @@ -147,46 +156,47 @@ _memory_get_size (stream_t stream, off_t *psize) | ... | @@ -147,46 +156,47 @@ _memory_get_size (stream_t stream, off_t *psize) |
147 | return 0; | 156 | return 0; |
148 | } | 157 | } |
149 | 158 | ||
150 | static int | 159 | int |
151 | _memory_close (stream_t stream) | 160 | _stream_memory_close (stream_t stream) |
152 | { | 161 | { |
153 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 162 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
154 | mu_refcount_lock (mem->refcount); | 163 | mu_refcount_lock (mem->refcount); |
155 | if (mem->ptr) | 164 | if (mem->ptr) |
156 | free (mem->ptr); | 165 | free (mem->ptr); |
157 | mem->ptr = NULL; | 166 | mem->ptr = NULL; |
167 | mem->capacity = 0; | ||
158 | mem->size = 0; | 168 | mem->size = 0; |
159 | mem->offset = 0; | 169 | mem->offset = 0; |
160 | mu_refcount_unlock (mem->refcount); | 170 | mu_refcount_unlock (mem->refcount); |
161 | return 0; | 171 | return 0; |
162 | } | 172 | } |
163 | 173 | ||
164 | static int | 174 | int |
165 | _memory_flush (stream_t stream) | 175 | _stream_memory_flush (stream_t stream) |
166 | { | 176 | { |
167 | (void)stream; | 177 | (void)stream; |
168 | return 0; | 178 | return 0; |
169 | } | 179 | } |
170 | 180 | ||
171 | static int | 181 | int |
172 | _memory_get_fd (stream_t stream, int *pfd) | 182 | _stream_memory_get_fd (stream_t stream, int *pfd) |
173 | { | 183 | { |
174 | (void)stream; (void)pfd; | 184 | (void)stream; (void)pfd; |
175 | return MU_ERROR_NOT_SUPPORTED; | 185 | return MU_ERROR_NOT_SUPPORTED; |
176 | } | 186 | } |
177 | 187 | ||
178 | static int | 188 | int |
179 | _memory_get_flags (stream_t stream, int *flags) | 189 | _stream_memory_get_flags (stream_t stream, int *flags) |
180 | { | 190 | { |
181 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 191 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
182 | if (flags == NULL) | 192 | if (flags == NULL) |
183 | return MU_ERROR_INVALID_PARAMETER; | 193 | return MU_ERROR_INVALID_PARAMETER; |
184 | *flags = mem->flags; | 194 | *flags = mem->flags; |
185 | return 0; | 195 | return 0; |
186 | } | 196 | } |
187 | 197 | ||
188 | static int | 198 | int |
189 | _memory_get_state (stream_t stream, enum stream_state *state) | 199 | _stream_memory_get_state (stream_t stream, enum stream_state *state) |
190 | { | 200 | { |
191 | (void)stream; | 201 | (void)stream; |
192 | if (state == NULL) | 202 | if (state == NULL) |
... | @@ -195,10 +205,10 @@ _memory_get_state (stream_t stream, enum stream_state *state) | ... | @@ -195,10 +205,10 @@ _memory_get_state (stream_t stream, enum stream_state *state) |
195 | return 0; | 205 | return 0; |
196 | } | 206 | } |
197 | 207 | ||
198 | static int | 208 | int |
199 | _memory_seek (stream_t stream, off_t off, enum stream_whence whence) | 209 | _stream_memory_seek (stream_t stream, off_t off, enum stream_whence whence) |
200 | { | 210 | { |
201 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 211 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
202 | off_t noff = mem->offset; | 212 | off_t noff = mem->offset; |
203 | int err = 0; | 213 | int err = 0; |
204 | if (whence == MU_STREAM_WHENCE_SET) | 214 | if (whence == MU_STREAM_WHENCE_SET) |
... | @@ -212,7 +222,7 @@ _memory_seek (stream_t stream, off_t off, enum stream_whence whence) | ... | @@ -212,7 +222,7 @@ _memory_seek (stream_t stream, off_t off, enum stream_whence whence) |
212 | if (noff >= 0) | 222 | if (noff >= 0) |
213 | { | 223 | { |
214 | if (noff > mem->offset) | 224 | if (noff > mem->offset) |
215 | _memory_truncate (stream, noff); | 225 | _stream_memory_truncate (stream, noff); |
216 | mem->offset = noff; | 226 | mem->offset = noff; |
217 | } | 227 | } |
218 | else | 228 | else |
... | @@ -220,41 +230,41 @@ _memory_seek (stream_t stream, off_t off, enum stream_whence whence) | ... | @@ -220,41 +230,41 @@ _memory_seek (stream_t stream, off_t off, enum stream_whence whence) |
220 | return err; | 230 | return err; |
221 | } | 231 | } |
222 | 232 | ||
223 | static int | 233 | int |
224 | _memory_tell (stream_t stream, off_t *off) | 234 | _stream_memory_tell (stream_t stream, off_t *off) |
225 | { | 235 | { |
226 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 236 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
227 | if (off == NULL) | 237 | if (off == NULL) |
228 | return MU_ERROR_INVALID_PARAMETER; | 238 | return MU_ERROR_INVALID_PARAMETER; |
229 | *off = mem->offset; | 239 | *off = mem->offset; |
230 | return 0; | 240 | return 0; |
231 | } | 241 | } |
232 | 242 | ||
233 | static int | 243 | int |
234 | _memory_is_open (stream_t stream) | 244 | _stream_memory_is_open (stream_t stream) |
235 | { | 245 | { |
236 | (void)stream; | 246 | (void)stream; |
237 | return 1; | 247 | return 1; |
238 | } | 248 | } |
239 | 249 | ||
240 | static int | 250 | int |
241 | _memory_is_readready (stream_t stream, int timeout) | 251 | _stream_memory_is_readready (stream_t stream, int timeout) |
242 | { | 252 | { |
243 | (void)stream; | 253 | (void)stream; |
244 | (void)timeout; | 254 | (void)timeout; |
245 | return 1; | 255 | return 1; |
246 | } | 256 | } |
247 | 257 | ||
248 | static int | 258 | int |
249 | _memory_is_writeready (stream_t stream, int timeout) | 259 | _stream_memory_is_writeready (stream_t stream, int timeout) |
250 | { | 260 | { |
251 | (void)stream; | 261 | (void)stream; |
252 | (void)timeout; | 262 | (void)timeout; |
253 | return 1; | 263 | return 1; |
254 | } | 264 | } |
255 | 265 | ||
256 | static int | 266 | int |
257 | _memory_is_exceptionpending (stream_t stream, int timeout) | 267 | _stream_memory_is_exceptionpending (stream_t stream, int timeout) |
258 | { | 268 | { |
259 | (void)stream; | 269 | (void)stream; |
260 | (void)timeout; | 270 | (void)timeout; |
... | @@ -262,61 +272,134 @@ _memory_is_exceptionpending (stream_t stream, int timeout) | ... | @@ -262,61 +272,134 @@ _memory_is_exceptionpending (stream_t stream, int timeout) |
262 | } | 272 | } |
263 | 273 | ||
264 | 274 | ||
265 | static int | 275 | int |
266 | _memory_open (stream_t stream, const char *filename, int port, int flags) | 276 | _stream_memory_open (stream_t stream, const char *filename, int port, |
277 | int flags) | ||
267 | { | 278 | { |
268 | struct _memory_stream *mem = (struct _memory_stream *)stream; | 279 | struct _stream_memory *mem = (struct _stream_memory *)stream; |
280 | int status = 0; | ||
269 | 281 | ||
270 | (void)port; /* Ignored. */ | 282 | (void)port; /* Ignored. */ |
271 | (void)filename; /* Ignored. */ | ||
272 | (void)flags; /* Ignored. */ | ||
273 | 283 | ||
274 | mu_refcount_lock (mem->refcount); | 284 | mu_refcount_lock (mem->refcount); |
275 | /* Close any previous file. */ | 285 | /* Free any previous memory. */ |
276 | if (mem->ptr) | 286 | if (mem->ptr) |
277 | free (mem->ptr); | 287 | free (mem->ptr); |
278 | mem->ptr = NULL; | 288 | mem->ptr = NULL; |
289 | mem->capacity = 0; | ||
279 | mem->size = 0; | 290 | mem->size = 0; |
280 | mem->offset = 0; | 291 | mem->offset = 0; |
281 | mem->flags = flags; | 292 | mem->flags = flags; |
293 | if (filename) | ||
294 | { | ||
295 | struct stat statbuf; | ||
296 | if (stat (filename, &statbuf) == 0) | ||
297 | { | ||
298 | mem->ptr = calloc (1, statbuf.st_size); | ||
299 | if (mem->ptr) | ||
300 | { | ||
301 | FILE *fp; | ||
302 | mem->capacity = statbuf.st_size; | ||
303 | mem->size = statbuf.st_size; | ||
304 | fp = fopen (filename, "r"); | ||
305 | if (fp) | ||
306 | { | ||
307 | size_t r = fread (mem->ptr, mem->size, 1, fp); | ||
308 | if (r != mem->size) | ||
309 | status = MU_ERROR_IO; | ||
310 | fclose (fp); | ||
311 | } | ||
312 | else | ||
313 | status = errno; | ||
314 | if (status != 0) | ||
315 | { | ||
316 | free (mem->ptr); | ||
317 | mem->ptr = NULL; | ||
318 | mem->capacity = 0; | ||
319 | mem->size = 0; | ||
320 | } | ||
321 | } | ||
322 | else | ||
323 | status = MU_ERROR_NO_MEMORY; | ||
324 | } | ||
325 | else | ||
326 | status = MU_ERROR_IO; | ||
327 | } | ||
282 | mu_refcount_unlock (mem->refcount); | 328 | mu_refcount_unlock (mem->refcount); |
283 | return 0; | 329 | return status; |
284 | } | 330 | } |
285 | 331 | ||
286 | static struct _stream_vtable _mem_vtable = | 332 | static struct _stream_vtable _stream_memory_vtable = |
287 | { | 333 | { |
288 | _memory_ref, | 334 | _stream_memory_ref, |
289 | _memory_destroy, | 335 | _stream_memory_destroy, |
290 | 336 | ||
291 | _memory_open, | 337 | _stream_memory_open, |
292 | _memory_close, | 338 | _stream_memory_close, |
293 | 339 | ||
294 | _memory_read, | 340 | _stream_memory_read, |
295 | _memory_readline, | 341 | _stream_memory_readline, |
296 | _memory_write, | 342 | _stream_memory_write, |
297 | 343 | ||
298 | _memory_seek, | 344 | _stream_memory_seek, |
299 | _memory_tell, | 345 | _stream_memory_tell, |
300 | 346 | ||
301 | _memory_get_size, | 347 | _stream_memory_get_size, |
302 | _memory_truncate, | 348 | _stream_memory_truncate, |
303 | _memory_flush, | 349 | _stream_memory_flush, |
304 | 350 | ||
305 | _memory_get_fd, | 351 | _stream_memory_get_fd, |
306 | _memory_get_flags, | 352 | _stream_memory_get_flags, |
307 | _memory_get_state, | 353 | _stream_memory_get_state, |
308 | 354 | ||
309 | _memory_is_readready, | 355 | _stream_memory_is_readready, |
310 | _memory_is_writeready, | 356 | _stream_memory_is_writeready, |
311 | _memory_is_exceptionpending, | 357 | _stream_memory_is_exceptionpending, |
312 | 358 | ||
313 | _memory_is_open | 359 | _stream_memory_is_open |
314 | }; | 360 | }; |
315 | 361 | ||
316 | int | 362 | int |
317 | stream_memory_create (stream_t *pstream) | 363 | _stream_memory_ctor (struct _stream_memory *mem, size_t capacity) |
364 | { | ||
365 | mu_refcount_create (&mem->refcount); | ||
366 | if (mem->refcount == NULL) | ||
367 | return MU_ERROR_NO_MEMORY; | ||
368 | if (capacity) | ||
369 | { | ||
370 | mem->ptr = calloc (1, capacity); | ||
371 | if (mem->ptr == NULL) | ||
372 | { | ||
373 | mu_refcount_destroy (&mem->refcount); | ||
374 | return MU_ERROR_NO_MEMORY; | ||
375 | } | ||
376 | mem->capacity = capacity; | ||
377 | } | ||
378 | else | ||
379 | mem->capacity = 0; | ||
380 | mem->size = 0; | ||
381 | mem->offset = 0; | ||
382 | mem->flags = 0; | ||
383 | mem->base.vtable = &_stream_memory_vtable; | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | void | ||
388 | _stream_memory_dtor (struct _stream_memory *mem) | ||
389 | { | ||
390 | mu_refcount_destroy (&mem->refcount); | ||
391 | mem->ptr = NULL; | ||
392 | mem->capacity = 0; | ||
393 | mem->size = 0; | ||
394 | mem->offset = 0; | ||
395 | mem->flags = 0; | ||
396 | } | ||
397 | |||
398 | int | ||
399 | stream_memory_create (stream_t *pstream, size_t capacity) | ||
318 | { | 400 | { |
319 | struct _memory_stream *mem; | 401 | struct _stream_memory *mem; |
402 | int status; | ||
320 | 403 | ||
321 | if (pstream == NULL) | 404 | if (pstream == NULL) |
322 | return MU_ERROR_INVALID_PARAMETER; | 405 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -325,17 +408,13 @@ stream_memory_create (stream_t *pstream) | ... | @@ -325,17 +408,13 @@ stream_memory_create (stream_t *pstream) |
325 | if (mem == NULL) | 408 | if (mem == NULL) |
326 | return MU_ERROR_NO_MEMORY; | 409 | return MU_ERROR_NO_MEMORY; |
327 | 410 | ||
328 | mu_refcount_create (&mem->refcount); | 411 | status = _stream_memory_ctor (mem, capacity); |
329 | if (mem->refcount == NULL) | 412 | if (status != 0) |
330 | { | 413 | { |
331 | free (mem); | 414 | free (mem); |
332 | return MU_ERROR_NO_MEMORY; | 415 | return status; |
333 | } | 416 | } |
334 | mem->ptr = NULL; | 417 | mem->base.vtable = &_stream_memory_vtable; |
335 | mem->size = 0; | ||
336 | mem->offset = 0; | ||
337 | mem->flags = 0; | ||
338 | mem->base.vtable = &_mem_vtable; | ||
339 | *pstream = &mem->base; | 418 | *pstream = &mem->base; |
340 | return 0; | 419 | return 0; |
341 | } | 420 | } | ... | ... |
... | @@ -27,14 +27,7 @@ | ... | @@ -27,14 +27,7 @@ |
27 | 27 | ||
28 | #include <mailutils/error.h> | 28 | #include <mailutils/error.h> |
29 | #include <mailutils/refcount.h> | 29 | #include <mailutils/refcount.h> |
30 | #include <mailutils/sys/ticket.h> | 30 | #include <mailutils/sys/pticket.h> |
31 | |||
32 | struct _prompt_ticket | ||
33 | { | ||
34 | struct _ticket base; | ||
35 | int ref; | ||
36 | mu_refcount_t refcount; | ||
37 | }; | ||
38 | 31 | ||
39 | static void | 32 | static void |
40 | echo_off(struct termios *stored_settings) | 33 | echo_off(struct termios *stored_settings) |
... | @@ -52,17 +45,17 @@ echo_on(struct termios *stored_settings) | ... | @@ -52,17 +45,17 @@ echo_on(struct termios *stored_settings) |
52 | tcsetattr (0, TCSANOW, stored_settings); | 45 | tcsetattr (0, TCSANOW, stored_settings); |
53 | } | 46 | } |
54 | 47 | ||
55 | static int | 48 | int |
56 | _prompt_ref (ticket_t ticket) | 49 | _ticket_prompt_ref (ticket_t ticket) |
57 | { | 50 | { |
58 | struct _prompt_ticket *prompt = (struct _prompt_ticket *)ticket; | 51 | struct _ticket_prompt *prompt = (struct _ticket_prompt *)ticket; |
59 | return mu_refcount_inc (prompt->refcount); | 52 | return mu_refcount_inc (prompt->refcount); |
60 | } | 53 | } |
61 | 54 | ||
62 | static void | 55 | void |
63 | _prompt_destroy (ticket_t *pticket) | 56 | _ticket_prompt_destroy (ticket_t *pticket) |
64 | { | 57 | { |
65 | struct _prompt_ticket *prompt = (struct _prompt_ticket *)*pticket; | 58 | struct _ticket_prompt *prompt = (struct _ticket_prompt *)*pticket; |
66 | if (mu_refcount_dec (prompt->refcount) == 0) | 59 | if (mu_refcount_dec (prompt->refcount) == 0) |
67 | { | 60 | { |
68 | mu_refcount_destroy (&prompt->refcount); | 61 | mu_refcount_destroy (&prompt->refcount); |
... | @@ -70,8 +63,8 @@ _prompt_destroy (ticket_t *pticket) | ... | @@ -70,8 +63,8 @@ _prompt_destroy (ticket_t *pticket) |
70 | } | 63 | } |
71 | } | 64 | } |
72 | 65 | ||
73 | static int | 66 | int |
74 | _prompt_pop (ticket_t ticket, const char *challenge, char **parg) | 67 | _ticket_prompt_pop (ticket_t ticket, const char *challenge, char **parg) |
75 | { | 68 | { |
76 | char arg[256]; | 69 | char arg[256]; |
77 | struct termios stored_settings; | 70 | struct termios stored_settings; |
... | @@ -98,18 +91,35 @@ _prompt_pop (ticket_t ticket, const char *challenge, char **parg) | ... | @@ -98,18 +91,35 @@ _prompt_pop (ticket_t ticket, const char *challenge, char **parg) |
98 | return 0; | 91 | return 0; |
99 | } | 92 | } |
100 | 93 | ||
101 | static struct _ticket_vtable _prompt_vtable = | 94 | static struct _ticket_vtable _ticket_prompt_vtable = |
102 | { | 95 | { |
103 | _prompt_ref, | 96 | _ticket_prompt_ref, |
104 | _prompt_destroy, | 97 | _ticket_prompt_destroy, |
105 | 98 | ||
106 | _prompt_pop, | 99 | _ticket_prompt_pop, |
107 | }; | 100 | }; |
108 | 101 | ||
109 | int | 102 | int |
103 | _ticket_prompt_ctor (struct _ticket_prompt *prompt) | ||
104 | { | ||
105 | mu_refcount_create (&prompt->refcount); | ||
106 | if (prompt->refcount == NULL) | ||
107 | return MU_ERROR_NO_MEMORY; | ||
108 | prompt->base.vtable = &_ticket_prompt_vtable; | ||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | void | ||
113 | _ticket_prompt_dtor (struct _ticket_prompt *prompt) | ||
114 | { | ||
115 | mu_refcount_destroy (&prompt->refcount); | ||
116 | } | ||
117 | |||
118 | int | ||
110 | ticket_prompt_create (ticket_t *pticket) | 119 | ticket_prompt_create (ticket_t *pticket) |
111 | { | 120 | { |
112 | struct _prompt_ticket *prompt; | 121 | struct _ticket_prompt *prompt; |
122 | int status; | ||
113 | 123 | ||
114 | if (pticket == NULL) | 124 | if (pticket == NULL) |
115 | return MU_ERROR_INVALID_PARAMETER; | 125 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -118,14 +128,12 @@ ticket_prompt_create (ticket_t *pticket) | ... | @@ -118,14 +128,12 @@ ticket_prompt_create (ticket_t *pticket) |
118 | if (prompt == NULL) | 128 | if (prompt == NULL) |
119 | return MU_ERROR_NO_MEMORY; | 129 | return MU_ERROR_NO_MEMORY; |
120 | 130 | ||
121 | mu_refcount_create (&prompt->refcount); | 131 | status = _ticket_prompt_ctor (prompt); |
122 | if (prompt->refcount == NULL) | 132 | if (status != 0) |
123 | { | 133 | { |
124 | free (prompt); | 134 | free (prompt); |
125 | return MU_ERROR_NO_MEMORY; | 135 | return status; |
126 | } | 136 | } |
127 | *pticket = &prompt->base; | 137 | *pticket = &prompt->base; |
128 | prompt->base.vtable = &_prompt_vtable; | ||
129 | return 0; | 138 | return 0; |
130 | } | 139 | } |
131 | ... | ... |
... | @@ -27,19 +27,19 @@ | ... | @@ -27,19 +27,19 @@ |
27 | #include <mailutils/sys/sdebug.h> | 27 | #include <mailutils/sys/sdebug.h> |
28 | #include <mailutils/error.h> | 28 | #include <mailutils/error.h> |
29 | 29 | ||
30 | static int | 30 | int |
31 | _sdebug_ref (mu_debug_t debug) | 31 | _mu_debug_stream_ref (mu_debug_t debug) |
32 | { | 32 | { |
33 | struct _sdebug *sdebug = (struct _sdebug *)debug; | 33 | struct _mu_debug_stream *sdebug = (struct _mu_debug_stream *)debug; |
34 | return mu_refcount_inc (sdebug->refcount); | 34 | return mu_refcount_inc (sdebug->refcount); |
35 | } | 35 | } |
36 | 36 | ||
37 | static void | 37 | void |
38 | _sdebug_destroy (mu_debug_t *pdebug) | 38 | _mu_debug_stream_destroy (mu_debug_t *pdebug) |
39 | { | 39 | { |
40 | if (pdebug && *pdebug) | 40 | if (pdebug && *pdebug) |
41 | { | 41 | { |
42 | struct _sdebug *sdebug = (struct _sdebug *)*pdebug; | 42 | struct _mu_debug_stream *sdebug = (struct _mu_debug_stream *)*pdebug; |
43 | if (mu_refcount_dec (sdebug->refcount) == 0) | 43 | if (mu_refcount_dec (sdebug->refcount) == 0) |
44 | { | 44 | { |
45 | if (sdebug->stream) | 45 | if (sdebug->stream) |
... | @@ -55,27 +55,27 @@ _sdebug_destroy (mu_debug_t *pdebug) | ... | @@ -55,27 +55,27 @@ _sdebug_destroy (mu_debug_t *pdebug) |
55 | } | 55 | } |
56 | } | 56 | } |
57 | 57 | ||
58 | static int | 58 | int |
59 | _sdebug_set_level (mu_debug_t debug, size_t level) | 59 | _mu_debug_stream_set_level (mu_debug_t debug, size_t level) |
60 | { | 60 | { |
61 | struct _sdebug *sdebug = (struct _sdebug *)debug; | 61 | struct _mu_debug_stream *sdebug = (struct _mu_debug_stream *)debug; |
62 | sdebug->level = level; | 62 | sdebug->level = level; |
63 | return 0; | 63 | return 0; |
64 | } | 64 | } |
65 | 65 | ||
66 | static int | 66 | int |
67 | _sdebug_get_level (mu_debug_t debug, size_t *plevel) | 67 | _mu_debug_stream_get_level (mu_debug_t debug, size_t *plevel) |
68 | { | 68 | { |
69 | struct _sdebug *sdebug = (struct _sdebug *)debug; | 69 | struct _mu_debug_stream *sdebug = (struct _mu_debug_stream *)debug; |
70 | if (plevel) | 70 | if (plevel) |
71 | *plevel = sdebug->level; | 71 | *plevel = sdebug->level; |
72 | return 0; | 72 | return 0; |
73 | } | 73 | } |
74 | 74 | ||
75 | static int | 75 | int |
76 | _sdebug_print (mu_debug_t debug, size_t level, const char *mesg) | 76 | _mu_debug_stream_print (mu_debug_t debug, size_t level, const char *mesg) |
77 | { | 77 | { |
78 | struct _sdebug *sdebug = (struct _sdebug *)debug; | 78 | struct _mu_debug_stream *sdebug = (struct _mu_debug_stream *)debug; |
79 | 79 | ||
80 | if (mesg == NULL) | 80 | if (mesg == NULL) |
81 | return MU_ERROR_INVALID_PARAMETER; | 81 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -86,21 +86,21 @@ _sdebug_print (mu_debug_t debug, size_t level, const char *mesg) | ... | @@ -86,21 +86,21 @@ _sdebug_print (mu_debug_t debug, size_t level, const char *mesg) |
86 | return stream_write (sdebug->stream, mesg, strlen (mesg), NULL); | 86 | return stream_write (sdebug->stream, mesg, strlen (mesg), NULL); |
87 | } | 87 | } |
88 | 88 | ||
89 | struct _mu_debug_vtable _sdebug_vtable = | 89 | static struct _mu_debug_vtable _mu_debug_stream_vtable = |
90 | { | 90 | { |
91 | _sdebug_ref, | 91 | _mu_debug_stream_ref, |
92 | _sdebug_destroy, | 92 | _mu_debug_stream_destroy, |
93 | 93 | ||
94 | _sdebug_get_level, | 94 | _mu_debug_stream_get_level, |
95 | _sdebug_set_level, | 95 | _mu_debug_stream_set_level, |
96 | _sdebug_print | 96 | _mu_debug_stream_print |
97 | }; | 97 | }; |
98 | 98 | ||
99 | int | 99 | int |
100 | mu_debug_stream_create (mu_debug_t *pdebug, stream_t stream, | 100 | mu_debug_stream_create (mu_debug_t *pdebug, stream_t stream, |
101 | int close_on_destroy) | 101 | int close_on_destroy) |
102 | { | 102 | { |
103 | struct _sdebug *sdebug; | 103 | struct _mu_debug_stream *sdebug; |
104 | 104 | ||
105 | if (pdebug == NULL || stream == NULL) | 105 | if (pdebug == NULL || stream == NULL) |
106 | return MU_ERROR_INVALID_PARAMETER; | 106 | return MU_ERROR_INVALID_PARAMETER; |
... | @@ -119,7 +119,7 @@ mu_debug_stream_create (mu_debug_t *pdebug, stream_t stream, | ... | @@ -119,7 +119,7 @@ mu_debug_stream_create (mu_debug_t *pdebug, stream_t stream, |
119 | sdebug->level = 0; | 119 | sdebug->level = 0; |
120 | sdebug->stream = stream; | 120 | sdebug->stream = stream; |
121 | sdebug->close_on_destroy = close_on_destroy; | 121 | sdebug->close_on_destroy = close_on_destroy; |
122 | sdebug->base.vtable = &_sdebug_vtable; | 122 | sdebug->base.vtable = &_mu_debug_stream_vtable; |
123 | *pdebug = &sdebug->base; | 123 | *pdebug = &sdebug->base; |
124 | return 0; | 124 | return 0; |
125 | } | 125 | } | ... | ... |
This diff is collapsed.
Click to expand it.
-
Please register or sign in to post a comment