Coverage Report

Created: 2025-06-24 06:49

/src/nspr/pr/src/md/unix/uxshm.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
** uxshm.c -- Unix Implementations NSPR Named Shared Memory
8
**
9
**
10
** lth. Jul-1999.
11
**
12
*/
13
#include <string.h>
14
#include <prshm.h>
15
#include <prerr.h>
16
#include <prmem.h>
17
#include "primpl.h"
18
#include <fcntl.h>
19
20
extern PRLogModuleInfo* _pr_shm_lm;
21
22
0
#define NSPR_IPC_SHM_KEY 'b'
23
/*
24
** Implementation for System V
25
*/
26
#if defined PR_HAVE_SYSV_NAMED_SHARED_MEMORY
27
#  include <sys/ipc.h>
28
#  include <sys/shm.h>
29
#  include <sys/types.h>
30
#  include <sys/stat.h>
31
32
#  define _MD_OPEN_SHARED_MEMORY _MD_OpenSharedMemory
33
#  define _MD_ATTACH_SHARED_MEMORY _MD_AttachSharedMemory
34
#  define _MD_DETACH_SHARED_MEMORY _MD_DetachSharedMemory
35
#  define _MD_CLOSE_SHARED_MEMORY _MD_CloseSharedMemory
36
#  define _MD_DELETE_SHARED_MEMORY _MD_DeleteSharedMemory
37
38
extern PRSharedMemory* _MD_OpenSharedMemory(const char* name, PRSize size,
39
0
                                            PRIntn flags, PRIntn mode) {
40
0
  PRStatus rc = PR_SUCCESS;
41
0
  key_t key;
42
0
  PRSharedMemory* shm;
43
0
  char ipcname[PR_IPC_NAME_SIZE];
44
45
0
  rc = _PR_MakeNativeIPCName(name, ipcname, PR_IPC_NAME_SIZE, _PRIPCShm);
46
0
  if (PR_FAILURE == rc) {
47
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
48
0
    PR_LOG(
49
0
        _pr_shm_lm, PR_LOG_DEBUG,
50
0
        ("_MD_OpenSharedMemory(): _PR_MakeNativeIPCName() failed: %s", name));
51
0
    return (NULL);
52
0
  }
53
54
0
  shm = PR_NEWZAP(PRSharedMemory);
55
0
  if (NULL == shm) {
56
0
    PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
57
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
58
0
           ("PR_OpenSharedMemory: New PRSharedMemory out of memory"));
59
0
    return (NULL);
60
0
  }
61
62
0
  shm->ipcname = (char*)PR_MALLOC(strlen(ipcname) + 1);
63
0
  if (NULL == shm->ipcname) {
64
0
    PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
65
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
66
0
           ("PR_OpenSharedMemory: New shm->ipcname out of memory"));
67
0
    PR_DELETE(shm);
68
0
    return (NULL);
69
0
  }
70
71
  /* copy args to struct */
72
0
  strcpy(shm->ipcname, ipcname);
73
0
  shm->size = size;
74
0
  shm->mode = mode;
75
0
  shm->flags = flags;
76
0
  shm->ident = _PR_SHM_IDENT;
77
78
  /* create the file first */
79
0
  if (flags & PR_SHM_CREATE) {
80
0
    int osfd = open(shm->ipcname, (O_RDWR | O_CREAT), shm->mode);
81
0
    if (-1 == osfd) {
82
0
      _PR_MD_MAP_OPEN_ERROR(errno);
83
0
      PR_FREEIF(shm->ipcname);
84
0
      PR_DELETE(shm);
85
0
      return (NULL);
86
0
    }
87
0
    if (close(osfd) == -1) {
88
0
      _PR_MD_MAP_CLOSE_ERROR(errno);
89
0
      PR_FREEIF(shm->ipcname);
90
0
      PR_DELETE(shm);
91
0
      return (NULL);
92
0
    }
93
0
  }
94
95
  /* hash the shm.name to an ID */
96
0
  key = ftok(shm->ipcname, NSPR_IPC_SHM_KEY);
97
0
  if (-1 == key) {
98
0
    rc = PR_FAILURE;
99
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
100
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
101
0
           ("_MD_OpenSharedMemory(): ftok() failed on name: %s", shm->ipcname));
