diff options
-rw-r--r-- | jackd/engine.c | 6 | ||||
-rw-r--r-- | libjack/shm.c | 37 |
2 files changed, 28 insertions, 15 deletions
diff --git a/jackd/engine.c b/jackd/engine.c index 3029ab3..693bf61 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -1252,6 +1252,8 @@ handle_new_client (jack_engine_t *engine, int client_fd) jack_client_internal_t *client; jack_client_connect_request_t req; jack_client_connect_result_t res; + + res.status = 0; if (read (client_fd, &req, sizeof (req)) != sizeof (req)) { jack_error ("cannot read connection request from client"); @@ -1261,11 +1263,11 @@ handle_new_client (jack_engine_t *engine, int client_fd) if (!req.load) { return handle_unload_client (engine, client_fd, &req); } - + if ((client = setup_client (engine, client_fd, &req, &res)) == NULL) { return -1; } - + if (write (client->request_fd, &res, sizeof (res)) != sizeof (res)) { jack_error ("cannot write connection response to client"); jack_client_delete (engine, client); diff --git a/libjack/shm.c b/libjack/shm.c index f1fdea9..89878b3 100644 --- a/libjack/shm.c +++ b/libjack/shm.c @@ -141,6 +141,7 @@ jack_initialize_shm (void) jack_shmsize_t size; int new_registry = FALSE; int ret = -1; + int perm; if (jack_shm_registry != NULL) { return 0; @@ -154,16 +155,20 @@ jack_initialize_shm (void) size = sizeof (jack_shm_registry_t) * MAX_SHM_ID; jack_shm_lock_registry (); + + perm = O_RDWR; /* try without O_CREAT to see if it already exists */ - - if ((shm_fd = shm_open ("/jack-shm-registry", O_RDWR, 0666)) < 0) { + + if ((shm_fd = shm_open ("/jack-shm-registry", perm, 0666)) < 0) { if (errno == ENOENT) { + + perm = O_RDWR|O_CREAT; /* it doesn't exist, so create it */ - if ((shm_fd = shm_open ("/jack-shm-registry", O_RDWR|O_CREAT, 0666)) < 0) { + if ((shm_fd = shm_open ("/jack-shm-registry", perm, 0666)) < 0) { jack_error ("cannot create shm registry segment (%s)", strerror (errno)); goto out; @@ -178,12 +183,14 @@ jack_initialize_shm (void) } } - if (ftruncate (shm_fd, size) < 0) { - jack_error ("cannot set size of engine shm registry " - "(%s)", strerror (errno)); - goto out; + if (perm & O_CREAT) { + if (ftruncate (shm_fd, size) < 0) { + jack_error ("cannot set size of engine shm registry 1" + "(%s)", strerror (errno)); + goto out; + } } - + if ((jack_shm_registry = mmap (0, size, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) { jack_error ("cannot mmap shm registry segment (%s)", strerror (errno)); @@ -232,17 +239,21 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si) if ((registry = jack_get_free_shm_info ()) == NULL) { return -1; } + + int perm = O_RDWR|O_CREAT; if ((shm_fd = shm_open (shm_name, O_RDWR|O_CREAT, 0666)) < 0) { jack_error ("cannot create shm segment %s (%s)", shm_name, strerror (errno)); return -1; } - - if (ftruncate (shm_fd, size) < 0) { - jack_error ("cannot set size of engine shm registry " - "(%s)", strerror (errno)); - return -1; + + if (perm & O_CREAT) { + if (ftruncate (shm_fd, size) < 0) { + jack_error ("cannot set size of engine shm registry 0" + "(%s)", strerror (errno)); + return -1; + } } close (shm_fd); |