File: manager.c

package info (click to toggle)
openct 0.6.20-1.2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 3,672 kB
  • sloc: ansic: 21,876; sh: 10,560; makefile: 272
file content (98 lines) | stat: -rw-r--r-- 1,623 bytes parent folder | download | duplicates (3)
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
/*
 * IFD manager
 *
 * Copyright (C) 2003, Olaf Kirch <okir@suse.de>
 */

#include "internal.h"
#include <string.h>
#include <stdlib.h>

static ifd_reader_t *ifd_readers[OPENCT_MAX_READERS];
static unsigned int ifd_reader_handle = 1;

/*
 * Return number of readers available
 */
int ifd_reader_count(void)
{
	return OPENCT_MAX_READERS;
}

/*
 * Register a reader
 */
int ifd_attach(ifd_reader_t * reader)
{
	unsigned int slot;

	if (!reader)
		return -1;
	if (reader->num)
		return 0;

	for (slot = 0; slot < OPENCT_MAX_READERS; slot++) {
		if (!ifd_readers[slot])
			break;
	}

	if (slot >= OPENCT_MAX_READERS) {
		ct_error("Too many readers");
		return -1;
	}

	reader->handle = ifd_reader_handle++;
	reader->num = slot;
	ifd_readers[slot] = reader;

	return 0;
}

/*
 * Functions to look up registered readers
 */
ifd_reader_t *ifd_reader_by_handle(unsigned int handle)
{
	ifd_reader_t *reader;
	unsigned int i;

	for (i = 0; i < OPENCT_MAX_READERS; i++) {
		if ((reader = ifd_readers[i])
		    && reader->handle == handle)
			return reader;
	}
	return NULL;
}

ifd_reader_t *ifd_reader_by_index(unsigned int idx)
{
	ifd_reader_t *reader;

	if (idx >= OPENCT_MAX_READERS) {
		ct_error("ifd_reader_by_index: invalid index %u", idx);
		return NULL;
	}
	if (!(reader = ifd_readers[idx]))
		return NULL;

	return reader;
}

/*
 * Unregister a reader
 */
void ifd_detach(ifd_reader_t * reader)
{
	unsigned int slot;

	if (reader->num == 0)
		return;

	if ((slot = reader->num) >= OPENCT_MAX_READERS
	    || ifd_readers[slot] != reader) {
		ct_error("ifd_detach: unknown reader");
		return;
	}

	ifd_readers[slot] = NULL;
}