102
0
    PR_FREEIF(shm->ipcname);
103
0
    PR_DELETE(shm);
104
0
    return (NULL);
105
0
  }
106
107
  /* get the shared memory */
108
0
  if (flags & PR_SHM_CREATE) {
109
0
    shm->id = shmget(key, shm->size, (shm->mode | IPC_CREAT | IPC_EXCL));
110
0
    if (shm->id >= 0) {
111
0
      return (shm);
112
0
    }
113
0
    if ((errno == EEXIST) && (flags & PR_SHM_EXCL)) {
114
0
      PR_SetError(PR_FILE_EXISTS_ERROR, errno);
115
0
      PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
116
0
             ("_MD_OpenSharedMemory(): shmget() exclusive failed, errno: %d",
117
0
              errno));
118
0
      PR_FREEIF(shm->ipcname);
119
0
      PR_DELETE(shm);
120
0
      return (NULL);
121
0
    }
122
0
  }
123
124
0
  shm->id = shmget(key, shm->size, shm->mode);
125
0
  if (-1 == shm->id) {
126
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
127
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
128
0
           ("_MD_OpenSharedMemory(): shmget() failed, errno: %d", errno));
129
0
    PR_FREEIF(shm->ipcname);
130
0
    PR_DELETE(shm);
131
0
    return (NULL);
132
0
  }
133
134
0
  return (shm);
135
0
} /* end _MD_OpenSharedMemory() */
136
137
0
extern void* _MD_AttachSharedMemory(PRSharedMemory* shm, PRIntn flags) {
138
0
  void* addr;
139
0
  PRUint32 aFlags = shm->mode;
140
141
0
  PR_ASSERT(shm->ident == _PR_SHM_IDENT);
142
143
0
  aFlags |= (flags & PR_SHM_READONLY) ? SHM_RDONLY : 0;
144
145
0
  addr = shmat(shm->id, NULL, aFlags);
146
0
  if ((void*)-1 == addr) {
147
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
148
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
149
0
           ("_MD_AttachSharedMemory(): shmat() failed on name: %s, OsError: %d",
150
0
            shm->ipcname, PR_GetOSError()));
151
0
    addr = NULL;
152
0
  }
153
154
0
  return addr;
155
0
}
156
157
0
extern PRStatus _MD_DetachSharedMemory(PRSharedMemory* shm, void* addr) {
158
0
  PRStatus rc = PR_SUCCESS;
159
0
  PRIntn urc;
160
161
0
  PR_ASSERT(shm->ident == _PR_SHM_IDENT);
162
163
0
  urc = shmdt(addr);
164
0
  if (-1 == urc) {
165
0
    rc = PR_FAILURE;
166
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
167
0
    PR_LOG(
168
0
        _pr_shm_lm, PR_LOG_DEBUG,
169
0
        ("_MD_DetachSharedMemory(): shmdt() failed on name: %s", shm->ipcname));
170
0
  }
171
172
0
  return rc;
173
0
}
174
175
0
extern PRStatus _MD_CloseSharedMemory(PRSharedMemory* shm) {
176
0
  PR_ASSERT(shm->ident == _PR_SHM_IDENT);
177
178
0
  PR_FREEIF(shm->ipcname);
179
0
  PR_DELETE(shm);
180
181
0
  return PR_SUCCESS;
182
0
}
183
184
0
extern PRStatus _MD_DeleteSharedMemory(const char* name) {
185
0
  PRStatus rc = PR_SUCCESS;
186
0
  key_t key;
187
0
  int id;
188
0
  PRIntn urc;
189
0
  char ipcname[PR_IPC_NAME_SIZE];
190
191
0
  rc = _PR_MakeNativeIPCName(name, ipcname, PR_IPC_NAME_SIZE, _PRIPCShm);
192
0
  if (PR_FAILURE == rc) {
193
0
    PR_SetError(PR_UNKNOWN_ERROR, errno);
194
0
    PR_LOG(
195
0
        _pr_shm_lm, PR_LOG_DEBUG,
196
0
        ("_MD_DeleteSharedMemory(): _PR_MakeNativeIPCName() failed: %s", name));
197
0
    return (PR_FAILURE);
198
0
  }
199
200
  /* create the file first */
201
0
  {
202
0
    int osfd = open(ipcname, (O_RDWR | O_CREAT), 0666);
203
0
    if (-1 == osfd) {
204
0
      _PR_MD_MAP_OPEN_ERROR(errno);
205
0
      return (PR_FAILURE);
206
0
    }
207
0
    if (close(osfd) == -1) {
208
0
      _PR_MD_MAP_CLOSE_ERROR(errno);
209
0
      return (PR_FAILURE);
210
0
    }
211
0
  }
212
213
  /* hash the shm.name to an ID */
214
0
  key = ftok(ipcname, NSPR_IPC_SHM_KEY);
215
0
  if (-1 == key) {
216
0
    rc = PR_FAILURE;
217
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
218
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
219
0
           ("_MD_DeleteSharedMemory(): ftok() failed on name: %s", ipcname));
220
0
  }
