diff options
Diffstat (limited to 'mbim-dev.c')
-rw-r--r-- | mbim-dev.c | 24 |
1 files changed, 19 insertions, 5 deletions
@@ -25,7 +25,8 @@ #include "mbim.h" -uint8_t mbim_buffer[MBIM_BUFFER_SIZE]; +size_t mbim_bufsize = 0; +uint8_t *mbim_buffer = NULL; static struct uloop_fd mbim_fd; static uint32_t expected; int no_close; @@ -33,7 +34,7 @@ int no_close; static void mbim_msg_tout_cb(struct uloop_timeout *t) { fprintf(stderr, "ERROR: mbim message timeout\n"); - uloop_end(); + mbim_end(); } static struct uloop_timeout tout = { @@ -46,7 +47,7 @@ mbim_send(void) struct mbim_message_header *hdr = (struct mbim_message_header *) mbim_buffer; int ret = 0; - if (le32toh(hdr->length) > MBIM_BUFFER_SIZE) { + if (le32toh(hdr->length) > mbim_bufsize) { fprintf(stderr, "message too big %d\n", le32toh(hdr->length)); return -1; } @@ -74,7 +75,7 @@ mbim_send(void) static void mbim_recv(struct uloop_fd *u, unsigned int events) { - ssize_t cnt = read(u->fd, mbim_buffer, MBIM_BUFFER_SIZE); + ssize_t cnt = read(u->fd, mbim_buffer, mbim_bufsize); struct mbim_message_header *hdr = (struct mbim_message_header *) mbim_buffer; struct command_done_message *msg = (struct command_done_message *) (hdr + 1); int i; @@ -118,7 +119,7 @@ mbim_recv(struct uloop_fd *u, unsigned int events) mbim_send_close_msg(); break; case MBIM_MESSAGE_TYPE_CLOSE_DONE: - uloop_end(); + mbim_end(); break; case MBIM_MESSAGE_TYPE_FUNCTION_ERROR: no_close = 0; @@ -137,5 +138,18 @@ mbim_open(const char *path) perror("open failed: "); exit(-1); } + mbim_bufsize = MBIM_BUFFER_SIZE; + mbim_buffer = malloc(mbim_bufsize); uloop_fd_add(&mbim_fd, ULOOP_READ); } + +void +mbim_end(void) +{ + if (mbim_buffer) { + free(mbim_buffer); + mbim_bufsize = 0; + mbim_buffer = NULL; + } + uloop_end(); +} |