60 ngcbSHMDB(
const char *app,
const char *s,
void *initBuffer = NULL,
71 if ((size == 0) && (initBuffer != NULL))
73 strcpy(
ErrMsg(),
"invalid database size");
78 strcpy(
ErrMsg(),
"invalid application name");
83 strcpy(
ErrMsg(),
"invalid key (NULL)");
86 else if (strlen(s) == 0)
88 strcpy(
ErrMsg(),
"invalid key");
96 if (initBuffer != NULL)
101 if (strncmp(s,
"pub_", 4) == 0)
108 strcpy(
ErrMsg(),
"invalid key");
113 snprintf(name_,
sizeof(name_),
"/tmp/%s_%s", app, s);
114 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0666);
122 snprintf(name_,
sizeof(name_),
"/tmp/%s_%u_%s", app, getuid(), s);
123 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0600);
128 sprintf(
ErrMsg(),
"invalid key - %s", strerror(errno));
141 snprintf(name_,
sizeof(name_),
"/tmp/%s_%u_%s", app, getuid(), s);
142 fd_ = open(name_, O_RDONLY, 0);
148 snprintf(name_,
sizeof(name_),
"/tmp/%s_%s", app, s);
149 fd_ = open(name_, O_RDONLY, 0);
155 snprintf(name_,
sizeof(name_),
"/tmp/%s_pub_%s", app, s);
156 fd_ = open(name_, O_RDONLY, 0);
163 if (strncmp(s,
"pub_", 4) == 0)
170 strcpy(
ErrMsg(),
"invalid key");
175 snprintf(name_,
sizeof(name_),
"/tmp/%s_%s", app, s);
176 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0666);
184 snprintf(name_,
sizeof(name_),
"/tmp/%s_%u_%s", app, getuid(), s);
185 fd_ = open(name_, O_RDWR|O_CREAT|O_TRUNC, 0600);
190 sprintf(
ErrMsg(),
"invalid key - %s", strerror(errno));
205 key_ = ftok(name_, 0x1f);
206 if (key_ ==
static_cast<key_t
>(-1))
208 sprintf(
ErrMsg(),
"cannot get key - %s", strerror(errno));
209 close(fd_); fd_ = -1;
213 if ((initBuffer == NULL) && (fd_ >= 0))
219 close(fd_); fd_ = -1;
223 if (initBuffer != NULL)
228 if (Create_(initBuffer, size) != 0)
return;
236 if (Attach_(size) != 0)
return;
263 if (fd_ >= 0) close(fd_);
268 if (delKey_ && (strlen(name_) > 0)) remove(name_);
281 if (semop(sem_, semOpLock_, 2) != 0)
285 while (semop(sem_, semOpLock_, 2) != 0)
289 if (errno == EIDRM) sem_ = -1;
290 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
304 sprintf(
ErrMsg(),
"cannot lock semaphore - %s", strerror(errno));
311 strcpy(
ErrMsg(),
"invalid semaphore");
322 if (semop(sem_, semOpUnlock_, 1) != 0)
324 if (errno == EIDRM) sem_ = -1;
330 int Set(
const void *buffer) {
338 if (buffer != NULL) memcpy(
shmBuf, buffer, size_);
339 else memset(
shmBuf, 0, size_);
357 else memset(buffer, 0, size_);
369 size_t Size() {
return (size_);}
375 int Key() {
return (key_);}
419 struct sembuf semOpLock_[2];
422 struct sembuf semOpUnlock_[1];
442 memset(&semOpLock_[0], 0,
sizeof(
struct sembuf));
443 memset(&semOpLock_[1], 0,
sizeof(
struct sembuf));
444 semOpLock_[1].sem_num = 0;
445 semOpLock_[1].sem_op = 1;
446 semOpLock_[1].sem_flg = SEM_UNDO;
452 memset(&semOpUnlock_[0], 0,
sizeof(
struct sembuf));
453 semOpUnlock_[0].sem_num = 0;
454 semOpUnlock_[0].sem_op = -1;
455 semOpUnlock_[0].sem_flg = IPC_NOWAIT|SEM_UNDO;
464 semctl(sem_, 0, IPC_RMID, ctl); sem_ = -1;
469 int Create_(
void *initBuffer,
size_t size) {
478 strcpy(
ErrMsg(),
"invalid size");
485 if (key_ == (key_t)-1)
487 strcpy(
ErrMsg(),
"invalid key");
494 tmp = semget(key_, 0, 0666);
501 semctl(tmp, 0, IPC_RMID, ctl);
507 shmId_ = shmget(key_, 0, 0666);
513 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
519 sem_ = semget(key_, 1, 0666|IPC_CREAT|IPC_EXCL);
522 sprintf(
ErrMsg(),
"error creating semaphore - %s", strerror(errno));
530 if (semctl(sem_, 0, SETVAL, ctl) == -1)
532 sprintf(
ErrMsg(),
"semaphore error - %s", strerror(errno));
547 shmId_ = shmget(key_, size, 0666|IPC_CREAT|IPC_EXCL);
550 sprintf(
ErrMsg(),
"error creating shared memory - %s",
560 shmBuf = shmat(shmId_, 0, 0);
563 sprintf(
ErrMsg(),
"cannot attach to shared memory - %s",
565 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
575 memcpy(
shmBuf, initBuffer, size);
590 int Attach_(
size_t size) {
594 if (key_ == (key_t)-1)
596 strcpy(
ErrMsg(),
"invalid key");
603 shmId_ = shmget(key_, size, 0666);
606 sprintf(
ErrMsg(),
"cannot access shared memory - %s", strerror(errno));
617 if (shmctl(shmId_, IPC_STAT, &ds) == -1)
619 sprintf(
ErrMsg(),
"cannot get shared memory size - %s",
626 strcpy(
ErrMsg(),
"invalid shared memory segment size");
634 shmBuf = shmat(shmId_, 0, 0);
637 sprintf(
ErrMsg(),
"error attaching to shared memory - %s",
645 sem_ = semget(key_, 1, 0666);
648 sprintf(
ErrMsg(),
"cannot get semaphore - %s", strerror(errno));
677 shmctl(shmId_, IPC_RMID, 0); shmId_ = -1;
int Set(const void *buffer)
Set shared memory buffer.
Definition ngcbSHMDB.hpp:330
ngcbSHMDB(const char *app, const char *s, void *initBuffer=NULL, size_t size=0)
Constructor.
Definition ngcbSHMDB.hpp:60
char * __str2str(char *s1, const char *s2, size_t n)
Definition ngcbSHMDB.hpp:30