Overview
| Comment: | More work on improving wrapper | 
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive | 
| Timelines: | family | ancestors | better-wrapping | 
| Files: | files | file ages | folders | 
| SHA1: | 3fdad997851d2257c862d949d78bb579 | 
| User & Date: | rkeene on 2018-06-29 18:58:27 | 
| Other Links: | branch diff | manifest | tags | 
Context
| 2018-06-29 | ||
| 18:58 | More work on improving wrapper Leaf check-in: 3fdad99785 user: rkeene tags: better-wrapping | |
| 2017-12-28 | ||
| 01:32 | More work on improving the wrapper check-in: 3b7b2eddb4 user: rkeene tags: better-wrapping | |
Changes
Modified build/libcackey_wrap.c.in from [98f3aad3ae] to [8cdc000c32].
| 1 2 3 4 5 | #define _GNU_SOURCE #include <dlfcn.h> #include "config.h" | | | | > > > > > > > > | > > > | | | | > > | > > | > | > > | | > | > > | > > > | | | > > > > > > > > > > > > > < < | | < < | < < < < < < | | | | < < < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 
#define _GNU_SOURCE
#include <dlfcn.h>
#include "config.h"
#include <string.h>
#include <stdio.h>
#include <time.h>
#define CK_PTR *
#define CK_DEFINE_FUNCTION(returnType, name) returnType name
#define CK_DECLARE_FUNCTION(returnType, name) returnType name
#define CK_DECLARE_FUNCTION_POINTER(returnType, name) returnType (* name)
#define CK_CALLBACK_FUNCTION(returnType, name) returnType (* name)
#ifndef NULL_PTR
#  define NULL_PTR 0
#endif
#include "./pkcs11/pkcs11.h"
#ifndef CACKEY_LIBRARY_FILE
#define CACKEY_LIBRARY_FILE "libcackey_g.so"
#endif
void abort(void);
void free(void *ptr);
static void *libcackey_wrap_handle = NULL_PTR;
typedef enum {
	LIBCACKEY_WRAP_MUTEX_UNINIT = 0,
	LIBCACKEY_WRAP_MUTEX_INIT,
	LIBCACKEY_WRAP_MUTEX_UNLOCKED,
	LIBCACKEY_WRAP_MUTEX_LOCKED,
} libcackey_wrap_mutexes_states_t;
static libcackey_wrap_mutexes_states_t libcackey_wrap_mutexes[16] = {LIBCACKEY_WRAP_MUTEX_UNINIT};
typedef libcackey_wrap_mutexes_states_t *pthread_mutex_t;
typedef int pthread_mutexattr_t;
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr) {
	libcackey_wrap_mutexes_states_t *mutex_;
	int idx;
	for (idx = 0; idx < (sizeof(libcackey_wrap_mutexes) / sizeof(libcackey_wrap_mutexes[0])); idx++) {
		if (libcackey_wrap_mutexes[idx] == LIBCACKEY_WRAP_MUTEX_UNINIT) {
			libcackey_wrap_mutexes[idx] = LIBCACKEY_WRAP_MUTEX_INIT;
			mutex_ = &libcackey_wrap_mutexes[idx];
			break;
		}
	}
	if (!mutex_) {
		return(1);
	}
	*mutex = mutex_;
	return(0);
}
int pthread_mutex_destroy(pthread_mutex_t *mutex) {
	**mutex = LIBCACKEY_WRAP_MUTEX_UNINIT;
	return(0);
}
int pthread_mutex_lock(pthread_mutex_t *mutex) {
	struct timespec sleeptime;
	while (**mutex == LIBCACKEY_WRAP_MUTEX_LOCKED) {
		sleeptime.tv_sec = 0;
		sleeptime.tv_nsec = 1000000;
		nanosleep(&sleeptime, NULL);
fprintf(stderr, "mutex %p is locked\n", mutex); fflush(stderr);
		/* Do nothing */
	}
fprintf(stderr, "locking mutex %p\n", mutex); fflush(stderr);
	**mutex = LIBCACKEY_WRAP_MUTEX_LOCKED;
fprintf(stderr, "locked mutex %p\n", mutex); fflush(stderr);
	return(CKR_OK);
}
int pthread_mutex_unlock(pthread_mutex_t *mutex) {
fprintf(stderr, "unlocking mutex %p\n", mutex); fflush(stderr);
	**mutex = LIBCACKEY_WRAP_MUTEX_UNLOCKED;
fprintf(stderr, "unlocked mutex %p\n", mutex); fflush(stderr);
	return(CKR_OK);
}
static void libcackey_wrap_init(void) {
	Dl_info libinfo;
	int dladdr_ret;
	char *library, *libraryDir, *libraryDirLastSlash;
	if (libcackey_wrap_handle) {
 | 
| ︙ | ︙ | |||
| 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 
		return;
	}
	*libraryDirLastSlash = '\0';
	asprintf(&library, "%s/" CACKEY_LIBRARY_FILE, libraryDir);
	libcackey_wrap_handle = dlmopen(LM_ID_NEWLM, library, RTLD_LOCAL | RTLD_NOW);
	if (!libcackey_wrap_handle) {
		fprintf(stderr, "Unable to load \"%s\": %s\n", library, dlerror());
		abort();
		return;
 | > | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | 
		return;
	}
	*libraryDirLastSlash = '\0';
	asprintf(&library, "%s/" CACKEY_LIBRARY_FILE, libraryDir);
	libcackey_wrap_handle = dlmopen(LM_ID_NEWLM, library, RTLD_LOCAL | RTLD_NOW);
	libcackey_wrap_handle = dlmopen(LM_ID_NEWLM, , RTLD_LOCAL | RTLD_NOW);
	if (!libcackey_wrap_handle) {
		fprintf(stderr, "Unable to load \"%s\": %s\n", library, dlerror());
		abort();
		return;
 | 
| ︙ | ︙ | 
Modified build/make-libcackey_wrap from [f1fa196b14] to [d43bff44b6].
| ︙ | ︙ | |||
| 37 38 39 40 41 42 43 | 
	echo ''
	echo "${line}"
	echo $'\t'"CK_RV (*func)($(echo "${args}" | tr $'\n' ',' | sed 's@,*$@@;s@,@, @g'));"
	case "${function}" in
		C_Finalize)
			echo $'\t''CK_RV retval;'
			;;
 | < < < < < < < < < < < < < < < < < < < | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | 
	echo ''
	echo "${line}"
	echo $'\t'"CK_RV (*func)($(echo "${args}" | tr $'\n' ',' | sed 's@,*$@@;s@,@, @g'));"
	case "${function}" in
		C_Finalize)
			echo $'\t''CK_RV retval;'
			;;
		C_GetFunctionList)
			echo $'\t''CK_RV retval;'
			echo $'\t''CK_FUNCTION_LIST_PTR pFunctionList;'
			;;
	esac
	echo ''
	echo $'\t''libcackey_wrap_init();'
	echo ''
	echo $'\t'"func = dlsym(libcackey_wrap_handle, \"${function}\");"
	echo ''
	if [ "${function}" = 'C_Finalize' ]; then
		echo $'\t'"retval = func($argNamesList);"
		echo ''
		echo $'\t''libcackey_wrap_fini();'
 | 
