forked from Imagelibrary/rtems
* src/clockgetres.c: Apply rtems_set_errno_and_return_minus_one. * src/clockgettime.c: Apply rtems_set_errno_and_return_minus_one. * src/clocksettime.c: Apply rtems_set_errno_and_return_minus_one. * src/killinfo.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueueclose.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueuecreatesupp.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueuegetattr.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueuenotify.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueueopen.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueuerecvsupp.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueuesendsupp.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueuesetattr.c: Apply rtems_set_errno_and_return_minus_one. * src/mqueueunlink.c: Apply rtems_set_errno_and_return_minus_one. * src/nanosleep.c: Apply rtems_set_errno_and_return_minus_one. * src/pthreadkill.c: Apply rtems_set_errno_and_return_minus_one. * src/pthreadsigmask.c: Apply rtems_set_errno_and_return_minus_one. * src/ptimer1.c: Apply rtems_set_errno_and_return_minus_one. * src/sched.c: Apply rtems_set_errno_and_return_minus_one. * src/semaphorecreatesupp.c: Apply rtems_set_errno_and_return_minus_one. * src/semaphorewaitsupp.c: Apply rtems_set_errno_and_return_minus_one. * src/semclose.c: Apply rtems_set_errno_and_return_minus_one. * src/semdestroy.c: Apply rtems_set_errno_and_return_minus_one. * src/semgetvalue.c: Apply rtems_set_errno_and_return_minus_one. * src/seminit.c: Apply rtems_set_errno_and_return_minus_one. * src/semopen.c: Apply rtems_set_errno_and_return_minus_one. * src/sempost.c: Apply rtems_set_errno_and_return_minus_one. * src/semunlink.c: Apply rtems_set_errno_and_return_minus_one. * src/setpgid.c: Apply rtems_set_errno_and_return_minus_one. * src/setsid.c: Apply rtems_set_errno_and_return_minus_one. * src/sigaction.c: Apply rtems_set_errno_and_return_minus_one. * src/sigaddset.c: Apply rtems_set_errno_and_return_minus_one. * src/sigdelset.c: Apply rtems_set_errno_and_return_minus_one. * src/sigemptyset.c: Apply rtems_set_errno_and_return_minus_one. * src/sigfillset.c: Apply rtems_set_errno_and_return_minus_one. * src/sigismember.c: Apply rtems_set_errno_and_return_minus_one. * src/sigpending.c: Apply rtems_set_errno_and_return_minus_one. * src/sigtimedwait.c: Apply rtems_set_errno_and_return_minus_one. * src/utsname.c: Apply rtems_set_errno_and_return_minus_one.
102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
/*
|
|
* NOTE: The structure of the routines is identical to that of POSIX
|
|
* Message_queues to leave the option of having unnamed message
|
|
* queues at a future date. They are currently not part of the
|
|
* POSIX standard but unnamed message_queues are. This is also
|
|
* the reason for the apparently unnecessary tracking of
|
|
* the process_shared attribute. [In addition to the fact that
|
|
* it would be trivial to add pshared to the mq_attr structure
|
|
* and have process private message queues.]
|
|
*
|
|
* This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open
|
|
* time.
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <pthread.h>
|
|
#include <limits.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <mqueue.h>
|
|
|
|
#include <rtems/system.h>
|
|
#include <rtems/score/watchdog.h>
|
|
#include <rtems/seterr.h>
|
|
#include <rtems/posix/mqueue.h>
|
|
#include <rtems/posix/time.h>
|
|
|
|
/*PAGE
|
|
*
|
|
* 15.2.7 Set Message Queue Attributes, P1003.1b-1993, p. 281
|
|
*/
|
|
|
|
int mq_setattr(
|
|
mqd_t mqdes,
|
|
const struct mq_attr *mqstat,
|
|
struct mq_attr *omqstat
|
|
)
|
|
{
|
|
register POSIX_Message_queue_Control *the_mq;
|
|
CORE_message_queue_Control *the_core_mq;
|
|
Objects_Locations location;
|
|
CORE_message_queue_Attributes *the_mq_attr;
|
|
|
|
if ( !mqstat )
|
|
rtems_set_errno_and_return_minus_one( EINVAL );
|
|
|
|
the_mq = _POSIX_Message_queue_Get( mqdes, &location );
|
|
switch ( location ) {
|
|
case OBJECTS_ERROR:
|
|
rtems_set_errno_and_return_minus_one( EBADF );
|
|
case OBJECTS_REMOTE:
|
|
_Thread_Dispatch();
|
|
return POSIX_MP_NOT_IMPLEMENTED();
|
|
rtems_set_errno_and_return_minus_one( EINVAL );
|
|
case OBJECTS_LOCAL:
|
|
|
|
the_core_mq = &the_mq->Message_queue;
|
|
|
|
/*
|
|
* Return the old values.
|
|
*/
|
|
|
|
/* XXX this is the same stuff as is in mq_getattr... and probably */
|
|
/* XXX should be in an inlined private routine */
|
|
|
|
if ( omqstat ) {
|
|
omqstat->mq_flags = the_mq->oflag;
|
|
omqstat->mq_msgsize = the_core_mq->maximum_message_size;
|
|
omqstat->mq_maxmsg = the_core_mq->maximum_pending_messages;
|
|
omqstat->mq_curmsgs = the_core_mq->number_of_pending_messages;
|
|
}
|
|
|
|
/*
|
|
* If blocking was in effect and is not now, then there
|
|
* may be threads blocked on this message queue which need
|
|
* to be unblocked to make the state of the message queue
|
|
* consistent for future use.
|
|
*/
|
|
|
|
the_mq_attr = &the_core_mq->Attributes;
|
|
|
|
if ( !(the_mq->oflag & O_NONBLOCK) && /* were blocking */
|
|
(mqstat->mq_flags & O_NONBLOCK) ) { /* and now are not */
|
|
_CORE_message_queue_Flush_waiting_threads( the_core_mq );
|
|
}
|
|
|
|
the_mq->oflag = mqstat->mq_flags;
|
|
|
|
_Thread_Enable_dispatch();
|
|
return 0;
|
|
}
|
|
return POSIX_BOTTOM_REACHED();
|
|
}
|
|
|