#endif /* CONFIG_ISDN_DIVERSION */
-static int isdn_writebuf_stub(int, int, const u_char *, int, int);
+static int isdn_writebuf_stub(int, int, const u_char __user *, int);
static void set_global_features(void);
static int isdn_wildmat(char *s, char *p);
}
static ssize_t
-isdn_read(struct file *file, char *buf, size_t count, loff_t * off)
+isdn_read(struct file *file, char __user *buf, size_t count, loff_t * off)
{
uint minor = MINOR(file->f_dentry->d_inode->i_rdev);
int len = 0;
int retval;
char *p;
- if (off != &file->f_pos)
- return -ESPIPE;
-
lock_kernel();
if (minor == ISDN_MINOR_STATUS) {
if (!file->private_data) {
interruptible_sleep_on(&(dev->info_waitq));
}
p = isdn_statstr();
- file->private_data = 0;
+ file->private_data = NULL;
if ((len = strlen(p)) <= count) {
if (copy_to_user(buf, p, len)) {
retval = -EFAULT;
retval = -ENOMEM;
goto out;
}
- len = isdn_readbchan(drvidx, chidx, p, 0, count,
+ len = isdn_readbchan(drvidx, chidx, p, NULL, count,
&dev->drv[drvidx]->rcv_waitq[chidx]);
*off += len;
if (copy_to_user(buf,p,len))
if (count > dev->drv[drvidx]->stavail)
count = dev->drv[drvidx]->stavail;
len = dev->drv[drvidx]->interface->
- readstat(buf, count, 1, drvidx,
+ readstat(buf, count, drvidx,
isdn_minor2chan(minor));
} else {
len = 0;
}
static ssize_t
-isdn_write(struct file *file, const char *buf, size_t count, loff_t * off)
+isdn_write(struct file *file, const char __user *buf, size_t count, loff_t * off)
{
uint minor = MINOR(file->f_dentry->d_inode->i_rdev);
int drvidx;
int chidx;
int retval;
- if (off != &file->f_pos)
- return -ESPIPE;
-
if (minor == ISDN_MINOR_STATUS)
return -EPERM;
if (!dev->drivers)
goto out;
}
chidx = isdn_minor2chan(minor);
- while (isdn_writebuf_stub(drvidx, chidx, buf, count, 1) != count)
+ while (isdn_writebuf_stub(drvidx, chidx, buf, count) != count)
interruptible_sleep_on(&dev->drv[drvidx]->snd_waitq[chidx]);
retval = count;
goto out;
*/
if (dev->drv[drvidx]->interface->writecmd)
retval = dev->drv[drvidx]->interface->
- writecmd(buf, count, 1, drvidx, isdn_minor2chan(minor));
+ writecmd(buf, count, drvidx, isdn_minor2chan(minor));
else
retval = count;
goto out;
int chidx;
int ret;
int i;
- char *p;
+ char __user *p;
char *s;
union iocpar {
char name[10];
isdn_net_ioctl_phone phone;
isdn_net_ioctl_cfg cfg;
} iocpar;
+ void __user *argp = (void __user *)arg;
#define name iocpar.name
#define bname iocpar.bname
(INF_DV << 16));
case IIOCGETCPS:
if (arg) {
- ulong *p = (ulong *) arg;
+ ulong __user *p = argp;
int i;
- if ((ret = verify_area(VERIFY_WRITE, (void *) arg,
+ if ((ret = verify_area(VERIFY_WRITE, p,
sizeof(ulong) * ISDN_MAX_CHANNELS * 2)))
return ret;
for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
/* Get peer phone number of a connected
* isdn network interface */
if (arg) {
- if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
+ if (copy_from_user(&phone, argp, sizeof(phone)))
return -EFAULT;
- return isdn_net_getpeer(&phone, (isdn_net_ioctl_phone *) arg);
+ return isdn_net_getpeer(&phone, argp);
} else
return -EINVAL;
#endif
case IIOCNETAIF:
/* Add a network-interface */
if (arg) {
- if (copy_from_user(name, (char *) arg, sizeof(name)))
+ if (copy_from_user(name, argp, sizeof(name)))
return -EFAULT;
s = name;
} else {
ret = down_interruptible(&dev->sem);
if( ret ) return ret;
if ((s = isdn_net_new(s, NULL))) {
- if (copy_to_user((char *) arg, s, strlen(s) + 1)){
+ if (copy_to_user(argp, s, strlen(s) + 1)){
ret = -EFAULT;
} else {
ret = 0;
case IIOCNETASL:
/* Add a slave to a network-interface */
if (arg) {
- if (copy_from_user(bname, (char *) arg, sizeof(bname) - 1))
+ if (copy_from_user(bname, argp, sizeof(bname) - 1))
return -EFAULT;
} else
return -EINVAL;
ret = down_interruptible(&dev->sem);
if( ret ) return ret;
if ((s = isdn_net_newslave(bname))) {
- if (copy_to_user((char *) arg, s, strlen(s) + 1)){
+ if (copy_to_user(argp, s, strlen(s) + 1)){
ret = -EFAULT;
} else {
ret = 0;
case IIOCNETDIF:
/* Delete a network-interface */
if (arg) {
- if (copy_from_user(name, (char *) arg, sizeof(name)))
+ if (copy_from_user(name, argp, sizeof(name)))
return -EFAULT;
ret = down_interruptible(&dev->sem);
if( ret ) return ret;
case IIOCNETSCF:
/* Set configurable parameters of a network-interface */
if (arg) {
- if (copy_from_user((char *) &cfg, (char *) arg, sizeof(cfg)))
+ if (copy_from_user(&cfg, argp, sizeof(cfg)))
return -EFAULT;
return isdn_net_setcfg(&cfg);
} else
case IIOCNETGCF:
/* Get configurable parameters of a network-interface */
if (arg) {
- if (copy_from_user((char *) &cfg, (char *) arg, sizeof(cfg)))
+ if (copy_from_user(&cfg, argp, sizeof(cfg)))
return -EFAULT;
if (!(ret = isdn_net_getcfg(&cfg))) {
- if (copy_to_user((char *) arg, (char *) &cfg, sizeof(cfg)))
+ if (copy_to_user(argp, &cfg, sizeof(cfg)))
return -EFAULT;
}
return ret;
case IIOCNETANM:
/* Add a phone-number to a network-interface */
if (arg) {
- if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
+ if (copy_from_user(&phone, argp, sizeof(phone)))
return -EFAULT;
ret = down_interruptible(&dev->sem);
if( ret ) return ret;
case IIOCNETGNM:
/* Get list of phone-numbers of a network-interface */
if (arg) {
- if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
+ if (copy_from_user(&phone, argp, sizeof(phone)))
return -EFAULT;
ret = down_interruptible(&dev->sem);
if( ret ) return ret;
- ret = isdn_net_getphones(&phone, (char *) arg);
+ ret = isdn_net_getphones(&phone, argp);
up(&dev->sem);
return ret;
} else
case IIOCNETDNM:
/* Delete a phone-number of a network-interface */
if (arg) {
- if (copy_from_user((char *) &phone, (char *) arg, sizeof(phone)))
+ if (copy_from_user(&phone, argp, sizeof(phone)))
return -EFAULT;
ret = down_interruptible(&dev->sem);
if( ret ) return ret;
case IIOCNETDIL:
/* Force dialing of a network-interface */
if (arg) {
- if (copy_from_user(name, (char *) arg, sizeof(name)))
+ if (copy_from_user(name, argp, sizeof(name)))
return -EFAULT;
return isdn_net_force_dial(name);
} else
case IIOCNETALN:
if (!arg)
return -EINVAL;
- if (copy_from_user(name, (char *) arg, sizeof(name)))
+ if (copy_from_user(name, argp, sizeof(name)))
return -EFAULT;
return isdn_ppp_dial_slave(name);
case IIOCNETDLN:
if (!arg)
return -EINVAL;
- if (copy_from_user(name, (char *) arg, sizeof(name)))
+ if (copy_from_user(name, argp, sizeof(name)))
return -EFAULT;
return isdn_ppp_hangup_slave(name);
#endif
/* Force hangup of a network-interface */
if (!arg)
return -EINVAL;
- if (copy_from_user(name, (char *) arg, sizeof(name)))
+ if (copy_from_user(name, argp, sizeof(name)))
return -EFAULT;
return isdn_net_force_hangup(name);
break;
if (arg) {
int i;
char *p;
- if (copy_from_user((char *) &iocts, (char *) arg,
+ if (copy_from_user(&iocts, argp,
sizeof(isdn_ioctl_struct)))
return -EFAULT;
if (strlen(iocts.drvid)) {
case IIOCGETPRF:
/* Get all Modem-Profiles */
if (arg) {
- char *p = (char *) arg;
+ char __user *p = argp;
int i;
- if ((ret = verify_area(VERIFY_WRITE, (void *) arg,
+ if ((ret = verify_area(VERIFY_WRITE, argp,
(ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN)
* ISDN_MAX_CHANNELS)))
return ret;
case IIOCSETPRF:
/* Set all Modem-Profiles */
if (arg) {
- char *p = (char *) arg;
+ char __user *p = argp;
int i;
- if ((ret = verify_area(VERIFY_READ, (void *) arg,
+ if ((ret = verify_area(VERIFY_READ, argp,
(ISDN_MODEM_NUMREG + ISDN_MSNLEN + ISDN_LMSNLEN)
* ISDN_MAX_CHANNELS)))
return ret;
/* Set/Get MSN->EAZ-Mapping for a driver */
if (arg) {
- if (copy_from_user((char *) &iocts,
- (char *) arg,
+ if (copy_from_user(&iocts, argp,
sizeof(isdn_ioctl_struct)))
return -EFAULT;
if (strlen(iocts.drvid)) {
if (cmd == IIOCSETMAP) {
int loop = 1;
- p = (char *) iocts.arg;
+ p = (char __user *) iocts.arg;
i = 0;
while (loop) {
int j = 0;
break;
}
} else {
- p = (char *) iocts.arg;
+ p = (char __user *) iocts.arg;
for (i = 0; i < 10; i++) {
sprintf(bname, "%s%s",
strlen(dev->drv[drvidx]->msn2eaz[i]) ?
return -EINVAL;
case IIOCDBGVAR:
if (arg) {
- if (copy_to_user((char *) arg, (char *) &dev, sizeof(ulong)))
+ if (copy_to_user(argp, &dev, sizeof(ulong)))
return -EFAULT;
return 0;
} else
if (arg) {
int i;
char *p;
- if (copy_from_user((char *) &iocts, (char *) arg, sizeof(isdn_ioctl_struct)))
+ if (copy_from_user(&iocts, argp, sizeof(isdn_ioctl_struct)))
return -EFAULT;
if (strlen(iocts.drvid)) {
if ((p = strchr(iocts.drvid, ',')))
drvidx = 0;
if (drvidx == -1)
return -ENODEV;
- if ((ret = verify_area(VERIFY_WRITE, (void *) arg,
+ if ((ret = verify_area(VERIFY_WRITE, argp,
sizeof(isdn_ioctl_struct))))
return ret;
c.driver = drvidx;
c.command = ISDN_CMD_IOCTL;
c.arg = cmd;
- memcpy(c.parm.num, (char *) &iocts.arg, sizeof(ulong));
+ memcpy(c.parm.num, &iocts.arg, sizeof(ulong));
ret = isdn_command(&c);
- memcpy((char *) &iocts.arg, c.parm.num, sizeof(ulong));
- if (copy_to_user((char *) arg, &iocts, sizeof(isdn_ioctl_struct)))
+ memcpy(&iocts.arg, c.parm.num, sizeof(ulong));
+ if (copy_to_user(argp, &iocts, sizeof(isdn_ioctl_struct)))
return -EFAULT;
return ret;
} else
}
#endif
out:
+ nonseekable_open(ino, filep);
return retval;
}
* writebuf replacement for SKB_ABLE drivers
*/
static int
-isdn_writebuf_stub(int drvidx, int chan, const u_char * buf, int len,
- int user)
+isdn_writebuf_stub(int drvidx, int chan, const u_char __user * buf, int len)
{
int ret;
int hl = dev->drv[drvidx]->interface->hl_hdrlen;
if (!skb)
return 0;
skb_reserve(skb, hl);
- if (user)
- copy_from_user(skb_put(skb, len), buf, len);
- else
- memcpy(skb_put(skb, len), buf, len);
+ copy_from_user(skb_put(skb, len), buf, len);
ret = dev->drv[drvidx]->interface->writebuf_skb(drvidx, chan, 1, skb);
if (ret <= 0)
dev_kfree_skb(skb);