diff options
author | Martin Nagy <mnagy@redhat.com> | 2008-12-10 21:25:39 +0100 |
---|---|---|
committer | Martin Nagy <mnagy@redhat.com> | 2008-12-10 21:25:39 +0100 |
commit | 84f3ee86191e15d70c7466cebe3d1fb34cf7e9d5 (patch) | |
tree | 1d6b9c7c65f0813dc90db59f56b57c1b79b2de79 | |
download | ldap_driver-84f3ee86191e15d70c7466cebe3d1fb34cf7e9d5.tar.gz ldap_driver-84f3ee86191e15d70c7466cebe3d1fb34cf7e9d5.tar.xz ldap_driver-84f3ee86191e15d70c7466cebe3d1fb34cf7e9d5.zip |
Initial import.
The driver for now only prints the argument list and then fails.
-rw-r--r-- | Makefile | 25 | ||||
-rw-r--r-- | ldap_driver.c | 58 | ||||
-rw-r--r-- | log.c | 92 | ||||
-rw-r--r-- | log.h | 36 | ||||
-rw-r--r-- | semaphore.c | 107 | ||||
-rw-r--r-- | semaphore.h | 45 |
6 files changed, 363 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..22cea06 --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +.PHONY: all clean + +LIBMAJOR = 1 +LIBMINOR = 0 + +LIBNAME = libdnsldap.so.$(LIBMAJOR).$(LIBMINOR).0 +LIBSONAME = libdnsldap.so.$(LIBMAJOR) +LIBSOURCES = ldap_driver.c semaphore.o log.o + +ALL_CFLAGS = -Wall -Wextra -pedantic -std=c99 -g -fPIC $(CFLAGS) + + +all: $(LIBNAME) semaphore.o + +clean: + rm -f $(LIBNAME) *.o + +$(LIBNAME): $(LIBSOURCES) + $(CC) $(ALL_CFLAGS) -ldns -lldap -shared -Wl,-soname,$(LIBSONAME) $+ -o $@ + +semaphore.o: semaphore.c + $(CC) $(ALL_CFLAGS) -c $+ -o $@ + +log.o: log.c + $(CC) $(ALL_CFLAGS) -c $+ -o $@ diff --git a/ldap_driver.c b/ldap_driver.c new file mode 100644 index 0000000..956a3d5 --- /dev/null +++ b/ldap_driver.c @@ -0,0 +1,58 @@ +/* Authors: Martin Nagy <mnagy@redhat.com> + * + * Copyright (C) 2008 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <isc/mem.h> +#include <isc/util.h> + +#include <dns/result.h> + +#include "log.h" + +#define CHECK(op) \ + do { result = (op); \ + if (result != ISC_R_SUCCESS) goto cleanup; \ + } while (0) + +/* + * Functions. + */ + +isc_result_t +dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv, + dns_view_t *view) +{ + isc_result_t result; + + UNUSED(mctx); + UNUSED(view); + + log_debug(2, "Registering dynamic ldap driver for %s.", name); + + /* Test argv. */ + while (*argv != NULL) { + log_debug(2, "Arg: %s", *argv); + argv++; + } + + /* Register our driver here. */ + log_error("Driver not implemented yet."); + result = ISC_R_NOTIMPLEMENTED; + + return result; +} @@ -0,0 +1,92 @@ +/* Authors: Martin Nagy <mnagy@redhat.com> + * + * Copyright (C) 2008 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Some general comments about the driver go here. ABRAKA + */ + +/* Includes, group nicely and keep files ordered! ABRAKA */ +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <dns/log.h> +#include <dns/result.h> + +#include <isc/error.h> + +#include "log.h" + +#define CHECK(op) \ + do { result = (op); \ + if (result != ISC_R_SUCCESS) goto cleanup; \ + } while (0) + +#define MSG_BUFFER_SIZE 1024 + +/* + * TODO: + * - Some compiler format checks would be nice. + * - Change these to use isc_log_vwrite(). + * - Think about log_unexpected_file_line(), maybe use something else. + */ + + +void +log_debug(int level, const char *format, ...) +{ + char buf[MSG_BUFFER_SIZE]; + va_list args; + + va_start(args, format); + vsnprintf(buf, MSG_BUFFER_SIZE, format, args); + va_end(args); + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DYNDB, + ISC_LOG_DEBUG(level), "%s", buf); +} + +void +log_error(const char *format, ...) +{ + char buf[MSG_BUFFER_SIZE]; + va_list args; + + va_start(args, format); + vsnprintf(buf, MSG_BUFFER_SIZE, format, args); + va_end(args); + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DYNDB, + ISC_LOG_ERROR, "%s", buf); +} + +void +log_unexpected_file_line(const char *file, unsigned int line, + isc_result_t result, const char *format, ...) +{ + char buf[MSG_BUFFER_SIZE]; + va_list args; + + va_start(args, format); + vsnprintf(buf, MSG_BUFFER_SIZE, format, args); + va_end(args); + + isc_error_unexpected(file, line, "%s: %s", buf, isc_result_totext(result)); +} @@ -0,0 +1,36 @@ +/* Authors: Martin Nagy <mnagy@redhat.com> + * + * Copyright (C) 2008 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _LD_LOG_H_ +#define _LD_LOG_H_ + +#define log_unexpected(result, ...) \ + log_unexpected_file_line(__FILE__, __LINE__, (result), __VA_ARGS__) + +/* + * Change these to use our string library. + */ + +/* Basic logging functions */ +void log_debug(int level, const char *format, ...); +void log_error(const char *format, ...); +void log_unexpected_file_line(const char *file, unsigned int line, + isc_result_t result, const char *format, ...); + +#endif /* !_LD_LOG_H_ */ diff --git a/semaphore.c b/semaphore.c new file mode 100644 index 0000000..1f43652 --- /dev/null +++ b/semaphore.c @@ -0,0 +1,107 @@ +/* Authors: Martin Nagy <mnagy@redhat.com> + * + * Copyright (C) 2008 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Note: This implementation doesn't prevent from starvation. This means that + * if a thread signals the semaphore and then waits for it, it may catch it's + * own signal. However, for our purposes, this shouldn't be needed. + */ + +#include <isc/condition.h> +#include <isc/result.h> +#include <isc/util.h> + +#include "semaphore.h" + +/* + * Initialize a semaphore. + * + * sem - allocated semaphore that will be initialized + * value - number of times we can acquire the semaphore. + */ +isc_result_t +semaphore_init(semaphore_t *sem, int value) +{ + isc_result_t result; + + REQUIRE(sem != NULL); + REQUIRE(value > 0); + + sem->value = value; + result = isc_mutex_init(&sem->mutex); + if (result != ISC_R_SUCCESS) + return result; + + result = isc_condition_init(&sem->cond); + if (result != ISC_R_SUCCESS) + isc_mutex_destroy(&sem->mutex); + + return result; +} + +/* + * Destroy a semaphore. + * + * sem - semaphore to be destroyed. + */ +void +semaphore_destroy(semaphore_t *sem) +{ + REQUIRE(sem != NULL); + + REQUIRE(isc_mutex_destroy(&sem->mutex) == ISC_R_SUCCESS); + REQUIRE(isc_condition_destroy(&sem->cond) == ISC_R_SUCCESS); +} + +/* + * Wait on semaphore. This operation will try to acquire a lock on the + * semaphore. If the semaphore is already acquired as many times at it allows, + * the function will block until someone releases the lock. + */ +void +semaphore_wait(semaphore_t *sem) +{ + REQUIRE(sem != NULL); + + LOCK(&sem->mutex); + + sem->value--; + if (sem->value < 0) + WAIT(&sem->cond, &sem->mutex); + + UNLOCK(&sem->mutex); +} + +/* + * Release the semaphore. This will make sure that another thread (probably + * already waiting) will be able to acquire the semaphore. + */ +void +semaphore_signal(semaphore_t *sem) +{ + REQUIRE(sem != NULL); + + LOCK(&sem->mutex); + + sem->value++; + if (sem->value >= 0) + SIGNAL(&sem->cond); + + UNLOCK(&sem->mutex); +} diff --git a/semaphore.h b/semaphore.h new file mode 100644 index 0000000..6c349e4 --- /dev/null +++ b/semaphore.h @@ -0,0 +1,45 @@ +/* Authors: Martin Nagy <mnagy@redhat.com> + * + * Copyright (C) 2008 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _LDAP_SEMAPHORE_H_ +#define _LDAP_SEMAPHORE_H_ + +#include <isc/condition.h> +#include <isc/mutex.h> + +/* + * Semaphore can be "acquired" multiple times. However, it has a maximum + * number of times someone can acquire him. If a semaphore is already acquired + * more times than allowed, it will block until other thread release its, + */ +struct semaphore { + int value; /* Maximum number of times you can LOCK()) */ + isc_mutex_t mutex; /* Mutex protecting this whole struct. */ + isc_condition_t cond; /* Condition used for waiting on release. */ +}; + +typedef struct semaphore semaphore_t; + +/* Public functions. */ +isc_result_t semaphore_init(semaphore_t *sem, int value); +void semaphore_destroy(semaphore_t *sem); +void semaphore_wait(semaphore_t *sem); +void semaphore_signal(semaphore_t *sem); + +#endif /* !_LDAP_SEMAPHORE_H_ */ |