mqueue.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "mqueue.h"
  2. #include "pthread_internal.h"
  3. #include <stdarg.h>
  4. #include <errno.h>
  5. #include <sys/fcntl.h>
  6. int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat,
  7. struct mq_attr *omqstat)
  8. {
  9. rt_set_errno(-RT_ERROR);
  10. return -1;
  11. }
  12. int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat)
  13. {
  14. if ((mqdes == RT_NULL) || mqstat == RT_NULL)
  15. {
  16. rt_set_errno(EBADF);
  17. return -1;
  18. }
  19. mqstat->mq_maxmsg = mqdes->max_msgs;
  20. mqstat->mq_msgsize = mqdes->msg_size;
  21. mqstat->mq_curmsgs = 0;
  22. mqstat->mq_flags = 0;
  23. return 0;
  24. }
  25. mqd_t mq_open(const char *name, int oflag, ...)
  26. {
  27. rt_mq_t mq;
  28. va_list arg;
  29. mode_t mode;
  30. struct mq_attr *attr = RT_NULL;
  31. if (oflag & O_CREAT)
  32. {
  33. va_start(arg, oflag);
  34. mode = (mode_t) va_arg(arg, unsigned int);
  35. attr = (struct mq_attr *) va_arg(arg, struct mq_attr *);
  36. va_end(arg);
  37. mq = rt_mq_create(name, attr->mq_msgsize, attr->mq_maxmsg, RT_IPC_FLAG_FIFO);
  38. if (mq == RT_NULL) /* create failed */
  39. {
  40. rt_set_errno(ENFILE);
  41. return RT_NULL;
  42. }
  43. }
  44. if (oflag & O_EXCL)
  45. {
  46. mq = (rt_mq_t)rt_object_find(name, RT_Object_Class_MessageQueue);
  47. if (mq == RT_NULL) rt_set_errno(ENOSPC);
  48. }
  49. return mq;
  50. }
  51. ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio)
  52. {
  53. rt_err_t result;
  54. if ((mqdes == RT_NULL) || (msg_ptr == RT_NULL))
  55. {
  56. rt_set_errno(EINVAL);
  57. return -1;
  58. }
  59. result = rt_mq_recv(mqdes, msg_ptr, msg_len, RT_WAITING_FOREVER);
  60. if (result == RT_EOK)
  61. return msg_len;
  62. rt_set_errno(EBADF);
  63. return -1;
  64. }
  65. int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio)
  66. {
  67. rt_err_t result;
  68. if ((mqdes == RT_NULL) || (msg_ptr == RT_NULL))
  69. {
  70. rt_set_errno(EINVAL);
  71. return -1;
  72. }
  73. result = rt_mq_send(mqdes, msg_ptr, msg_len);
  74. if (result == RT_EOK)
  75. return 0;
  76. rt_set_errno(EBADF);
  77. return -1;
  78. }
  79. ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len,
  80. unsigned *msg_prio, const struct timespec *abs_timeout)
  81. {
  82. int tick;
  83. rt_err_t result;
  84. if ((mqdes == RT_NULL) || (msg_ptr == RT_NULL))
  85. {
  86. rt_set_errno(EINVAL);
  87. return -1;
  88. }
  89. tick = libc_time_to_tick(abs_timeout);
  90. result = rt_mq_recv(mqdes, msg_ptr, msg_len, tick);
  91. if (result == RT_EOK) return msg_len;
  92. if (result == -RT_ETIMEOUT)
  93. rt_set_errno(ETIMEDOUT);
  94. else
  95. rt_set_errno(EBADMSG);
  96. return -1;
  97. }
  98. int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio,
  99. const struct timespec *abs_timeout)
  100. {
  101. /* RT-Thread does not support timed send */
  102. return mq_send(mqdes, msg_ptr, msg_len, msg_prio);
  103. }
  104. int mq_notify(mqd_t mqdes, const struct sigevent *notification)
  105. {
  106. rt_set_errno(-RT_ERROR);
  107. return -1;
  108. }
  109. int mq_close(mqd_t mqdes)
  110. {
  111. return 0;
  112. }
  113. int mq_unlink(const char *name)
  114. {
  115. rt_mq_t mq;
  116. mq = (rt_mq_t)rt_object_find(name, RT_Object_Class_MessageQueue);
  117. if (mq == RT_NULL)
  118. {
  119. rt_set_errno(ENOENT);
  120. return -1;
  121. }
  122. /* delete this message queue */
  123. rt_mq_delete(mq);
  124. return 0;
  125. }