--- libaitsess/src/aitsess.c 2012/02/10 23:38:30 1.4 +++ libaitsess/src/aitsess.c 2012/05/23 15:14:41 1.5.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitsess.c,v 1.4 2012/02/10 23:38:30 misho Exp $ +* $Id: aitsess.c,v 1.5.2.1 2012/05/23 15:14:41 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -109,7 +109,7 @@ sess_initSession(int id, const char *csFName, ait_sess } if (!*Sess) { - *Sess = malloc(sizeof(ait_sess_t)); + *Sess = io_malloc(sizeof(ait_sess_t)); if (!*Sess) { LOGERR; return -1; @@ -122,21 +122,21 @@ sess_initSession(int id, const char *csFName, ait_sess if (h == -1) { if (errno != EEXIST) { LOGERR; - free(*Sess); + io_free(*Sess); return -1; } /* If key file exist, session already connected */ h = open((*Sess)->name, O_RDONLY); if (h == -1) { LOGERR; - free(*Sess); + io_free(*Sess); return -1; } ret = read(h, szStr, sizeof szStr); if (ret == -1) { LOGERR; close(h); - free(*Sess); + io_free(*Sess); return -1; } if (!strncmp(szStr, "IPC@", 4) && id == SHARED_IPC) { @@ -165,7 +165,7 @@ sess_initSession(int id, const char *csFName, ait_sess sess_SetErr(EPROTONOSUPPORT, "Session type not supported or wrong session type"); close(h); - free(*Sess); + io_free(*Sess); return -1; } /* key found */ @@ -197,7 +197,7 @@ sess_initSession(int id, const char *csFName, ait_sess sess_SetErr(EINVAL, "Session type must be specified"); close(h); unlink(csFName); - free(*Sess); + io_free(*Sess); return -1; } strlcat(szStr, "ELWIX_Session ("PACKAGE_STRING")\n", sizeof szStr); @@ -234,7 +234,7 @@ sess_freeSession(ait_sess_t ** __restrict Sess) (*Sess)->type = SHARED_UNKNOWN; */ - free(*Sess); + io_free(*Sess); *Sess = NULL; } @@ -274,7 +274,11 @@ map_createSession(int nSeed, long nSize, ait_sess_t * /* build semaphore & shared memory name */ memset(szSName, 0, sizeof szSName); snprintf(szSName[0], MAX_SEMNAME, "/%X.ANS", (u_int) Sess->key); +#ifdef HAVE_SHM_OPEN + snprintf(szSName[1], FILENAME_MAX, "/%s-%x.ANM", Sess->name, (u_int) Sess->key); +#else snprintf(szSName[1], FILENAME_MAX, "%s-%x.ANM", Sess->name, (u_int) Sess->key); +#endif /* create semaphore & add 1 */ Sess->id.sid = sem_open(szSName[0], O_CREAT, MEM_MODE); @@ -288,14 +292,25 @@ map_createSession(int nSeed, long nSize, ait_sess_t * sem_post(Sess->id.sid); /* create file for shared memory storage */ +#ifdef HAVE_SHM_OPEN + Sess->mem.fd = shm_open(szSName[1], O_RDWR | O_CREAT, MEM_MODE); +#else Sess->mem.fd = open(szSName[1], O_RDWR | O_CREAT, MEM_MODE); +#endif if (Sess->mem.fd == -1) { LOGERR; map_destroySession(Sess); return -1; } - /* if is new shared memory session, fill file with zeros */ if (!Sess->zcpy) { +#ifdef HAVE_SHM_OPEN + if (ftruncate(Sess->mem.fd, nSize) == -1) { + LOGERR; + map_destroySession(Sess); + return -1; + } +#else + /* if is new shared memory session, fill file with zeros */ if (lseek(Sess->mem.fd, nSize - 1, SEEK_SET) == -1) { LOGERR; map_destroySession(Sess); @@ -303,6 +318,7 @@ map_createSession(int nSeed, long nSize, ait_sess_t * } else write(Sess->mem.fd, "", 1); lseek(Sess->mem.fd, 0, SEEK_SET); +#endif } Sess->eom = nSize; @@ -325,7 +341,11 @@ map_destroySession(ait_sess_t * __restrict Sess) memset(szSName, 0, sizeof szSName); snprintf(szSName[0], MAX_SEMNAME, "/%X.ANS", (u_int) Sess->key); +#ifdef HAVE_SHM_UNLINK + snprintf(szSName[1], FILENAME_MAX, "/%s-%x.ANM", Sess->name, (u_int) Sess->key); +#else snprintf(szSName[1], FILENAME_MAX, "%s-%x.ANM", Sess->name, (u_int) Sess->key); +#endif if (Sess->id.sid != SEM_FAILED) { sem_close(Sess->id.sid); @@ -333,7 +353,11 @@ map_destroySession(ait_sess_t * __restrict Sess) } if (Sess->mem.fd > 2) { close(Sess->mem.fd); +#ifdef HAVE_SHM_UNLINK + shm_unlink(szSName[1]); +#else unlink(szSName[1]); +#endif } unlink(Sess->name); memset(Sess->name, 0, sizeof Sess->name);