X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/659b098309c2bca57ac60a35a1b9900d6f28e74d..2827b727d2910a3b48f9de7d67b3a67f59e256c7:/lincan/src/write.c diff --git a/lincan/src/write.c b/lincan/src/write.c index 2f32b2e..1760bc2 100644 --- a/lincan/src/write.c +++ b/lincan/src/write.c @@ -7,16 +7,8 @@ * Version lincan-0.2 9 Jul 2003 */ -#include - -#define __NO_VERSION__ -#include -#include -#include -#include -#include -#include - +#include "../include/can.h" +#include "../include/can_sysdep.h" #include "../include/main.h" ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t *offset) @@ -28,10 +20,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 +32,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; } @@ -70,11 +62,12 @@ ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t * 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) { @@ -92,7 +85,8 @@ 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 "extended" set and ID>2047 */ @@ -103,7 +97,6 @@ ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t * 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) {