Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/nsprpub/pr/src/misc/pripc.c
Line
Count
Source (jump to first uncovered line)
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
0
{
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
0
{
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
0
{
83
0
    if (strlen(name) >= (PRSize)size) {
84
0
        PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0);
85
0
        return PR_FAILURE;
86
0
    }
87
0
    strcpy(result, name);
88
0
    switch (type) {
89
0
        case _PRIPCSem:
90
0
            _pr_ConvertSemName(result);
91
0
            break;
92
0
        case _PRIPCShm:
93
0
            _pr_ConvertShmName(result);
94
0
            break;
95
0
        default:
96
0
            PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
97
0
            return PR_FAILURE;
98
0
    }
99
0
    return PR_SUCCESS;
100
0
}