/** \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; }
/* * util_tmpfile -- create a temporary file */ int util_tmpfile(const char *dir, const char *templ) { LOG(3, "dir \"%s\" template \"%s\"", dir, templ); int oerrno; int fd = -1; char fullname[MAX_PATH]; int ret = _snprintf(fullname, MAX_PATH, "%s%s", dir, templ); if (ret < 0 || ret >= MAX_PATH) { ERR("!snprintf"); goto err; } LOG(4, "fullname \"%s\"", fullname); /* * XXX - block signals and modify file creation mask for the time * of mkstmep() execution. Restore previous settings once the file * is created. */ fd = os_mkstemp(fullname); if (fd < 0) { ERR("!os_mkstemp"); goto err; } /* * There is no point to use unlink() here. First, because it does not * work on open files. Second, because the file is created with * O_TEMPORARY flag, and it looks like such temp files cannot be open * from another process, even though they are visible on * the filesystem. */ return fd; err: oerrno = errno; if (fd != -1) (void) os_close(fd); errno = oerrno; return -1; }