/** \brief Destory the key related to the named shared memory object * * The key file related to name is destroyed. * First \b os_posix_destroyKey finds the path of the key * file by calling \b os_posix_findKeyFile. If the key file * is not found, -1 is returned. If the key file is * found, the file is destroyed by calling \b unlink. * Depending on the result of \b unlink, 0 or -1 * is returned after \b key_file_name is freed. */ static int os_posix_destroyKeyFile ( const char *name) { char *key_file_name; int rv; key_file_name = os_posix_findKeyFile (name); if (key_file_name == NULL) { rv = -1; } else if (unlink (key_file_name) == -1) { OS_REPORT (OS_WARNING, "os_posix_destroyKeyFile", 1, "unlink failed with error %d (%s)", os_getErrno(), name); os_free (key_file_name); rv = -1; } else { free (key_file_name); rv = 0; } return rv; }
char * os_findKeyFile( const char * name) { char* result; os_sharedAttr shmAttr; os_sharedAttrInit(&shmAttr); result = NULL; switch (shmAttr.sharedImpl) { case OS_MAP_ON_FILE: result = os_posix_findKeyFile(name); break; case OS_MAP_ON_SEG: result = os_svr4_findKeyFile(name); break; case OS_MAP_ON_HEAP: result = NULL; break; } return result; }
/** \brief Get a file map address by name * * \b os_posix_getMapAddress returns the map address of the named shared memory object. */ static void * os_posix_getMapAddress ( const char *name) { char *key_file_name; void *map_address = NULL; FILE *key_file; char line[512]; key_file_name = os_posix_findKeyFile (name); if (key_file_name != NULL) { key_file = fopen (key_file_name, "r"); if (key_file != NULL) { fgets (line, sizeof (line), key_file); fgets (line, sizeof(line), key_file); sscanf (line, PA_ADDRFMT, (PA_ADDRCAST *)&map_address); fclose (key_file); } os_free (key_file_name); } return map_address; }
/** \brief Get a file map address by name * * \b os_posix_getSize returns the size of the named shared memory object. */ static os_address os_posix_getSize ( const char *name) { char *key_file_name; os_address size = 0; FILE *key_file; char line[512]; key_file_name = os_posix_findKeyFile (name); if (key_file_name != NULL) { key_file = fopen (key_file_name, "r"); if (key_file != NULL) { fgets (line, sizeof (line), key_file); fgets (line, sizeof(line), key_file); fgets (line, sizeof(line), key_file); sscanf (line, PA_ADDRFMT, (PA_ADDRCAST *)&size); fclose (key_file); } os_free (key_file_name); } return size; }
static char * os_posix_getShmObjName( const char *name, void *map_address, int size) { int key_file_fd; int cmask; char * dir_name = NULL; char *key_file_name; unsigned int name_len; char *db_file_name; char buffer[50]; int invalid_access; int index; key_file_name = os_posix_findKeyFile(name); if ((map_address != NULL) && (key_file_name == NULL)) { dir_name = os_getTempDir(); name_len = strlen(dir_name) + strlen(os_posix_key_file_format) + 2; key_file_name = os_malloc(name_len); if (key_file_name != NULL) { snprintf(key_file_name, name_len, "%s/%s", dir_name, os_posix_key_file_format); key_file_fd = mkstemp(key_file_name); invalid_access = 0; cmask = os_posix_get_kfumask(); if ((cmask & (S_IRUSR | S_IWUSR)) && ((cmask & (S_IRUSR | S_IWUSR)) != (S_IRUSR | S_IWUSR))) { cmask |= (S_IRUSR | S_IWUSR); invalid_access = 1; } if ((cmask & (S_IRGRP | S_IWGRP)) && ((cmask & (S_IRGRP | S_IWGRP)) != (S_IRGRP | S_IWGRP))) { cmask |= (S_IRGRP | S_IWGRP); invalid_access = 1; } if ((cmask & (S_IROTH | S_IWOTH)) && ((cmask & (S_IROTH | S_IWOTH)) != (S_IROTH | S_IWOTH))) { cmask |= (S_IROTH | S_IWOTH); invalid_access = 1; } if (invalid_access) { int pmask = os_posix_get_kfumask(); OS_REPORT_7(OS_INFO, "os_posix_getShmObjName", 1, "The user file-creation mask (0%o%o%o) set for the " "service\n specifies exclusive read " "or write access for at least\n " "one of the access catagories.\n " "Read and write access should always be paired,\n" " both prohibit or granted for each " "access catagory.\n Therefore the " "service has set the user access permissions\n" " for the key file associated to " "this domain to (0%o%o%o).\nDomain : \"%s\"", (pmask & (S_IWUSR | S_IRUSR)) >> 6, (pmask & (S_IWGRP | S_IRGRP)) >> 3, pmask & (S_IWOTH | S_IROTH), (cmask & (S_IWUSR | S_IRUSR)) >> 6, (cmask & (S_IWGRP | S_IRGRP)) >> 3, cmask & (S_IWOTH | S_IROTH), name); } fchmod(key_file_fd, OS_PERMISSION & (~cmask)); 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), "%x\n", (unsigned int)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", (int)getpid()); write(key_file_fd, buffer, strlen(buffer)); setpgrp(); /* Make this process the session leader. */ snprintf(buffer, sizeof (buffer), "%d\n", (int)getpgrp()); write(key_file_fd, buffer, strlen(buffer)); close(key_file_fd); }