Beispiel #1
0
/** \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;
}
Beispiel #2
0
/*
 * 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;
}