221
222
0
  id = shmget(key, 0, 0);
223
0
  if (-1 == id) {
224
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
225
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
226
0
           ("_MD_DeleteSharedMemory(): shmget() failed, errno: %d", errno));
227
0
    return (PR_FAILURE);
228
0
  }
229
230
0
  urc = shmctl(id, IPC_RMID, NULL);
231
0
  if (-1 == urc) {
232
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
233
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
234
0
           ("_MD_DeleteSharedMemory(): shmctl() failed on name: %s", ipcname));
235
0
    return (PR_FAILURE);
236
0
  }
237
238
0
  urc = unlink(ipcname);
239
0
  if (-1 == urc) {
240
0
    _PR_MD_MAP_UNLINK_ERROR(errno);
241
0
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
242
0
           ("_MD_DeleteSharedMemory(): unlink() failed: %s", ipcname));
243
0
    return (PR_FAILURE);
244
0
  }
245
246
0
  return rc;
247
0
} /* end _MD_DeleteSharedMemory() */
248
249
/*
250
** Implementation for Posix
251
*/
252
#elif defined PR_HAVE_POSIX_NAMED_SHARED_MEMORY
253
#  include <sys/mman.h>
254
255
#  define _MD_OPEN_SHARED_MEMORY _MD_OpenSharedMemory
256
#  define _MD_ATTACH_SHARED_MEMORY _MD_AttachSharedMemory
257
#  define _MD_DETACH_SHARED_MEMORY _MD_DetachSharedMemory
258
#  define _MD_CLOSE_SHARED_MEMORY _MD_CloseSharedMemory
259
#  define _MD_DELETE_SHARED_MEMORY _MD_DeleteSharedMemory
260
261
struct _MDSharedMemory {
262
  int handle;
263
};
264
265
extern PRSharedMemory* _MD_OpenSharedMemory(const char* name, PRSize size,
266
                                            PRIntn flags, PRIntn mode) {
267
  PRStatus rc = PR_SUCCESS;
268
  PRInt32 end;
269
  PRSharedMemory* shm;
270
  char ipcname[PR_IPC_NAME_SIZE];
271
272
  rc = _PR_MakeNativeIPCName(name, ipcname, PR_IPC_NAME_SIZE, _PRIPCShm);
273
  if (PR_FAILURE == rc) {
274
    PR_SetError(PR_UNKNOWN_ERROR, errno);
275
    PR_LOG(
276
        _pr_shm_lm, PR_LOG_DEBUG,
277
        ("_MD_OpenSharedMemory(): _PR_MakeNativeIPCName() failed: %s", name));
278
    return (NULL);
279
  }
280
281
  shm = PR_NEWZAP(PRSharedMemory);
282
  if (NULL == shm) {
283
    PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
284
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
285
           ("PR_OpenSharedMemory: New PRSharedMemory out of memory"));
286
    return (NULL);
287
  }
288
289
  shm->ipcname = PR_MALLOC(strlen(ipcname) + 1);
290
  if (NULL == shm->ipcname) {
291
    PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
292
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
293
           ("PR_OpenSharedMemory: New shm->ipcname out of memory"));
294
    return (NULL);
