Write An Ioctl Command To Sort The First Quantum of The First Sculldev in Scull Device (Modify Main.c)
Write An Ioctl Command To Sort The First Quantum of The First Sculldev in Scull Device (Modify Main.c)
Write an ioctl command to sort the first quantum of the first Sculldev in scull
device(modify main.c)
Solution
#define SCULL_DEBUG
#include <linux/slab.h> /* kmalloc() */
#include<linux/string.h>
int scull_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
case SCULL_IOSORT :
dev=&scull_devices[0];
// printk("<1> %s",dev->data[0]);
// while(dev!=NULL)
{
char *str='\0';
str = dev->data[0];
dlen=0;
printk("<1>str %s ",dev->data[0]);
printk("\n inside ");
dlen = strlen(str);
*(str+dlen)='\0';
printk("<1>str %s ",str);
printk("<1>dlen = %d ",dlen);
for(i=0;i<dlen-1;i++)
for(j=0;j<dlen-i-1;j++)
{
// printk("<1> str i %c \n ", *(str+i));
if(*(str+j) > *(str+j+1))
{
temp =*(str+j);
*(str+j)=*(str+j+1);
*(str+j+1) =temp;
}
}
printk("<1>str %s ",str);
*(str+dlen)='\0';
printk("<1> %s", str);
dev->data[0]=str;
// dev=dev->next;
}
break;
In Scull.h header file
#define SCULL_IOSORT _IO(SCULL_IOC_MAGIC,16)
#define SCULL_IOC_MAXNR 16
2.Write an ioctl command to sort the nth quantum of the first Sculldev in scull
device(modify main.c)
case SCULL_IOCSORT :
dev=&scull_devices[0];
ret=__get_user(nquantum,(int *)arg);
if(ret > dev->quantum )return ret;
// printk("<1> %s",dev->data[0]);
// while(dev!=NULL)
{
char *str = dev->data[nquantum];
dlen=0;
// printk("<1>str %s ",str);
printk("\n inside ");
dlen = strlen(str);
//printk("<1>dlen = %d ",dlen);
for(i=0;i<dlen-1;i++)
for(j=0;j<dlen-i-1;j++)
{
// printk("<1> str i %c \n ", *(str+i));
if(*(str+j) > *(str+j+1))
{
temp =*(str+j);
*(str+j)=*(str+j+1);
*(str+j+1) =temp;
}
}
printk("<1> %s", str);
dev->data[nquantum]=str;
// dev=dev->next;
}
break;
In scull.h file
case SCULL_IOCCHANGE:
temp=kmalloc(sizeof(Scull_Dev),GFP_KERNEL);
memset(scull_devices,0,sizeof(Scull_Dev));
temp = &scull_devices[1];
scull_devices[1]=scull_devices[0];
scull_devices=temp;
printk("<1>first \n second %p %p %p
\n",&scull_devices[1],&scull_devices[0],scull_devices);
break;
4.Display the first 50 characters of the first quantum of each of the 4 scull devices using
proc filesystem.
In scull_read _procmem
int m;
for (j = 0; j < d->qset; j++) {
if (d->data[j])
{
if(j==0)
{
char *str = d->data[0];
char *st="";
m=0;
while(*str&& m<50)
{
*st=*str;
str++;
st++;
m=m+1;
}
len+=sprintf(buf+len," %4i : %s
\n",j,st);
}}
In scull_ioctl()
6. Implement an ioctl command to empty the scull device( use scull trim).
In scull_trim()
printk("<1> trim apply");
In scull_ioctl()
int err = 0, tmp;
int j,dlen,i=0,ret = 0;
Scull_Dev *dev;
char temp;
case SCULL_IOCTRIM:
for(i=0;i<scull_nr_devs;i++)
scull_trim(&scull_devices[i]);
break;
In scull.h add
7 Modify lseek to move fops to the ith qpos of the first quantum. Suppose the call is lseek (fd, 5,
SEEK_SET), move to the 5th quantum.
In ssize_t scull_read()
printk("<1>fpos %d spos %d qpos = %d \n", *f_pos,s_pos,q_pos);
In scull_llseek()
off=off*dev->quantum;
In scull_ioctl()
int err = 0, tmp;
int j,dlen,i=0,ret = 0;
Scull_Dev *dev;
char temp;
In
int m;
for (i = 0; i < scull_nr_devs && len <= limit; i++) {
Scull_Dev *d = &scull_devices[i];
if (down_interruptible(&d->sem))
return -ERESTARTSYS;
d->quantum=20;
len += sprintf(buf+len,"\nDevice %i: qset %i, q %i, sz %li\n",
i, d->qset, d->quantum, d->size);
for (; d && len <= limit; d = d->next) { /* scan the list */
d->quantum=20;
len += sprintf(buf+len, " item at %p, qset at %p\n", d,
d->data);
if (d->data && !d->next) /* dump only the last item - save
space */
9. Create a proc entry to sort the characters in the first quantum of each scull device.
int scull_read_procmem() add
int k,m,len=0,dlen=0;
char temp;
char *str;
at 8th line add
if (d->data[0])
{
str = d->data[0];
dlen=5;
dlen=strlen(d->data[0]);
for(k=0;k<dlen-1;k++)
{
for(m=0;m<dlen-k-1;m++)
{
if(*(str+j)>*(str+j+1))
{
temp=*(str+j);
*(str+j)=*(str+j+1);
*(str+j+1)=temp;}}}}
10 Create a proc entry to blank out the first quantum of each scull device.
int m;
d->data[0]=""; @line 8
In scull_ioctl()add
int err = 0, tmp;
int j,dlen,i=0,ret = 0;
Scull_Dev *dev;
char temp;
11 Modify scull_priv to allow each user to have a single persistent set of data.
In scull_ioctl()add
int err = 0, tmp;
int j,dlen,i=0,ret = 0;
Scull_Dev *dev;
char temp;
In scull_init_module()
#ifdef CONFIG_DEVFS_FS//after this add following statement
printk("<1>registering scull012");
printk("<1>looking for other deviecs\n");//after 4 lines
if ( (result = scull_p_init()) )
goto fail;
printk("<1>res1 = %d \n",result);
if ( (result = scull_access_init()) )
goto fail;
printk("<1>res2= %d \n",result);
In Access.c
12 Modify scull_priv to allow each group id to have a single persistent set of data.
In acess.c
Replace all user by group;