X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/11132ea490f9e860744ee4f851c67e7fb4444231..a682f9de48bcce43fba6141fbdb4d451914e0bb4:/lincan/src/write.c diff --git a/lincan/src/write.c b/lincan/src/write.c index 2874003..dccade1 100644 --- a/lincan/src/write.c +++ b/lincan/src/write.c @@ -4,20 +4,13 @@ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member * email:pisa@cmp.felk.cvut.cz * This software is released under the GPL-License. - * Version lincan-0.2 9 Jul 2003 + * Version lincan-0.3 17 Jun 2004 */ -#include - -#define __NO_VERSION__ -#include -#include -#include -#include -#include -#include - +#include "../include/can.h" +#include "../include/can_sysdep.h" #include "../include/main.h" +#include "../include/write.h" ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t *offset) { @@ -28,10 +21,10 @@ ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t * struct canque_edge_t *qedge; struct canque_slot_t *slot; int ret = 0; - int bytes_to_copy = 0; + unsigned bytes_to_copy; if(!canuser || (canuser->magic != CAN_USER_MAGIC)){ - CANMSG("can_close: bad canuser magic\n"); + CANMSG("can_write: bad canuser magic\n"); return -ENODEV; } @@ -40,7 +33,7 @@ ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t * DEBUGMSG("this will always return 0 !\n"); return 0; } - if (length > 8 * sizeof(struct canmsg_t)) { + if (length > INT_MAX) { CANMSG("Trying to write more than is supported.\n"); return -1; } @@ -62,17 +55,22 @@ ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t * /* Prepare first message */ copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t)); + /* Automatic selection of extended format if ID>2047 */ + if (msg_buff.id & ~0x7ffl & MSG_ID_MASK ) msg_buff.flags |= MSG_EXT; + /* has been dependent on "extended" option */ + /* If the output buffer is full, return immediately in case O_NONBLOCK * has been specified or loop until space becomes available. */ if ((ret=canque_get_inslot4id(qends, &qedge, &slot, 0, msg_buff.id, 0))<0){ DEBUGMSG("Buffer is full\n"); - if (file->f_flags & O_NONBLOCK) - return -EAGAIN; if(ret < -1) return -EIO; + if (file->f_flags & O_NONBLOCK) + return -EAGAIN; + ret=canque_get_inslot4id_wait_kern(qends, &qedge, &slot, 0, msg_buff.id, 0); if(ret<0) { @@ -90,16 +88,21 @@ ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t * /* * Try to send more messages */ - while (bytes_to_copy > 0) { + while (bytes_to_copy >= sizeof(struct canmsg_t)) { + bytes_to_copy -= sizeof(struct canmsg_t); /* Prepare first message */ copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t)); + + /* Automatic selection of extended format if ID>2047 */ + if (msg_buff.id & ~0x7ffl & MSG_ID_MASK ) msg_buff.flags |= MSG_EXT; + /* has been dependent on "extended" option */ + /* Get slot */ if(canque_get_inslot4id(qends, &qedge, &slot, 0, msg_buff.id, 0) < 0) break; slot->msg=msg_buff; canque_put_inslot(qends, qedge, slot); buffer += sizeof(struct canmsg_t); - bytes_to_copy -= sizeof(struct canmsg_t); } if(file->f_flags & O_SYNC) {