295
  }
296
297
  /* copy args to struct */
298
  strcpy(shm->ipcname, ipcname);
299
  shm->size = size;
300
  shm->mode = mode;
301
  shm->flags = flags;
302
  shm->ident = _PR_SHM_IDENT;
303
304
  /*
305
  ** Create the shared memory
306
  */
307
  if (flags & PR_SHM_CREATE) {
308
    int oflag = (O_CREAT | O_RDWR);
309
310
    if (flags & PR_SHM_EXCL) {
311
      oflag |= O_EXCL;
312
    }
313
    shm->id = shm_open(shm->ipcname, oflag, shm->mode);
314
  } else {
315
    shm->id = shm_open(shm->ipcname, O_RDWR, shm->mode);
316
  }
317
318
  if (-1 == shm->id) {
319
    _PR_MD_MAP_DEFAULT_ERROR(errno);
320
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
321
           ("_MD_OpenSharedMemory(): shm_open failed: %s, OSError: %d",
322
            shm->ipcname, PR_GetOSError()));
323
    PR_DELETE(shm->ipcname);
324
    PR_DELETE(shm);
325
    return (NULL);
326
  }
327
328
  end = ftruncate(shm->id, shm->size);
329
  if (-1 == end) {
330
    _PR_MD_MAP_DEFAULT_ERROR(errno);
331
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
332
           ("_MD_OpenSharedMemory(): ftruncate failed, OSError: %d",
333
            PR_GetOSError()));
334
    PR_DELETE(shm->ipcname);
335
    PR_DELETE(shm);
336
    return (NULL);
337
  }
338
339
  return (shm);
340
} /* end _MD_OpenSharedMemory() */
341
342
extern void* _MD_AttachSharedMemory(PRSharedMemory* shm, PRIntn flags) {
343
  void* addr;
344
  PRIntn prot = (PROT_READ | PROT_WRITE);
345
346
  PR_ASSERT(shm->ident == _PR_SHM_IDENT);
347
348
  if (PR_SHM_READONLY == flags) {
349
    prot ^= PROT_WRITE;
350
  }
351
352
  addr = mmap((void*)0, shm->size, prot, MAP_SHARED, shm->id, 0);
353
  if ((void*)-1 == addr) {
354
    _PR_MD_MAP_DEFAULT_ERROR(errno);
355
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
356
           ("_MD_AttachSharedMemory(): mmap failed: %s, errno: %d",
357
            shm->ipcname, PR_GetOSError()));
358
    addr = NULL;
359
  } else {
360
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
361
           ("_MD_AttachSharedMemory(): name: %s, attached at: %p", shm->ipcname,
362
            addr));
363
  }
364
365
  return addr;
366
}
367
368
extern PRStatus _MD_DetachSharedMemory(PRSharedMemory* shm, void* addr) {
369
  PRStatus rc = PR_SUCCESS;
370
  PRIntn urc;
371
372
  PR_ASSERT(shm->ident == _PR_SHM_IDENT);
373
374
  urc = munmap(addr, shm->size);
375
  if (-1 == urc) {
376
    rc = PR_FAILURE;
377
    _PR_MD_MAP_DEFAULT_ERROR(errno);
378
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
379
           ("_MD_DetachSharedMemory(): munmap failed: %s, errno: %d",
380
            shm->ipcname, PR_GetOSError()));
381
  }
382
  return rc;
383
}
384
385
extern PRStatus _MD_CloseSharedMemory(PRSharedMemory* shm) {
386
  int urc;
387
388
  PR_ASSERT(shm->ident == _PR_SHM_IDENT);
389
390
  urc = close(shm->id);
391
  if (-1 == urc) {
392
    _PR_MD_MAP_CLOSE_ERROR(errno);
393
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
394
           ("_MD_CloseSharedMemory(): close() failed, error: %d",
395
            PR_GetOSError()));
396
    return (PR_FAILURE);
397
  }
398
  PR_DELETE(shm->ipcname);
399
  PR_DELETE(shm);
400
  return PR_SUCCESS;
