pripc.c (2072B)
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 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 #ifdef _PR_HAVE_POSIX_SEMAPHORES 31 # if defined(SOLARIS) 32 char* p; 33 34 /* Convert '/' to '_' except for the leading '/' */ 35 for (p = result + 1; *p; p++) { 36 if (*p == '/') { 37 *p = '_'; 38 } 39 } 40 return; 41 # else 42 return; 43 # endif 44 #elif defined(_PR_HAVE_SYSV_SEMAPHORES) 45 return; 46 #elif defined(WIN32) 47 return; 48 #endif 49 } 50 51 static void _pr_ConvertShmName(char* result) { 52 #if defined(PR_HAVE_POSIX_NAMED_SHARED_MEMORY) 53 # if defined(SOLARIS) 54 char* p; 55 56 /* Convert '/' to '_' except for the leading '/' */ 57 for (p = result + 1; *p; p++) { 58 if (*p == '/') { 59 *p = '_'; 60 } 61 } 62 return; 63 # else 64 return; 65 # endif 66 #elif defined(PR_HAVE_SYSV_NAMED_SHARED_MEMORY) 67 return; 68 #elif defined(WIN32) 69 return; 70 #else 71 return; 72 #endif 73 } 74 75 PRStatus _PR_MakeNativeIPCName(const char* name, char* result, PRIntn size, 76 _PRIPCType type) { 77 if (strlen(name) >= (PRSize)size) { 78 PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0); 79 return PR_FAILURE; 80 } 81 strcpy(result, name); 82 switch (type) { 83 case _PRIPCSem: 84 _pr_ConvertSemName(result); 85 break; 86 case _PRIPCShm: 87 _pr_ConvertShmName(result); 88 break; 89 default: 90 PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); 91 return PR_FAILURE; 92 } 93 return PR_SUCCESS; 94 }