61 ngcbSHMDB(
const char *app,
const char *s,
void *initBuffer = NULL,
72 if ((size == 0) && (initBuffer != NULL))
74 strcpy(
ErrMsg(),
"invalid database size");
79 strcpy(
ErrMsg(),
"invalid application name");
84 strcpy(
ErrMsg(),
"invalid key (NULL)");
87 else if (strlen(s) == 0)
89 strcpy(
ErrMsg(),
"invalid key");
97 if (initBuffer != NULL)
102 if (strncmp(s,
"pub_", 4) == 0)
109 strcpy(
ErrMsg(),
"invalid key");
114 snprintf(name_,
sizeof(name_),
"/tmp/%s_%s", app, s);
115 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0666);
123 snprintf(name_,
sizeof(name_),
"/tmp/%s_%u_%s", app, getuid(), s);
124 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0600);
129 sprintf(
ErrMsg(),
"invalid key - %s", strerror(errno));
142 snprintf(name_,
sizeof(name_),
"/tmp/%s_%u_%s", app, getuid(), s);
143 fd_ = open(name_, O_RDONLY, 0);
149 snprintf(name_,
sizeof(name_),
"/tmp/%s_%s", app, s);
150 fd_ = open(name_, O_RDONLY, 0);
156 snprintf(name_,
sizeof(name_),
"/tmp/%s_pub_%s", app, s);
157 fd_ = open(name_, O_RDONLY, 0);
164 if (strncmp(s,
"pub_", 4) == 0)
171 strcpy(
ErrMsg(),
"invalid key");
176 snprintf(name_,
sizeof(name_),
"/tmp/%s_%s", app, s);
177 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0666);
185 snprintf(name_,
sizeof(name_),
"/tmp/%s_%u_%s", app, getuid(), s);
186 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0600);
191 sprintf(
ErrMsg(),
"invalid key - %s", strerror(errno));
206 key_ = ftok(name_, 0x1f);
207 if (key_ ==
static_cast<key_t
>(-1))
209 sprintf(
ErrMsg(),
"cannot get key - %s", strerror(errno));
210 close(fd_); fd_ = -1;
214 if ((initBuffer == NULL) && (fd_ >= 0))
220 close(fd_); fd_ = -1;
224 if (initBuffer != NULL)
229 if (Create_(initBuffer, size) != 0)
return;
237 if (Attach_(size) != 0)
return;
264 if (fd_ >= 0) close(fd_);
269 if (delKey_ && (strlen(name_) > 0)) remove(name_);
282 if (semop(sem_, semOpLock_, 2) != 0)
286 while (semop(sem_, semOpLock_, 2) != 0)
290 if (errno == EIDRM) sem_ = -1;
291 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
305 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
312 strcpy(
ErrMsg(),
"invalid semaphore");
323 if (semop(sem_, semOpUnlock_, 1) != 0)
325 if (errno == EIDRM) sem_ = -1;
331 int Set(
const void *buffer) {
339 if (buffer != NULL) memcpy(
shmBuf, buffer, size_);
340 else memset(
shmBuf, 0, size_);
358 else memset(buffer, 0, size_);
370 size_t Size() {
return (size_);}
376 int Key() {
return (key_);}
420 struct sembuf semOpLock_[2];
423 struct sembuf semOpUnlock_[1];
443 memset(&semOpLock_[0], 0,
sizeof(
struct sembuf));
444 memset(&semOpLock_[1], 0,
sizeof(
struct sembuf));
445 semOpLock_[1].sem_num = 0;
446 semOpLock_[1].sem_op = 1;
447 semOpLock_[1].sem_flg = SEM_UNDO;
453 memset(&semOpUnlock_[0], 0,
sizeof(
struct sembuf));
454 semOpUnlock_[0].sem_num = 0;
455 semOpUnlock_[0].sem_op = -1;
456 semOpUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
465 semctl(sem_, 0, IPC_RMID, ctl); sem_ = -1;
470 int Create_(
void *initBuffer,
size_t size) {
479 strcpy(
ErrMsg(),
"invalid size");
486 if (key_ == (key_t)-1)
488 strcpy(
ErrMsg(),
"invalid key");
495 tmp = semget(key_, 0, 0666);
502 semctl(tmp, 0, IPC_RMID, ctl);
508 shmId_ = shmget(key_, 0, 0666);
514 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
520 sem_ = semget(key_, 1, 0666|IPC_CREAT|IPC_EXCL);
523 sprintf(
ErrMsg(),
"error creating semaphore - %s", strerror(errno));
531 if (semctl(sem_, 0, SETVAL, ctl) == -1)
533 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
548 shmId_ = shmget(key_, size, 0666|IPC_CREAT|IPC_EXCL);
551 sprintf(
ErrMsg(),
"error creating shared memory - %s",
561 shmBuf = shmat(shmId_, 0, 0);
564 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
566 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
576 memcpy(
shmBuf, initBuffer, size);
591 int Attach_(
size_t size) {
595 if (key_ == (key_t)-1)
597 strcpy(
ErrMsg(),
"invalid key");
604 shmId_ = shmget(key_, size, 0666);
607 sprintf(
ErrMsg(),
"cannot access shared memory - %s", strerror(errno));
618 if (shmctl(shmId_, IPC_STAT, &ds) == -1)
620 sprintf(
ErrMsg(),
"cannot get shared memory size - %s",
627 strcpy(
ErrMsg(),
"invalid shared memory segment size");
635 shmBuf = shmat(shmId_, 0, 0);
638 sprintf(
ErrMsg(),
"error attaching to shared memory - %s",
646 sem_ = semget(key_, 1, 0666);
649 sprintf(
ErrMsg(),
"cannot get semaphore - %s", strerror(errno));
678 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
int Set(const void *buffer)
Set shared memory buffer.
Definition ngcbSHMDB.hpp:331
ngcbSHMDB(const char *app, const char *s, void *initBuffer=NULL, size_t size=0)
Constructor.
Definition ngcbSHMDB.hpp:61
char * __str2str(char *s1, const char *s2, size_t n)
Definition ngcbSHMDB.hpp:31