|
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 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 return; |
|
47 #elif defined(WIN32) |
|
48 return; |
|
49 #endif |
|
50 } |
|
51 |
|
52 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 return; |
|
70 #elif defined(WIN32) |
|
71 return; |
|
72 #else |
|
73 return; |
|
74 #endif |
|
75 } |
|
76 |
|
77 PRStatus _PR_MakeNativeIPCName( |
|
78 const char *name, |
|
79 char *result, |
|
80 PRIntn size, |
|
81 _PRIPCType type) |
|
82 { |
|
83 if (strlen(name) >= (PRSize)size) { |
|
84 PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0); |
|
85 return PR_FAILURE; |
|
86 } |
|
87 strcpy(result, name); |
|
88 switch (type) { |
|
89 case _PRIPCSem: |
|
90 _pr_ConvertSemName(result); |
|
91 break; |
|
92 case _PRIPCShm: |
|
93 _pr_ConvertShmName(result); |
|
94 break; |
|
95 default: |
|
96 PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); |
|
97 return PR_FAILURE; |
|
98 } |
|
99 return PR_SUCCESS; |
|
100 } |