aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn/mISDN/socket.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-01-09 18:27:39 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-09 18:27:39 -0500
commit2fb585a10e421b4eeae066eb99080bd7e4512079 (patch)
treeb8ca32933de26e9198490acfb5a4df093fdd8ef9 /drivers/isdn/mISDN/socket.c
parent31aeb6c815549948571eec988ad9728c27d7a68d (diff)
parent69f52adb2d534afc41fcc658f155e01f0b322f9e (diff)
Merge branch 'for_2.6.29' of git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/ISDN-2.6
* 'for_2.6.29' of git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/ISDN-2.6: (28 commits) mISDN: Add HFC USB driver mISDN: Add layer1 prim MPH_INFORMATION_REQ mISDN: Fix kernel crash when doing hardware conference with more than two members mISDN: Added missing create_l1() call mISDN: Add MODULE_DEVICE_TABLE() to hfcpci mISDN: Minor cleanups mISDN: Create /sys/class/mISDN mISDN: Add missing release functions mISDN: Add different different timer settings for hfc-pci mISDN: Minor fixes mISDN: Correct busy device detection mISDN: Fix deactivation, if peer IP is removed from l1oip instance. mISDN: Add ISDN_P_TE_UP0 / ISDN_P_NT_UP0 mISDN: Fix irq detection mISDN: Add ISDN sample clock API to mISDN core mISDN: Return error on E-channel access mISDN: Add E-Channel logging features mISDN: Use protocol to detect D-channel mISDN: Fixed more indexing bugs mISDN: Make debug output a little bit more verbose ...
Diffstat (limited to 'drivers/isdn/mISDN/socket.c')
-rw-r--r--drivers/isdn/mISDN/socket.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c
index 37a2de18cfd0..508945d1b9c1 100644
--- a/drivers/isdn/mISDN/socket.c
+++ b/drivers/isdn/mISDN/socket.c
@@ -381,7 +381,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
381 memcpy(di.channelmap, dev->channelmap, 381 memcpy(di.channelmap, dev->channelmap,
382 sizeof(di.channelmap)); 382 sizeof(di.channelmap));
383 di.nrbchan = dev->nrbchan; 383 di.nrbchan = dev->nrbchan;
384 strcpy(di.name, dev->name); 384 strcpy(di.name, dev_name(&dev->dev));
385 if (copy_to_user((void __user *)arg, &di, sizeof(di))) 385 if (copy_to_user((void __user *)arg, &di, sizeof(di)))
386 err = -EFAULT; 386 err = -EFAULT;
387 } else 387 } else
@@ -460,6 +460,8 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
460{ 460{
461 struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr; 461 struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
462 struct sock *sk = sock->sk; 462 struct sock *sk = sock->sk;
463 struct hlist_node *node;
464 struct sock *csk;
463 int err = 0; 465 int err = 0;
464 466
465 if (*debug & DEBUG_SOCKET) 467 if (*debug & DEBUG_SOCKET)
@@ -480,6 +482,26 @@ data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
480 err = -ENODEV; 482 err = -ENODEV;
481 goto done; 483 goto done;
482 } 484 }
485
486 if (sk->sk_protocol < ISDN_P_B_START) {
487 read_lock_bh(&data_sockets.lock);
488 sk_for_each(csk, node, &data_sockets.head) {
489 if (sk == csk)
490 continue;
491 if (_pms(csk)->dev != _pms(sk)->dev)
492 continue;
493 if (csk->sk_protocol >= ISDN_P_B_START)
494 continue;
495 if (IS_ISDN_P_TE(csk->sk_protocol)
496 == IS_ISDN_P_TE(sk->sk_protocol))
497 continue;
498 read_unlock_bh(&data_sockets.lock);
499 err = -EBUSY;
500 goto done;
501 }
502 read_unlock_bh(&data_sockets.lock);
503 }
504
483 _pms(sk)->ch.send = mISDN_send; 505 _pms(sk)->ch.send = mISDN_send;
484 _pms(sk)->ch.ctrl = mISDN_ctrl; 506 _pms(sk)->ch.ctrl = mISDN_ctrl;
485 507
@@ -639,12 +661,27 @@ base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
639 memcpy(di.channelmap, dev->channelmap, 661 memcpy(di.channelmap, dev->channelmap,
640 sizeof(di.channelmap)); 662 sizeof(di.channelmap));
641 di.nrbchan = dev->nrbchan; 663 di.nrbchan = dev->nrbchan;
642 strcpy(di.name, dev->name); 664 strcpy(di.name, dev_name(&dev->dev));
643 if (copy_to_user((void __user *)arg, &di, sizeof(di))) 665 if (copy_to_user((void __user *)arg, &di, sizeof(di)))
644 err = -EFAULT; 666 err = -EFAULT;
645 } else 667 } else
646 err = -ENODEV; 668 err = -ENODEV;
647 break; 669 break;
670 case IMSETDEVNAME:
671 {
672 struct mISDN_devrename dn;
673 if (copy_from_user(&dn, (void __user *)arg,
674 sizeof(dn))) {
675 err = -EFAULT;
676 break;
677 }
678 dev = get_mdevice(dn.id);
679 if (dev)
680 err = device_rename(&dev->dev, dn.name);
681 else
682 err = -ENODEV;
683 }
684 break;
648 default: 685 default:
649 err = -EINVAL; 686 err = -EINVAL;
650 } 687 }