1/*****************************************************************
2
3  File   :   configfile.ll
4  Author :   David Corcoran
5  Date   :   February 12, 1999 modified 7/28/99
6  Purpose:   Reads lexical config files and updates database.
7             See http://www.linuxnet.com for more information.
8  License:   Copyright (C) 1999 David Corcoran
9             <corcoran@linuxnet.com>
10
11******************************************************************/
12
13%{
14int evaluatetoken(char *pcToken);
15
16static int iLinenumber      = 1;
17static char *pcPrevious     = 0;
18static char *pcCurrent      = 0;
19static char *pcFriendlyname = 0;
20static char *pcDevicename   = 0;
21static char *pcLibpath      = 0;
22static char *pcChannelid    = 0;
23static int   badError       = 0;
24
25void tok_error(char *pcToken_error);
26
27%}
28
29%option nounput
30%option noyywrap
31
32%%
33
34#.*                                       {}
35"\n"                                      { iLinenumber++; }
36(\"[^"\n]*["\n])|(\'[^'\n]*['\n])         { (void)evaluatetoken(yytext); }
37[ \t]                                     {}
38([A-Z]|[a-z]|[0-9]|[\\\/\-\.\_\@])+       { (void)evaluatetoken(yytext); }
39.                                         { tok_error(yytext); }
40%%
41
42#include <stdio.h>
43#include <string.h>
44#include <wintypes.h>
45
46#include "pcsclite.h"
47#include "sys_generic.h"
48#include "readerfactory.h"
49#include "debuglog.h"
50
51int evaluatetoken(char *pcToken)
52{
53
54	DWORD dwChannelId = 0;
55	int p = 0;
56	int n = 0;
57
58	if (pcPrevious == NULL)
59	{	/* This is the key */
60		pcPrevious = strdup(pcToken);
61	}
62	else
63	{
64		pcCurrent = pcToken;
65		if (strcmp(pcPrevious, "FRIENDLYNAME") == 0)
66		{
67			if (pcFriendlyname == NULL)
68			{
69				pcFriendlyname = malloc(strlen(pcCurrent) - 1);
70				for (n = 0; n < strlen(pcCurrent); n++)
71				{
72					if (pcCurrent[n] != '"')
73					{	/* Strip off the quotes */
74						pcFriendlyname[p++] = pcCurrent[n];
75					}
76				}
77				pcFriendlyname[p++] = '\0';
78			}
79			else
80			{
81				tok_error(pcPrevious);
82				return 1;
83			}
84		}
85		else if (strcmp(pcPrevious, "DEVICENAME") == 0)
86		{
87			if (pcDevicename == NULL)
88			{
89				pcDevicename = strdup(pcCurrent);
90			}
91			else
92			{
93				tok_error(pcPrevious);
94				return 1;
95			}
96		}
97		else if (strcmp(pcPrevious, "LIBPATH") == 0)
98		{
99			if (pcLibpath == NULL)
100			{
101				pcLibpath = strdup(pcCurrent);
102			}
103			else
104			{
105				tok_error(pcPrevious);
106				return 1;
107			}
108		}
109		else if (strcmp(pcPrevious, "CHANNELID") == 0)
110		{
111			if (pcChannelid == NULL)
112				pcChannelid = strdup(pcCurrent);
113			else
114			{
115				tok_error(pcPrevious);
116				return 1;
117			}
118		}
119		else
120		{
121			tok_error(pcPrevious);
122			return 1;
123		}
124
125		free(pcPrevious);
126		pcPrevious = NULL;
127	}
128
129	if (pcFriendlyname != NULL && pcDevicename != NULL &&
130		pcLibpath != NULL && pcChannelid != NULL)
131	{
132
133		dwChannelId = strtoul(pcChannelid, 0, 16);
134		RFAddReader(pcFriendlyname, dwChannelId, pcLibpath, pcDevicename);
135
136		free(pcFriendlyname);
137		free(pcDevicename);
138		free(pcLibpath);
139		free(pcChannelid);
140		pcFriendlyname = NULL;
141		pcDevicename = NULL;
142		pcLibpath = NULL;
143		pcChannelid = NULL;
144	}
145
146	return 0;
147}
148
149void tok_error (char *token_error)
150{
151	Log2(PCSC_LOG_ERROR, "tok_error: invalid value in " PCSCLITE_READER_CONFIG ": %s", token_error);
152	badError = 1;
153}
154
155int DBUpdateReaders (const char *readerconf)
156{
157	FILE *configFile = NULL;
158
159	configFile = fopen(readerconf, "r");
160
161	if (configFile == NULL)
162		return 1;
163
164	yyin = configFile;
165
166	do
167	{
168		(void)yylex();
169	}
170	while (!feof(configFile));
171
172	(void)fclose(configFile);
173
174	if (badError == 1)
175		return -1;
176	else
177		return 0;
178} /* End of configfile.c */
179
180