* 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 "../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)
{
struct canque_ends_t *qends;
struct canque_edge_t *qedge;
struct canque_slot_t *slot;
- int ret = 0;
- int bytes_to_copy = 0;
+ int ret;
+ 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;
}
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;
}
/* Prepare first message */
- copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t));
- /* Automatic selection of extended format if "extended" set and ID>2047 */
- if (extended) if (msg_buff.id & ~0x7ffl ) msg_buff.flags |= MSG_EXT;
+ ret = copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t));
+ if(ret) return -EFAULT;
+
+ /* 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.
/*
* 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 */
- if (extended) if (msg_buff.id & ~0x7ffl ) msg_buff.flags |= MSG_EXT;
+ ret = copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t));
+ if(ret) return -EFAULT;
+
+ /* 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) {