401
}
402
403
extern PRStatus _MD_DeleteSharedMemory(const char* name) {
404
  PRStatus rc = PR_SUCCESS;
405
  PRUintn urc;
406
  char ipcname[PR_IPC_NAME_SIZE];
407
408
  rc = _PR_MakeNativeIPCName(name, ipcname, PR_IPC_NAME_SIZE, _PRIPCShm);
409
  if (PR_FAILURE == rc) {
410
    PR_SetError(PR_UNKNOWN_ERROR, errno);
411
    PR_LOG(
412
        _pr_shm_lm, PR_LOG_DEBUG,
413
        ("_MD_OpenSharedMemory(): _PR_MakeNativeIPCName() failed: %s", name));
414
    return rc;
415
  }
416
417
  urc = shm_unlink(ipcname);
418
  if (-1 == urc) {
419
    rc = PR_FAILURE;
420
    _PR_MD_MAP_DEFAULT_ERROR(errno);
421
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
422
           ("_MD_DeleteSharedMemory(): shm_unlink failed: %s, errno: %d",
423
            ipcname, PR_GetOSError()));
424
  } else {
425
    PR_LOG(_pr_shm_lm, PR_LOG_DEBUG,
426
           ("_MD_DeleteSharedMemory(): %s, success", ipcname));
427
  }
428
429
  return rc;
430
} /* end _MD_DeleteSharedMemory() */
431
#endif
432
433
/*
434
** Unix implementation for anonymous memory (file) mapping
435
*/
436
extern PRLogModuleInfo* _pr_shma_lm;
437
438
#include <unistd.h>
439
440
extern PRFileMap* _md_OpenAnonFileMap(const char* dirName, PRSize size,
441
0
                                      PRFileMapProtect prot) {
442
0
  PRFileMap* fm = NULL;
443
0
  PRFileDesc* fd;
444
0
  int osfd;
445
0
  PRIntn urc;
446
0
  PRIntn mode = 0600;
447
0
  char* genName;
448
0
  pid_t pid = getpid();                  /* for generating filename */
449
0
  PRThread* tid = PR_GetCurrentThread(); /* for generating filename */
450
0
  int incr;                              /* for generating filename */
451
0
  const int maxTries = 20; /* maximum # attempts at a unique filename */
452
0
  PRInt64 size64;          /* 64-bit version of 'size' */
453
454
  /*
455
  ** generate a filename from input and runtime environment
456
  ** open the file, unlink the file.
457
  ** make maxTries number of attempts at uniqueness in the filename
458
  */
459
0
  for (incr = 0; incr < maxTries; incr++) {
460
0
#define NSPR_AFM_FILENAME "%s/.NSPR-AFM-%d-%p.%d"
461
0
    genName = PR_smprintf(NSPR_AFM_FILENAME, dirName, (int)pid, tid, incr);
462
0
    if (NULL == genName) {
463
0
      PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
464
0
             ("_md_OpenAnonFileMap(): PR_snprintf(): failed, generating "
465
0
              "filename"));
466
0
      goto Finished;
467
0
    }
468
469
    /* create the file */
470
0
    osfd = open(genName, (O_CREAT | O_EXCL | O_RDWR), mode);
471
0
    if (-1 == osfd) {
472
0
      if (EEXIST == errno) {
473
0
        PR_smprintf_free(genName);
474
0
        continue; /* name exists, try again */
475
0
      }
476
0
      _PR_MD_MAP_OPEN_ERROR(errno);
477
0
      PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
478
0
             ("_md_OpenAnonFileMap(): open(): failed, filename: %s, errno: %d",
479
0
              genName, PR_GetOSError()));
480
0
      PR_smprintf_free(genName);
481
0
      goto Finished;
482
0
    }
483
0
    break; /* name generation and open successful, break; */
484
0
  } /* end for() */
485
486
0
  if (incr == maxTries) {
487
0
    PR_ASSERT(-1 == osfd);
488
0
    PR_ASSERT(EEXIST == errno);
489
0
    _PR_MD_MAP_OPEN_ERROR(errno);
490
0
    goto Finished;
491
0
  }
492
493
0
  urc = unlink(genName);
494
0
  if (-1 == urc) {
495
0
    _PR_MD_MAP_UNLINK_ERROR(errno);
496
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
497
0
           ("_md_OpenAnonFileMap(): failed on unlink(), errno: %d", errno));
