]> www.average.org Git - pam_pcsc_cr.git/blob - serial.c
PAM module works
[pam_pcsc_cr.git] / serial.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4 #include <string.h>
5 #include "serial.h"
6
7 void serial_init(serializer_t *srl, void *buffer, int size)
8 {
9         srl->buffer = srl->cursor = buffer;
10         srl->bufsize = size;
11 }
12
13 void serial_switch(serializer_t *srl, void *buffer, int size)
14 {
15         int used = srl->cursor - srl->buffer;
16
17         memcpy(buffer, srl->buffer, used);
18         srl->buffer = buffer;
19         srl->bufsize = size;
20         srl->cursor = buffer + used;
21 }
22
23 /* returns 'size' on success, or remainging space if it was insufficient */
24 int serial_put(serializer_t *srl, const void *item, int size)
25 {
26         int left = srl->bufsize - (srl->cursor - srl->buffer);
27
28         if (left < size + sizeof(short)) return left - sizeof(short);
29         *((short *)srl->cursor) = size;
30         srl->cursor += sizeof(short);
31         if (size) memcpy(srl->cursor, item, size);
32         srl->cursor += size;
33         return size;
34 }
35
36 /* return 0 on success, -1 on wrong encoding (item longer than space left) */
37 int serial_get(serializer_t *srl, void **item, int *size)
38 {
39         int left = srl->bufsize - (srl->cursor - srl->buffer);
40         short isize = *((short *)srl->cursor);
41
42         if (isize + sizeof(short) > left) return -1;
43         srl->cursor += sizeof(short);
44         *item = srl->cursor;
45         *size = isize;
46         srl->cursor += isize;
47         return 0;
48 }
49
50 int serial_size(serializer_t *srl)
51 {
52         return srl->cursor - srl->buffer;
53 }