ipc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/mips/kernel/ipc.c
  3.  *
  4.  * This file contains various random system calls that
  5.  * have a non-standard calling sequence on the Linux/MIPS
  6.  * platform.
  7.  */
  8. #include <linux/errno.h>
  9. #include <linux/sched.h>
  10. #include <linux/mm.h>
  11. #include <linux/smp.h>
  12. #include <linux/smp_lock.h>
  13. #include <linux/sem.h>
  14. #include <linux/msg.h>
  15. #include <linux/shm.h>
  16. #include <asm/ipc.h>
  17. #include <asm/uaccess.h>
  18. /*
  19.  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  20.  *
  21.  * This is really horribly ugly.
  22.  */
  23. asmlinkage int sys_ipc (uint call, int first, int second,
  24. int third, void *ptr, long fifth)
  25. {
  26. int version, ret;
  27. version = call >> 16; /* hack for backward compatibility */
  28. call &= 0xffff;
  29. switch (call) {
  30. case SEMOP:
  31. return sys_semop (first, (struct sembuf *)ptr, second);
  32. case SEMGET:
  33. return sys_semget (first, second, third);
  34. case SEMCTL: {
  35. union semun fourth;
  36. if (!ptr)
  37. return -EINVAL;
  38. if (get_user(fourth.__pad, (void **) ptr))
  39. return -EFAULT;
  40. return sys_semctl (first, second, third, fourth);
  41. }
  42. case MSGSND:
  43. return sys_msgsnd (first, (struct msgbuf *) ptr, 
  44.    second, third);
  45. case MSGRCV:
  46. switch (version) {
  47. case 0: {
  48. struct ipc_kludge tmp;
  49. if (!ptr)
  50. return -EINVAL;
  51. if (copy_from_user(&tmp,
  52.    (struct ipc_kludge *) ptr, 
  53.    sizeof (tmp)))
  54. return -EFAULT;
  55. return sys_msgrcv (first, tmp.msgp, second,
  56.    tmp.msgtyp, third);
  57. }
  58. default:
  59. return sys_msgrcv (first,
  60.    (struct msgbuf *) ptr,
  61.    second, fifth, third);
  62. }
  63. case MSGGET:
  64. return sys_msgget ((key_t) first, second);
  65. case MSGCTL:
  66. return sys_msgctl (first, second, (struct msqid_ds *) ptr);
  67. case SHMAT:
  68. switch (version) {
  69. default: {
  70. ulong raddr;
  71. ret = sys_shmat (first, (char *) ptr, second, &raddr);
  72. if (ret)
  73. return ret;
  74. return put_user (raddr, (ulong *) third);
  75. }
  76. case 1: /* iBCS2 emulator entry point */
  77. if (!segment_eq(get_fs(), get_ds()))
  78. return -EINVAL;
  79. return sys_shmat (first, (char *) ptr, second, (ulong *) third);
  80. }
  81. case SHMDT: 
  82. return sys_shmdt ((char *)ptr);
  83. case SHMGET:
  84. return sys_shmget (first, second, third);
  85. case SHMCTL:
  86. return sys_shmctl (first, second,
  87.    (struct shmid_ds *) ptr);
  88. default:
  89. return -EINVAL;
  90. }
  91. }