]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/host/ul_drv/ul_lib/ul_msg_buf.c
Initializing repo
[can-usb1.git] / ulan / host / ul_drv / ul_lib / ul_msg_buf.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <ul_msg_buf.h>
4
5 int
6 ul_msg_buf_init(ul_msg_buf_t *buf)
7 {
8   memset(buf,0,sizeof(ul_msg_buf_t));
9   ul_dbuff_init(&buf->data, 0);
10   return 0;
11 }
12
13 void
14 ul_msg_buf_destroy(ul_msg_buf_t *buf)
15 {
16   ul_msg_buf_t *tail;
17   buf->msginfo.len=0;
18   buf->msginfo.flg=0;
19   ul_dbuff_destroy(&buf->data);
20   tail=buf->tail;
21   buf->tail=0;
22   while(tail){
23     buf=tail;
24     tail=buf->tail;
25     ul_dbuff_destroy(&buf->data);
26     free(buf);
27   }
28 }
29
30 int
31 ul_msg_buf_rd_data(ul_msg_buf_t *buf, ul_fd_t ul_fd)
32 {
33   ssize_t len, rd_len;
34   len=buf->msginfo.len;
35   if (ul_dbuff_prep(&buf->data,len)<len)
36     return -1;
37   if(!len) return 0;
38   rd_len=ul_read(ul_fd,buf->data.data, len);
39   if(rd_len!=len) return -1;
40   return rd_len;
41 }
42
43 int
44 ul_msg_buf_rd_rest(ul_msg_buf_t *buf, ul_fd_t ul_fd)
45 {
46   int frames=0;
47   ul_msg_buf_t *tail;
48   do{
49     if(buf->msginfo.len)
50       if(ul_msg_buf_rd_data(buf,ul_fd)<0)
51         break;
52     frames++;
53     if(!(buf->msginfo.flg&UL_BFL_TAIL)){
54       ul_freemsg(ul_fd);
55       return frames;
56     }
57     if(!(tail=malloc(sizeof(ul_msg_buf_t))))
58       break;
59     ul_msg_buf_init(tail);
60     if(ul_actailmsg(ul_fd,&tail->msginfo)<0)
61     {
62       ul_msg_buf_destroy(tail);
63       free(tail);
64       break;
65     }
66     buf->tail=tail;
67     buf=tail;
68   }while(1);
69   ul_freemsg(ul_fd);
70   return -1;
71 }
72
73 int
74 ul_msg_buf_wr(ul_msg_buf_t *buf, ul_fd_t ul_fd)
75 {
76   int l;
77   if (!buf) return -1;
78   l=buf->msginfo.len;
79   buf->msginfo.len=0;
80   if (ul_newmsg(ul_fd,&buf->msginfo)<0) return -1;
81   do{
82     if (ul_write(ul_fd,buf->data.data,l)!=l) 
83       break;
84     if(!(buf->msginfo.flg&UL_BFL_TAIL)){
85       return ul_freemsg(ul_fd);
86     }
87     buf=buf->tail;
88     l=buf->msginfo.len;
89     buf->msginfo.len=0;
90     if(ul_tailmsg(ul_fd,&buf->msginfo)<0)
91       break;
92   }while(1);
93   ul_abortmsg(ul_fd);
94   return -1;
95 }