コード例 #1
0
ファイル: os_sharedmem_file.c プロジェクト: osrf/opensplice
/** \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;
}
コード例 #2
0
ファイル: os_sharedmem.c プロジェクト: AmitShah/opensplice
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;
}
コード例 #3
0
ファイル: os_sharedmem_file.c プロジェクト: osrf/opensplice
/** \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;
}
コード例 #4
0
ファイル: os_sharedmem_file.c プロジェクト: osrf/opensplice
/** \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;
}
コード例 #5
0
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);
        }