aboutsummaryrefslogtreecommitdiffstats
path: root/src/bankd/internal.h
blob: cc93319f7ec025bfd4ce94d272b51b822181ed5c (plain)
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
#pragma once

#include <osmocom/core/linuxlist.h>

struct card_reader_slot;

struct card_reader_driver_ops {
	/* probe system for card readers */
	void (*probe)(void *ctx);
	/* open a given slot, attempt to reset/start the card */
	int (*open_slot)(struct card_reader_slot *slot);
	/* close a given slot, power down the card */
	void (*close_slot)(struct card_reader_slot *slot);
	/* transceive an APDU */
	int (*transceive_apdu)(struct card_reader_slot *slot);
};

struct card_reader_driver {
	/* global list of drivers */
	struct llist_head list;
	/* name of the driver */
	char *name;
	const struct card_reader_driver_ops *ops;
};

struct card_reader {
	/* global list of card readers */
	struct llist_head list;
	/* name of this reader */
	char *name;
	/* driver providing access to this reader */
	const struct card_reader_driver *drv;
	void *drv_handle;
	/* list of card slots for this reader */
	struct llist_head slots;
};

enum card_slot_state {
	CARD_SLOT_OFF,
	CARD_SLOT_OPEN,
};

struct card_reader_slot {
	/* links to card_reader.slots */
	struct llist_head list;
	/* back-pointer to reader serving this slot */
	struct card_reader *reader;
	/* slot number */
	unsigned int num;
	/* state in which the slot is */
	enum card_slot_state state;
};


struct card_reader *card_reader_alloc(void *ctx, const char *name,
					const struct card_reader_driver *drv, void *drv_handle);
struct card_reader_slot *card_reader_slot_alloc(struct card_reader *cr, unsigned int slot_num);

void card_reader_driver_register(struct card_reader_driver *drv);
void card_readers_probe(void *ctx);