498
0
    PR_smprintf_free(genName);
499
0
    close(osfd);
500
0
    goto Finished;
501
0
  }
502
0
  PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
503
0
         ("_md_OpenAnonFileMap(): unlink(): %s", genName));
504
505
0
  PR_smprintf_free(genName);
506
507
0
  fd = PR_ImportFile(osfd);
508
0
  if (NULL == fd) {
509
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
510
0
           ("_md_OpenAnonFileMap(): PR_ImportFile(): failed"));
511
0
    goto Finished;
512
0
  }
513
0
  PR_LOG(_pr_shma_lm, PR_LOG_DEBUG, ("_md_OpenAnonFileMap(): fd: %p", fd));
514
515
0
  urc = ftruncate(fd->secret->md.osfd, size);
516
0
  if (-1 == urc) {
517
0
    _PR_MD_MAP_DEFAULT_ERROR(errno);
518
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
519
0
           ("_md_OpenAnonFileMap(): failed on ftruncate(), errno: %d", errno));
520
0
    PR_Close(fd);
521
0
    goto Finished;
522
0
  }
523
0
  PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
524
0
         ("_md_OpenAnonFileMap(): ftruncate(): size: %d", size));
525
526
0
  LL_UI2L(size64, size); /* PRSize (size_t) is unsigned */
527
0
  fm = PR_CreateFileMap(fd, size64, prot);
528
0
  if (NULL == fm) {
529
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG, ("PR_OpenAnonFileMap(): failed"));
530
0
    PR_Close(fd);
531
0
    goto Finished;
532
0
  }
533
0
  fm->md.isAnonFM = PR_TRUE; /* set fd close */
534
535
0
  PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
536
0
         ("_md_OpenAnonFileMap(): PR_CreateFileMap(): fm: %p", fm));
537
538
0
Finished:
539
0
  return (fm);
540
0
} /* end md_OpenAnonFileMap() */
541
542
/*
543
** _md_ExportFileMapAsString()
544
**
545
**
546
*/
547
extern PRStatus _md_ExportFileMapAsString(PRFileMap* fm, PRSize bufSize,
548
0
                                          char* buf) {
549
0
  PRIntn written;
550
0
  PRIntn prot = (PRIntn)fm->prot;
551
552
0
  written = PR_snprintf(buf, bufSize, "%ld:%d", fm->fd->secret->md.osfd, prot);
553
554
0
  return ((written == -1) ? PR_FAILURE : PR_SUCCESS);
555
0
} /* end _md_ExportFileMapAsString() */
556
557
0
extern PRFileMap* _md_ImportFileMapFromString(const char* fmstring) {
558
0
  PRStatus rc;
559
0
  PRInt32 osfd;
560
0
  PRIntn prot; /* really: a PRFileMapProtect */
561
0
  PRFileDesc* fd;
562
0
  PRFileMap* fm = NULL; /* default return value */
563
0
  PRFileInfo64 info;
564
565
0
  PR_sscanf(fmstring, "%ld:%d", &osfd, &prot);
566
567
  /* import the os file descriptor */
568
0
  fd = PR_ImportFile(osfd);
569
0
  if (NULL == fd) {
570
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
571
0
           ("_md_ImportFileMapFromString(): PR_ImportFile() failed"));
572
0
    goto Finished;
573
0
  }
574
575
0
  rc = PR_GetOpenFileInfo64(fd, &info);
576
0
  if (PR_FAILURE == rc) {
577
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
578
0
           ("_md_ImportFileMapFromString(): PR_GetOpenFileInfo64() failed"));
579
0
    goto Finished;
580
0
  }
581
582
0
  fm = PR_CreateFileMap(fd, info.size, (PRFileMapProtect)prot);
583
0
  if (NULL == fm) {
584
0
    PR_LOG(_pr_shma_lm, PR_LOG_DEBUG,
585
0
           ("_md_ImportFileMapFromString(): PR_CreateFileMap() failed"));
586
0
  }
587
588
0
Finished:
589
0
  return (fm);
590
0
} /* end _md_ImportFileMapFromString() */