Skip to content

Commit 4a36b8f

Browse files
author
Arka
committed
successfully added ioctl methods...
1 parent ad44ec0 commit 4a36b8f

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

fourmb_device_driver.c

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#define SET_SIZE 512
1717
#define NUM_SETS DEV_SIZE/SET_SIZE
1818
#define DEBUG
19-
19+
#define MESSAGE_LEN 20
2020
#define FOURMB_DEBUG1
2121

2222
#ifdef FOURMB_DEBUG1
@@ -28,7 +28,7 @@
2828
#define FOURMB_IOC_HELLO _IO(FOURMB_IOC_MAGIC,1)
2929
#define FOURMB_IOC_STM _IOW(FOURMB_IOC_MAGIC,2,unsigned long) /* write a message */
3030
#define FOURMB_IOC_LDM _IOR(FOURMB_IOC_MAGIC,3,unsigned long) /* read a message*/
31-
#define FOURMB_IOC_LDSTM _IORW(FOURMB_IOC_MAGIC,4,unsigned long) /* Do both */
31+
#define FOURMB_IOC_LDSTM _IOWR(FOURMB_IOC_MAGIC,4,unsigned long) /* Do both */
3232
#define FOURMB_IOC_MAXNR 14
3333

3434
int fourmb_major = MAJOR_NUMBER;
@@ -61,7 +61,7 @@ struct fourmb_dev {
6161
*/
6262
unsigned long size;
6363
struct cdev cdev;
64-
char* dev_msg; // used in ioctl method.
64+
char dev_msg[MESSAGE_LEN]; // used in ioctl method.
6565
};
6666

6767
struct fourmb_dev* fourmb_device; /* Device Instance */
@@ -285,7 +285,7 @@ loff_t fourmb_lseek(struct file* filep, loff_t off, int whence) {
285285
long fourmb_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) {
286286
struct fourmb_dev *dev = filep->private_data;
287287
int retval, err = 0;
288-
//char* dev_msg;
288+
char tmp_msg[MESSAGE_LEN];
289289

290290
/* check for appropriate commands */
291291
if (_IOC_TYPE(cmd) != FOURMB_IOC_MAGIC) return -ENOTTY;
@@ -314,23 +314,43 @@ long fourmb_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) {
314314
* I seriously dont know why it works vis-a-vis the commented
315315
* code above and below, but never mind
316316
*/
317-
dev->dev_msg = (char *)arg;
317+
//dev->dev_msg = (char *)arg;
318318

319-
//if(copy_from_user(dev->dev_msg,(char *)arg,MESSAGE_LEN)) {
320-
// printk(KERN_ERR "fourmb_device: ioctl failed to name the device");
321-
// return -ENOTTY;
322-
//}
319+
if(copy_from_user(dev->dev_msg,(char *)arg,MESSAGE_LEN)) {
320+
printk(KERN_ERR "fourmb_device: ioctl failed to name the device\n");
321+
return -ENOTTY;
322+
}
323323
printk(KERN_INFO "fourmb_device: ioctl naming the device as %s\n",dev->dev_msg);
324324
//strcpy(dev->dev_msg,dev_msg);
325325
break;
326326

327-
case FOURMB_IOC_LDM: /* read the device string */
327+
case FOURMB_IOC_LDM: /* read the device string */
328+
if(copy_to_user((char *)arg,dev->dev_msg,MESSAGE_LEN)) {
329+
printk(KERN_ERR "fourmb_device: ioctl failed to retrieve the device name\n");
330+
return -ENOTTY;
331+
}
332+
break;
328333
// retval = __put_user(dev_msg,(char __user *)arg);
329334
// if(retval) {
330335
// printk(KERN_INFO "fourmb_device: ioctl device name retrieval failed\n");
331336
// return retval;
332337
// }
333338
// break;
339+
case FOURMB_IOC_LDSTM:
340+
if(copy_from_user(tmp_msg,(char *)arg,MESSAGE_LEN)) {
341+
printk(KERN_ERR "fourmb_device: ioctl failed to tmp_msg store the name for swap\n");
342+
return -ENOTTY;
343+
}
344+
printk(KERN_INFO "fourmb_device: ioctl temporarily stored the name for swap %s\n",tmp_msg);
345+
if(copy_to_user((char *)arg,dev->dev_msg,MESSAGE_LEN)) {
346+
printk(KERN_ERR "fourmb_device: ioctl failed to swap the device name\n");
347+
return -ENOTTY;
348+
}
349+
printk(KERN_INFO "fourmb_device: ioctl successfuly swapped the device name\n");
350+
strcpy(dev->dev_msg,tmp_msg);
351+
printk(KERN_INFO "fourmb_device: ioctl new device name after swap %s\n",dev->dev_msg);
352+
break;
353+
334354
default:
335355
return -ENOTTY;
336356
}
@@ -380,7 +400,7 @@ static int __init fourmb_device_init(void) {
380400
memset(fourmb_device,0,sizeof(struct fourmb_dev));
381401

382402
/* Device Initialization */
383-
fourmb_device->dev_msg = "anonymous";
403+
strcpy(fourmb_device->dev_msg,"anonymous");
384404
cdev_init(&(fourmb_device->cdev),&fourmb_fops);
385405
fourmb_device->cdev.owner = THIS_MODULE;
386406
fourmb_device->cdev.ops = &fourmb_fops;

ioctl_test.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ int lcd;
1010
#define FOURMB_IOC_HELLO _IO(FOURMB_IOC_MAGIC,1)
1111
#define FOURMB_IOC_STM _IOW(FOURMB_IOC_MAGIC,2,unsigned long) /* write a message */
1212
#define FOURMB_IOC_LDM _IOR(FOURMB_IOC_MAGIC,3,unsigned long) /* read a message*/
13-
#define FOURMB_IOC_LDSTM _IORW(FOURMB_IOC_MAGIC,4,unsigned long) /* Do both */
14-
#define FOURMB_IOC_MAXNR 14
13+
#define FOURMB_IOC_LDSTM _IOWR(FOURMB_IOC_MAGIC,4,unsigned long) /* Do both */
14+
#define FOURMB_IOC_MAXNR 4
1515

1616
void test() {
1717
int k, i, sum;
18-
char s[3];
18+
char s[3], user_msg[30] = "jkfvfvb";
1919
memset(s,'2',sizeof(s));
2020

2121
printf("ioctl_test: writing to device\n");
@@ -25,10 +25,16 @@ void test() {
2525
k = ioctl(lcd,FOURMB_IOC_HELLO);
2626

2727
printf("ioctl_test: writing a message to device\n");
28-
//char* tmp = "A0163183H";
2928
k = ioctl(lcd,FOURMB_IOC_STM,"lkncvn");
30-
printf("ioctl_test: written = %d\n",k);
29+
printf("ioctl_test: written = %d\n",k);
30+
31+
//printf("ioctl_test: retrieving a message from the device\n");
32+
//k = ioctl(lcd,FOURMB_IOC_LDM,user_msg);
33+
//printf("ioctl_test: read = %s\n",user_msg);
3134

35+
printf("ioctl_test: swapping user_msg %s with dev_msg \n",user_msg);
36+
k = ioctl(lcd,FOURMB_IOC_LDSTM,user_msg);
37+
printf("ioctl_test: after swap user_msg %s\n",user_msg);
3238
}
3339

3440
int main(int argc, char** argv) {

0 commit comments

Comments
 (0)