Esempio n. 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;
}
Esempio n. 2
0
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;
}