/** \brief Get a POSIX shared object identifier for a shared * memory segment by name * * \b os_posix_getShmObjName tries to find a POSIX shared object * name for a named shared memory segment by calling \b os_posix_findKeyFile. * * If the shared object identifier is not found, one is created by * calling \b mkstemp. And an related key file is produced containing * the name, the map address and the size. The name of the shared object * identifier is returned. * * If the shared object identifier is found, it's name is returned. * * The name of the shared object is equal to the path of the related * key file except for the leading "/tmp/" */ static char * os_posix_getShmObjName ( const char *name, void *map_address, os_address size, const int id) { int key_file_fd; char *key_file_name; unsigned int name_len; char *db_file_name; char buffer[50]; key_file_name = os_posix_findKeyFileByIdAndName (id,name); if (key_file_name == NULL) { if (map_address != NULL) { name_len = strlen (os_posix_key_file_prefix) + 1; key_file_name = os_malloc (name_len); if (key_file_name != NULL) { snprintf (key_file_name, name_len, "%s", os_posix_key_file_prefix); key_file_fd = os_mkstemp (key_file_name); write (key_file_fd, name, strlen(name) + 1); write (key_file_fd, "\n", 1); snprintf (buffer, sizeof (buffer), PA_ADDRFMT"\n", (PA_ADDRCAST)map_address); write (key_file_fd, buffer, strlen(buffer)); snprintf (buffer, sizeof (buffer), PA_ADDRFMT"\n", (PA_ADDRCAST)size); write (key_file_fd, buffer, strlen(buffer)); snprintf (buffer, sizeof (buffer), "POSIX-SMO\n"); write (key_file_fd, buffer, strlen(buffer)); snprintf (buffer, sizeof (buffer), "%d\n", getpid()); write (key_file_fd, buffer, strlen(buffer)); snprintf(buffer, sizeof (buffer), "%d\n", id); write(key_file_fd, buffer, strlen(buffer)); close (key_file_fd); } } } if (key_file_name != NULL) { db_file_name = os_malloc(strlen(key_file_name)); if (db_file_name != NULL) { os_strcpy (db_file_name, "/"); os_strcat (db_file_name, &key_file_name[4]); } os_free (key_file_name); } else { db_file_name = NULL; } return db_file_name; }
char * os_findKeyFileByNameAndId( const char * name, const os_int32 id) { char* result; os_sharedAttr shmAttr; os_sharedAttrInit(&shmAttr); result = NULL; switch (shmAttr.sharedImpl) { case OS_MAP_ON_FILE: result = os_posix_findKeyFileByIdAndName(id, name); break; case OS_MAP_ON_SEG: result = os_svr4_findKeyFileByNameAndId(name, id); break; case OS_MAP_ON_HEAP: result = NULL; break; } return result; }