diff options
Diffstat (limited to 'src/irmd/reg/ipcp.c')
| -rw-r--r-- | src/irmd/reg/ipcp.c | 111 | 
1 files changed, 29 insertions, 82 deletions
diff --git a/src/irmd/reg/ipcp.c b/src/irmd/reg/ipcp.c index c1d06d94..6580cb5b 100644 --- a/src/irmd/reg/ipcp.c +++ b/src/irmd/reg/ipcp.c @@ -20,126 +20,73 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ -#if defined(__linux__) || defined(__CYGWIN__) -#define _DEFAULT_SOURCE -#else  #define _POSIX_C_SOURCE 200809L -#endif -#include "config.h" +#define OUROBOROS_PREFIX "reg/ipcp" -#include <ouroboros/errno.h> -#include <ouroboros/hash.h> -#include <ouroboros/ipcp.h> -#include <ouroboros/pthread.h> -#include <ouroboros/time_utils.h> +#include <ouroboros/logs.h> +#include <ouroboros/time.h>  #include "ipcp.h"  #include <assert.h> -#include <signal.h> +#include <errno.h>  #include <stdbool.h>  #include <stdlib.h>  #include <string.h>  struct reg_ipcp * reg_ipcp_create(const struct ipcp_info * info)  { -        struct reg_ipcp *  ipcp; -        pthread_condattr_t cattr; +        struct reg_ipcp * ipcp; + +        assert(info != NULL); +        assert(info->state == IPCP_BOOT);          ipcp = malloc(sizeof(*ipcp)); -        if (ipcp == NULL) +        if (ipcp == NULL) { +                log_err("Failed to malloc ipcp.");                  goto fail_malloc; +        } -        if (pthread_mutex_init(&ipcp->mtx, NULL)) -                goto fail_mutex; - -        if (pthread_condattr_init(&cattr)) -                goto fail_cattr; -#ifndef __APPLE__ -        pthread_condattr_setclock(&cattr, PTHREAD_COND_CLOCK); -#endif -        if (pthread_cond_init(&ipcp->cond, &cattr)) -                goto fail_cond; - -        memcpy(&ipcp->info, info, sizeof(*info)); +        memset(ipcp, 0, sizeof(*ipcp)); +        memset(&ipcp->layer, 0, sizeof(ipcp->layer)); -        pthread_condattr_destroy(&cattr); +        list_head_init(&ipcp->next); -        ipcp->layer = NULL; -        ipcp->state = IPCP_BOOT; +        ipcp->info = *info; +        ipcp->info.state = IPCP_BOOT; -        list_head_init(&ipcp->next); +        strcpy(ipcp->layer.name, "Not enrolled.");          return ipcp; - fail_cond: -        pthread_condattr_destroy(&cattr); - fail_cattr: -        pthread_mutex_destroy(&ipcp->mtx); - fail_mutex: -        free(ipcp);   fail_malloc:          return NULL;  }  void reg_ipcp_destroy(struct reg_ipcp * ipcp)  { -        assert(ipcp); - -        pthread_mutex_lock(&ipcp->mtx); - -        while (ipcp->state == IPCP_BOOT) -                pthread_cond_wait(&ipcp->cond, &ipcp->mtx); - -        free(ipcp->layer); +        assert(ipcp != NULL); -        pthread_mutex_unlock(&ipcp->mtx); - -        pthread_cond_destroy(&ipcp->cond); -        pthread_mutex_destroy(&ipcp->mtx); +        assert(list_is_empty(&ipcp->next));          free(ipcp);  } -void reg_ipcp_set_state(struct reg_ipcp * ipcp, -                        enum ipcp_state   state) +void reg_ipcp_update(struct reg_ipcp *        ipcp, +                     const struct ipcp_info * info)  { -        pthread_mutex_lock(&ipcp->mtx); - -        ipcp->state = state; -        pthread_cond_broadcast(&ipcp->cond); +        assert(ipcp != NULL); +        assert(info->state != IPCP_INIT); -        pthread_mutex_unlock(&ipcp->mtx); +        ipcp->info = *info;  } -int reg_ipcp_wait_boot(struct reg_ipcp * ipcp) +void reg_ipcp_set_layer(struct reg_ipcp *         ipcp, +                        const struct layer_info * info)  { -        int             ret = 0; -        struct timespec dl; -        struct timespec to = {SOCKET_TIMEOUT / 1000, -                              (SOCKET_TIMEOUT % 1000) * MILLION}; - -        clock_gettime(PTHREAD_COND_CLOCK, &dl); -        ts_add(&dl, &to, &dl); - -        pthread_mutex_lock(&ipcp->mtx); - -        while (ipcp->state == IPCP_BOOT && ret != ETIMEDOUT) -                ret = pthread_cond_timedwait(&ipcp->cond, &ipcp->mtx, &dl); - -        if (ret == ETIMEDOUT) { -                kill(ipcp->pid, SIGTERM); -                ipcp->state = IPCP_NULL; -                pthread_cond_signal(&ipcp->cond); -        } - -        if (ipcp->state != IPCP_OPERATIONAL) { -                pthread_mutex_unlock(&ipcp->mtx); -                return -1; -        } - -        pthread_mutex_unlock(&ipcp->mtx); +        assert(ipcp != NULL); +        assert(ipcp->info.state == IPCP_OPERATIONAL); -        return 0; +        ipcp->layer = *info;  }  | 
