mirror of
https://github.com/googleprojectzero/Jackalope
synced 2026-06-08 14:27:44 +00:00
110 lines
2.6 KiB
C++
110 lines
2.6 KiB
C++
/*
|
|
Copyright 2020 Google LLC
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
https://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
#include "common.h"
|
|
#include "sampledelivery.h"
|
|
|
|
int FileSampleDelivery::DeliverSample(Sample *sample) {
|
|
return sample->Save(filename.c_str());
|
|
}
|
|
|
|
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32)
|
|
|
|
SHMSampleDelivery::SHMSampleDelivery(char *name, size_t size) {
|
|
shm_handle = CreateFileMapping(
|
|
INVALID_HANDLE_VALUE,
|
|
NULL,
|
|
PAGE_READWRITE,
|
|
0,
|
|
(DWORD)size,
|
|
name);
|
|
|
|
if (shm_handle == NULL) {
|
|
FATAL("CreateFileMapping failed, %x", GetLastError());
|
|
}
|
|
|
|
shm = (unsigned char *)MapViewOfFile(
|
|
shm_handle, // handle to map object
|
|
FILE_MAP_ALL_ACCESS, // read/write permission
|
|
0,
|
|
0,
|
|
size
|
|
);
|
|
|
|
if (!shm) {
|
|
FATAL("MapViewOfFile failed");
|
|
}
|
|
}
|
|
|
|
SHMSampleDelivery::~SHMSampleDelivery() {
|
|
UnmapViewOfFile(shm);
|
|
CloseHandle(shm_handle);
|
|
}
|
|
|
|
#else
|
|
|
|
#include <unistd.h>
|
|
#include <sys/mman.h>
|
|
#include <fcntl.h>
|
|
|
|
SHMSampleDelivery::SHMSampleDelivery(char *name, size_t size) {
|
|
int res;
|
|
|
|
this->size = size;
|
|
size_t name_size = strlen(name);
|
|
this->name = (char *)malloc(name_size + 1);
|
|
strcpy(this->name, name);
|
|
|
|
// get shared memory file descriptor (NOT a file)
|
|
fd = shm_open(name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
|
|
if (fd == -1)
|
|
{
|
|
FATAL("Error creating shared memory");
|
|
}
|
|
|
|
// extend shared memory object as by default it's initialized with size 0
|
|
res = ftruncate(fd, size);
|
|
if (res == -1)
|
|
{
|
|
FATAL("Error creating shared memory");
|
|
}
|
|
|
|
// map shared memory to process address space
|
|
shm = (unsigned char *)mmap(NULL, size, PROT_WRITE, MAP_SHARED, fd, 0);
|
|
if (shm == MAP_FAILED)
|
|
{
|
|
FATAL("Error creating shared memory");
|
|
}
|
|
}
|
|
|
|
SHMSampleDelivery::~SHMSampleDelivery() {
|
|
munmap(shm, size);
|
|
shm_unlink(name);
|
|
close(fd);
|
|
free(name);
|
|
}
|
|
|
|
#endif
|
|
|
|
int SHMSampleDelivery::DeliverSample(Sample *sample) {
|
|
uint32_t *size_ptr = (uint32_t *)shm;
|
|
unsigned char *data_ptr = shm + 4;
|
|
*size_ptr = (uint32_t)sample->size;
|
|
memcpy(data_ptr, sample->bytes, sample->size);
|
|
return 1;
|
|
}
|
|
|