source: trunk/libs/newlib/src/newlib/libc/sys/linux/mq_unlink.c @ 577

Last change on this file since 577 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.6 KB
Line 
1/* Copyright 2002, Red Hat Inc. */
2
3#include <mqueue.h>
4#include <errno.h>
5#include <fcntl.h>
6#include <sys/stat.h>
7#include <sys/mman.h>
8#include <sys/ipc.h>
9#include <sys/sem.h>
10#include <string.h>
11#include <stdlib.h>
12#include <machine/weakalias.h>
13#define _LIBC 1
14#include <sys/lock.h>
15#undef _LIBC
16
17#include "mqlocal.h"
18
19int
20mq_unlink (const char *name)
21{
22  int size;
23  int saved_errno;
24  char *real_name;
25  char *ptr;
26  int i, rc;
27  int semid, msgqid;
28  key_t key;
29 
30  /* ignore opening slash if present */
31  if (*name == '/')
32    ++name; 
33  size = strlen(name);
34
35  if ((real_name = (char *)malloc (size + sizeof(MSGQ_PREFIX))) == NULL)
36    {
37      errno = ENOSPC;
38      return -1;
39    }
40 
41  /* use given name to create shared memory file name - we convert any
42     slashes to underscores so we don't have to create directories */
43  memcpy (real_name, MSGQ_PREFIX, sizeof(MSGQ_PREFIX) - 1);
44  memcpy (real_name + sizeof(MSGQ_PREFIX) - 1, name, size + 1);
45  ptr = real_name + sizeof(MSGQ_PREFIX) - 1;
46  for (i = 0; i < size; ++i)
47    {
48      if (*ptr == '/')
49        *ptr = '_';
50      ++ptr;
51    }
52
53  /* get key and then unlink shared memory file */
54  if ((key = ftok(real_name, 255)) == (key_t)-1)
55    return -1;
56
57  rc = unlink (real_name);
58
59  if (rc == 0)
60    {
61      /* try to remove semaphore and msg queues associated with shared memory file */
62      saved_errno = errno;
63      semid = semget (key, 6, 0);
64      if (semid != -1)
65        semctl (semid, 0, IPC_RMID);
66      msgqid = msgget (key, 0);
67      if (msgqid != -1)
68        msgctl (msgqid, IPC_RMID, NULL);
69      errno = saved_errno;
70    }
71
72  return rc;
73}
Note: See TracBrowser for help on using the repository browser.