Bring some changes across from corosync.

My coverity fixes and honzas fixes.

Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
This commit is contained in:
Angus Salkeld 2010-06-11 09:51:53 +10:00
parent 7a90cdda1f
commit e6d5f32f9f
4 changed files with 562 additions and 815 deletions

View File

@ -23,6 +23,7 @@
#define QB_LOGSYS_H_DEFINED
#include <stdarg.h>
#include <stdint.h>
#include <stdlib.h>
#include <syslog.h>
#include <pthread.h>
@ -96,7 +97,7 @@ extern "C" {
/*
* rec_ident explained:
*
* rec_ident is an unsigned int and carries bitfields information
* rec_ident is an uint32_t and carries bitfields information
* on subsys_id, log priority (level) and type of message (RECID).
*
* level values are imported from syslog.h.
@ -141,38 +142,40 @@ extern "C" {
#ifndef QB_LOGSYS_UTILS_ONLY
int _logsys_system_setup(const char *mainsystem,
unsigned int mode,
unsigned int debug,
const char *logfile,
int logfile_priority,
int syslog_facility, int syslog_priority);
int32_t _logsys_system_setup(const char *mainsystem,
uint32_t mode,
uint32_t debug,
const char *logfile,
int32_t logfile_priority,
int32_t syslog_facility, int32_t syslog_priority);
int _logsys_config_subsys_get(const char *subsys);
int32_t _logsys_config_subsys_get(const char *subsys);
unsigned int _logsys_subsys_create(const char *subsys);
uint32_t _logsys_subsys_create(const char *subsys);
int _logsys_rec_init(unsigned int size);
int32_t _logsys_rec_init(uint32_t size);
void _logsys_log_vprintf(unsigned int rec_ident,
void _logsys_log_vprintf(uint32_t rec_ident,
const char *function_name,
const char *file_name,
int file_line, const char *format, va_list ap)
__attribute__ ((format(printf, 5, 0)));
int32_t file_line,
const char *format,
va_list ap) __attribute__ ((format(printf, 5, 0)));
void _logsys_log_printf(unsigned int rec_ident,
void _logsys_log_printf(uint32_t rec_ident,
const char *function_name,
const char *file_name,
int file_line, const char *format, ...)
__attribute__ ((format(printf, 5, 6)));
int32_t file_line,
const char *format,
...) __attribute__ ((format(printf, 5, 6)));
void _logsys_log_rec(unsigned int rec_ident,
void _logsys_log_rec(uint32_t rec_ident,
const char *function_name,
const char *file_name, int file_line, ...);
const char *file_name, int32_t file_line, ...);
int _logsys_wthread_create(void);
int32_t _logsys_wthread_create(void);
static int qb_logsys_subsys_id __attribute__ ((unused)) =
static int32_t qb_logsys_subsys_id __attribute__ ((unused)) =
QB_LOGSYS_MAX_SUBSYS_COUNT;
/*
@ -192,7 +195,7 @@ void qb_logsys_atexit(void);
*/
void qb_logsys_flush(void);
int qb_logsys_log_rec_store(const char *filename);
int32_t qb_logsys_log_rec_store(const char *filename);
/*
* External API - configuration
@ -201,7 +204,7 @@ int qb_logsys_log_rec_store(const char *filename);
/*
* configuration bits that can only be done for the whole system
*/
int qb_logsys_format_set(const char *format);
int32_t qb_logsys_format_set(const char *format);
char *qb_logsys_format_get(void);
@ -213,52 +216,50 @@ char *qb_logsys_format_get(void);
*
* Pass a NULL subsystem to change them all
*/
unsigned int qb_logsys_config_syslog_facility_set(const char
*subsys,
unsigned int facility);
int32_t qb_logsys_config_syslog_facility_set(const char *subsys,
uint32_t facility);
unsigned int qb_logsys_config_syslog_priority_set(const char
*subsys,
unsigned int priority);
int32_t qb_logsys_config_syslog_priority_set(const char *subsys,
uint32_t priority);
unsigned int qb_logsys_config_mode_set(const char *subsys, unsigned int mode);
int32_t qb_logsys_config_mode_set(const char *subsys, uint32_t mode);
unsigned int qb_logsys_config_mode_get(const char *subsys);
uint32_t qb_logsys_config_mode_get(const char *subsys);
/*
* to close a logfile, just invoke this function with a NULL
* file or if you want to change logfile, the old one will
* be closed for you.
*/
int qb_logsys_config_file_set(const char *subsys,
const char **error_string, const char *file);
int32_t qb_logsys_config_file_set(const char *subsys,
const char **error_string, const char *file);
unsigned int qb_logsys_config_logfile_priority_set(const char
*subsys,
unsigned int priority);
int32_t qb_logsys_config_logfile_priority_set(const char *subsys,
uint32_t priority);
/*
* enabling debug, disable message priority filtering.
* everything is sent everywhere. priority values
* for file and syslog are not overwritten.
*/
unsigned int qb_logsys_config_debug_set(const char *subsys, unsigned int value);
int32_t qb_logsys_config_debug_set(const char *subsys, uint32_t value);
/*
* External API - helpers
*
* convert facility/priority to/from name/values
*/
int qb_logsys_facility_id_get(const char *name);
int32_t qb_logsys_facility_id_get(const char *name);
const char *qb_logsys_facility_name_get(unsigned int facility);
const char *qb_logsys_facility_name_get(uint32_t facility);
int qb_logsys_priority_id_get(const char *name);
int32_t qb_logsys_priority_id_get(const char *name);
const char *qb_logsys_priority_name_get(unsigned int priority);
const char *qb_logsys_priority_name_get(uint32_t priority);
int qb_logsys_thread_priority_set(int policy, const struct sched_param
*param, unsigned int after_log_ops_yield);
int32_t qb_logsys_thread_priority_set(int32_t policy,
const struct sched_param *param,
uint32_t after_log_ops_yield);
/*
* External definitions

View File

@ -255,11 +255,16 @@ circular_memory_map(char *path, const char *file, void **buf, size_t bytes)
}
res = ftruncate(fd, bytes);
if (res == -1) {
close(fd);
return (-1);
}
addr_orig = mmap(NULL, bytes << 1, PROT_NONE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (addr_orig == MAP_FAILED) {
close(fd);
return (-1);
}
@ -267,6 +272,7 @@ circular_memory_map(char *path, const char *file, void **buf, size_t bytes)
MAP_FIXED | MAP_SHARED, fd, 0);
if (addr != addr_orig) {
close(fd);
return (-1);
}
#ifdef QB_BSD
@ -276,6 +282,10 @@ circular_memory_map(char *path, const char *file, void **buf, size_t bytes)
addr = mmap(((char *)addr_orig) + bytes,
bytes, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_SHARED, fd, 0);
if (addr == MAP_FAILED) {
close(fd);
return (-1);
}
#ifdef QB_BSD
madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
#endif
@ -329,11 +339,16 @@ static int memory_map(char *path, const char *file, void **buf, size_t bytes)
}
res = ftruncate(fd, bytes);
if (res == -1) {
close(fd);
return (-1);
}
addr_orig = mmap(NULL, bytes, PROT_NONE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (addr_orig == MAP_FAILED) {
close(fd);
return (-1);
}
@ -341,6 +356,7 @@ static int memory_map(char *path, const char *file, void **buf, size_t bytes)
MAP_FIXED | MAP_SHARED, fd, 0);
if (addr != addr_orig) {
close(fd);
return (-1);
}
#ifdef QB_BSD
@ -405,45 +421,66 @@ retry_semop:
return 0;
}
static int32_t
reply_receive(struct ipc_instance *ipc_instance, void *res_msg, size_t res_len)
static int32_t ipc_sem_wait(struct ipc_instance *ipc_instance, int sem_num)
{
#if _POSIX_THREAD_PROCESS_SHARED < 1
struct sembuf sop;
#else
struct timespec timeout;
struct pollfd pfd;
sem_t *sem = NULL;
#endif
qb_ipc_response_header_t *response_header;
int res;
#if _POSIX_THREAD_PROCESS_SHARED > 0
switch (sem_num) {
case 0:
sem = &ipc_instance->control_buffer->sem0;
break;
case 1:
sem = &ipc_instance->control_buffer->sem1;
break;
case 2:
sem = &ipc_instance->control_buffer->sem2;
break;
}
retry_semwait:
timeout.tv_sec = time(NULL) + IPC_SEMWAIT_TIMEOUT;
timeout.tv_nsec = 0;
res = sem_timedwait(&ipc_instance->control_buffer->sem1, &timeout);
res = sem_timedwait(sem, &timeout);
if (res == -1 && errno == ETIMEDOUT) {
pfd.fd = ipc_instance->fd;
pfd.events = 0;
poll(&pfd, 1, 0);
if (pfd.revents == POLLERR || pfd.revents == POLLHUP) {
res = poll(&pfd, 1, 0);
if (res == -1 && errno == EINTR) {
return EAGAIN;
} else if (res == -1) {
return EBADE;
}
goto retry_semwait;
}
if (res == 1) {
if (pfd.revents == POLLERR || pfd.revents == POLLHUP
|| pfd.revents == POLLNVAL) {
return EBADE;
}
}
if (res == -1 && errno == EINTR) {
goto retry_semwait;
} else if (res == -1 && errno == EINTR) {
return EAGAIN;
} else if (res == -1) {
return EBADE;
}
#else
/*
* Wait for semaphore #1 indicating a new message from server
* to client in the response queue
* Wait for semaphore indicating a new message from server
* to client in queue
*/
sop.sem_num = 1;
sop.sem_num = sem_num;
sop.sem_op = -1;
sop.sem_flg = 0;
@ -455,14 +492,26 @@ retry_semop:
priv_change_send(ipc_instance);
goto retry_semop;
} else if (res == -1) {
return (EBADE);
return EBAD;
}
#endif
return 0;
}
static int32_t
reply_receive(struct ipc_instance *ipc_instance, void *res_msg, size_t res_len)
{
qb_ipc_response_header_t *response_header;
int32_t err = 0;
if ((err = ipc_sem_wait(ipc_instance, 1)) != 0) {
return (err);
}
response_header =
(qb_ipc_response_header_t *) ipc_instance->response_buffer;
if (response_header->error == EAGAIN) {
return EAGAIN;
return (EAGAIN);
}
memcpy(res_msg, ipc_instance->response_buffer, res_len);
@ -472,56 +521,12 @@ retry_semop:
static int32_t
reply_receive_in_buf(struct ipc_instance *ipc_instance, void **res_msg)
{
#if _POSIX_THREAD_PROCESS_SHARED < 1
struct sembuf sop;
#else
struct timespec timeout;
struct pollfd pfd;
#endif
int res;
int32_t err;
#if _POSIX_THREAD_PROCESS_SHARED > 0
retry_semwait:
timeout.tv_sec = time(NULL) + IPC_SEMWAIT_TIMEOUT;
timeout.tv_nsec = 0;
res = sem_timedwait(&ipc_instance->control_buffer->sem1, &timeout);
if (res == -1 && errno == ETIMEDOUT) {
pfd.fd = ipc_instance->fd;
pfd.events = 0;
poll(&pfd, 1, 0);
if (pfd.revents == POLLERR || pfd.revents == POLLHUP) {
return EBADE;
}
goto retry_semwait;
if ((err = ipc_sem_wait(ipc_instance, 1)) != 0) {
return (err);
}
if (res == -1 && errno == EINTR) {
goto retry_semwait;
}
#else
/*
* Wait for semaphore #1 indicating a new message from server
* to client in the response queue
*/
sop.sem_num = 1;
sop.sem_op = -1;
sop.sem_flg = 0;
retry_semop:
res = semop(ipc_instance->semid, &sop, 1);
if (res == -1 && errno == EINTR) {
return (EAGAIN);
} else if (res == -1 && errno == EACCES) {
priv_change_send(ipc_instance);
goto retry_semop;
} else if (res == -1) {
return (EBADE);
}
#endif
*res_msg = (char *)ipc_instance->response_buffer;
return 0;
}
@ -632,7 +637,6 @@ qb_ipcc_service_connect(const char *socket_name,
sem_init(&ipc_instance->control_buffer->sem1, 1, 0);
sem_init(&ipc_instance->control_buffer->sem2, 1, 0);
#else
/*
* Allocate a semaphore segment
*/
@ -651,6 +655,7 @@ qb_ipcc_service_connect(const char *socket_name,
* an existing shared memory segment for which we have access
*/
if (errno != EEXIST && errno != EACCES) {
res = EBAD;
goto error_exit;
}
}
@ -658,11 +663,13 @@ qb_ipcc_service_connect(const char *socket_name,
semun.val = 0;
res = semctl(ipc_instance->semid, 0, SETVAL, semun);
if (res != 0) {
res = EBAD;
goto error_exit;
}
res = semctl(ipc_instance->semid, 1, SETVAL, semun);
if (res != 0) {
res = EBAD;
goto error_exit;
}
#endif
@ -877,12 +884,9 @@ error_put:
int32_t qb_ipcc_dispatch_put(qb_hdb_handle_t handle)
{
#if _POSIX_THREAD_PROCESS_SHARED < 1
struct sembuf sop;
#endif
qb_ipc_response_header_t *header;
struct ipc_instance *ipc_instance;
int res;
int32_t res;
char *addr;
unsigned int read_idx;
@ -891,29 +895,10 @@ int32_t qb_ipcc_dispatch_put(qb_hdb_handle_t handle)
if (res != 0) {
return (res);
}
#if _POSIX_THREAD_PROCESS_SHARED > 0
retry_semwait:
res = sem_wait(&ipc_instance->control_buffer->sem2);
if (res == -1 && errno == EINTR) {
goto retry_semwait;
}
#else
sop.sem_num = 2;
sop.sem_op = -1;
sop.sem_flg = 0;
retry_semop:
res = semop(ipc_instance->semid, &sop, 1);
if (res == -1 && errno == EINTR) {
res = EAGAIN;
goto error_exit;
} else if (res == -1 && errno == EACCES) {
priv_change_send(ipc_instance);
goto retry_semop;
} else if (res == -1) {
res = EBADE;
if ((res = ipc_sem_wait(ipc_instance, 2)) != 0) {
goto error_exit;
}
#endif
addr = ipc_instance->dispatch_buffer;
@ -926,9 +911,7 @@ retry_semop:
*/
res = 0;
#if _POSIX_THREAD_PROCESS_SHARED < 1
error_exit:
#endif
qb_hdb_handle_put(&ipc_hdb, handle);
qb_hdb_handle_put(&ipc_hdb, handle);

View File

@ -199,12 +199,21 @@ static int memory_map(const char *path, size_t bytes, void **buf)
unlink(path);
if (fd == -1) {
return (-1);
}
res = ftruncate(fd, bytes);
if (res == -1) {
close(fd);
return (-1);
}
addr_orig = mmap(NULL, bytes, PROT_NONE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (addr_orig == MAP_FAILED) {
close(fd);
return (-1);
}
@ -212,6 +221,7 @@ static int memory_map(const char *path, size_t bytes, void **buf)
MAP_FIXED | MAP_SHARED, fd, 0);
if (addr != addr_orig) {
close(fd);
return (-1);
}
#ifdef QB_BSD
@ -237,12 +247,20 @@ static int circular_memory_map(const char *path, size_t bytes, void **buf)
unlink(path);
if (fd == -1) {
return (-1);
}
res = ftruncate(fd, bytes);
if (res == -1) {
close(fd);
return (-1);
}
addr_orig = mmap(NULL, bytes << 1, PROT_NONE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (addr_orig == MAP_FAILED) {
close(fd);
return (-1);
}
@ -250,6 +268,7 @@ static int circular_memory_map(const char *path, size_t bytes, void **buf)
MAP_FIXED | MAP_SHARED, fd, 0);
if (addr != addr_orig) {
close(fd);
return (-1);
}
#ifdef QB_BSD
@ -259,6 +278,10 @@ static int circular_memory_map(const char *path, size_t bytes, void **buf)
addr = mmap(((char *)addr_orig) + bytes,
bytes, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_SHARED, fd, 0);
if (addr == MAP_FAILED) {
close(fd);
return (-1);
}
#ifdef QB_BSD
madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
#endif
@ -613,8 +636,7 @@ retry_semop:
send_ok = api->sending_allowed(conn_info->service,
header->id,
header,
conn_info->
sending_allowed_private_data);
conn_info->sending_allowed_private_data);
/*
* This happens when the message contains some kind of invalid
@ -650,8 +672,9 @@ retry_semop:
sizeof(qb_ipc_response_header_t));
}
api->sending_allowed_release(conn_info->
sending_allowed_private_data);
api->
sending_allowed_release
(conn_info->sending_allowed_private_data);
qb_ipcs_refcount_dec(conn);
}
pthread_exit(0);
@ -662,6 +685,7 @@ static int req_setup_send(struct conn_info *conn_info, int error)
mar_res_setup_t res_setup;
unsigned int res;
memset(&res_setup, 0, sizeof(res_setup));
res_setup.error = error;
retry_send:
@ -867,7 +891,7 @@ static int conn_info_create(int fd)
/*
* Exported functions
*/
void qb_ipcs_ipc_init(struct qb_ipcs_init_state *init_state)
extern void qb_ipcs_ipc_init(struct qb_ipcs_init_state *init_state)
{
int server_fd;
struct sockaddr_un un_addr;
@ -900,8 +924,7 @@ void qb_ipcs_ipc_init(struct qb_ipcs_init_state *init_state)
qb_util_log(LOG_CRIT,
"Could not set non-blocking operation on server socket: %s\n",
error_str);
api->
fatal_error
api->fatal_error
("Could not set non-blocking operation on server socket");
}

File diff suppressed because it is too large Load Diff