| ︙ | ︙ | 
Modified test.c from [b3c16cba8c] to [b9686fc1be].
| ︙ | ︙ | |||
| 553 554 555 556 557 558 559 | 
			if ((tokenInfo.flags & CKF_SO_PIN_TO_BE_CHANGED) == CKF_SO_PIN_TO_BE_CHANGED) {
				printf("CKF_SO_PIN_TO_BE_CHANGED ");
			}
			printf("\n");
		}
	}
 | | | | 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 | 
			if ((tokenInfo.flags & CKF_SO_PIN_TO_BE_CHANGED) == CKF_SO_PIN_TO_BE_CHANGED) {
				printf("CKF_SO_PIN_TO_BE_CHANGED ");
			}
			printf("\n");
		}
	}
	chk_rv = C_OpenSession(slots[1], CKF_SERIAL_SESSION, NULL, NULL, &hSession);
	if (chk_rv == CKR_OK) {
		chk_rv = C_GetTokenInfo(slots[1], &tokenInfo);
		if (chk_rv != CKR_OK) {
			return(1);
		}
		if ((tokenInfo.flags & CKF_LOGIN_REQUIRED) == CKF_LOGIN_REQUIRED && (tokenInfo.flags & CKF_PROTECTED_AUTHENTICATION_PATH) == 0) {
			fgets_ret = NULL;
 | 
| ︙ | ︙ |