Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : /*
7 : * File: pripc.c
8 : *
9 : * Description: functions for IPC support
10 : */
11 :
12 : #include "primpl.h"
13 :
14 : #include <string.h>
15 :
16 : /*
17 : * A POSIX IPC name must begin with a '/'.
18 : * A POSIX IPC name on Solaris cannot contain any '/' except
19 : * the required leading '/'.
20 : * A POSIX IPC name on HP-UX and OSF1 must be a valid pathname
21 : * in the file system.
22 : *
23 : * The ftok() function for System V IPC requires a valid pathname
24 : * in the file system.
25 : *
26 : * A Win32 IPC name cannot contain '\'.
27 : */
28 :
29 0 : static void _pr_ConvertSemName(char *result)
30 : {
31 : #ifdef _PR_HAVE_POSIX_SEMAPHORES
32 : #if defined(SOLARIS)
33 : char *p;
34 :
35 : /* Convert '/' to '_' except for the leading '/' */
36 : for (p = result+1; *p; p++) {
37 : if (*p == '/') {
38 : *p = '_';
39 : }
40 : }
41 : return;
42 : #else
43 : return;
44 : #endif
45 : #elif defined(_PR_HAVE_SYSV_SEMAPHORES)
46 0 : return;
47 : #elif defined(WIN32)
48 : return;
49 : #endif
50 : }
51 :
52 0 : static void _pr_ConvertShmName(char *result)
53 : {
54 : #if defined(PR_HAVE_POSIX_NAMED_SHARED_MEMORY)
55 : #if defined(SOLARIS)
56 : char *p;
57 :
58 : /* Convert '/' to '_' except for the leading '/' */
59 : for (p = result+1; *p; p++) {
60 : if (*p == '/') {
61 : *p = '_';
62 : }
63 : }
64 : return;
65 : #else
66 : return;
67 : #endif
68 : #elif defined(PR_HAVE_SYSV_NAMED_SHARED_MEMORY)
69 0 : return;
70 : #elif defined(WIN32)
71 : return;
72 : #else
73 : return;
74 : #endif
75 : }
76 :
77 0 : PRStatus _PR_MakeNativeIPCName(
78 : const char *name,
79 : char *result,
80 : PRIntn size,
81 : _PRIPCType type)
82 : {
83 0 : if (strlen(name) >= (PRSize)size) {
84 0 : PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0);
85 0 : return PR_FAILURE;
86 : }
87 0 : strcpy(result, name);
88 0 : switch (type) {
89 : case _PRIPCSem:
90 0 : _pr_ConvertSemName(result);
91 0 : break;
92 : case _PRIPCShm:
93 0 : _pr_ConvertShmName(result);
94 0 : break;
95 : default:
96 0 : PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
97 0 : return PR_FAILURE;
98 : }
99 0 : return PR_SUCCESS;
100 : }
|