|
|
1.1 root 1: /* hdial.c
2: Find a dialer in the HDB configuration files.
3:
4: Copyright (C) 1992 Ian Lance Taylor
5:
6: This file is part of the Taylor UUCP uuconf library.
7:
8: This library is free software; you can redistribute it and/or
9: modify it under the terms of the GNU Library General Public License
10: as published by the Free Software Foundation; either version 2 of
11: the License, or (at your option) any later version.
12:
13: This library is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: Library General Public License for more details.
17:
18: You should have received a copy of the GNU Library General Public
19: License along with this library; if not, write to the Free Software
20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22: The author of the program may be contacted at [email protected] or
23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
24: */
25:
26: #include "uucnfi.h"
27:
28: #if USE_RCS_ID
29: const char _uuconf_hdial_rcsid[] = "$Id: hdial.c,v 1.1 93/07/30 08:07:13 bin Exp Locker: bin $";
30: #endif
31:
32: #include <errno.h>
33: #include <ctype.h>
34:
35: /* Find a dialer in the HDB configuration files by name. */
36:
37: int
38: uuconf_hdb_dialer_info (pglobal, zname, qdialer)
39: pointer pglobal;
40: const char *zname;
41: struct uuconf_dialer *qdialer;
42: {
43: struct sglobal *qglobal = (struct sglobal *) pglobal;
44: char **pz;
45: char *zline;
46: size_t cline;
47: char **pzsplit;
48: size_t csplit;
49: int iret;
50:
51: zline = NULL;
52: cline = 0;
53: pzsplit = NULL;
54: csplit = 0;
55:
56: iret = UUCONF_NOT_FOUND;
57:
58: for (pz = qglobal->qprocess->pzhdb_dialers; *pz != NULL; pz++)
59: {
60: FILE *e;
61: int cchars;
62:
63: qglobal->ilineno = 0;
64:
65: e = fopen (*pz, "r");
66: if (e == NULL)
67: {
68: if (FNO_SUCH_FILE ())
69: continue;
70: qglobal->ierrno = errno;
71: iret = UUCONF_FOPEN_FAILED | UUCONF_ERROR_ERRNO;
72: break;
73: }
74:
75: while ((cchars = _uuconf_getline (qglobal, &zline, &cline, e)) > 0)
76: {
77: int ctoks;
78: pointer pblock;
79:
80: ++qglobal->ilineno;
81:
82: --cchars;
83: if (zline[cchars] == '\n')
84: zline[cchars] = '\0';
85: if (isspace (BUCHAR (zline[0])) || zline[0] == '#')
86: continue;
87:
88: ctoks = _uuconf_istrsplit (zline, '\0', &pzsplit, &csplit);
89: if (ctoks < 0)
90: {
91: qglobal->ierrno = errno;
92: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
93: break;
94: }
95:
96: if (ctoks < 1)
97: continue;
98:
99: if (strcmp (zname, pzsplit[0]) != 0)
100: continue;
101:
102: /* We found the dialer. */
103: pblock = uuconf_malloc_block ();
104: if (pblock == NULL)
105: {
106: qglobal->ierrno = errno;
107: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
108: break;
109: }
110: if (uuconf_add_block (pblock, zline) != 0)
111: {
112: qglobal->ierrno = errno;
113: uuconf_free_block (pblock);
114: iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
115: break;
116: }
117: zline = NULL;
118:
119: _uuconf_uclear_dialer (qdialer);
120: qdialer->uuconf_zname = pzsplit[0];
121: qdialer->uuconf_palloc = pblock;
122:
123: if (ctoks > 1)
124: {
125: /* The second field is characters to send instead of "="
126: and "-" in phone numbers. */
127: if (strcmp (pzsplit[1], "\"\"") == 0)
128: {
129: char *zsubs;
130: char bnext;
131:
132: zsubs = pzsplit[1];
133: bnext = *zsubs;
134: while (bnext != '\0')
135: {
136: if (bnext == '=')
137: qdialer->uuconf_zdialtone = zsubs + 1;
138: else if (bnext == '-')
139: qdialer->uuconf_zpause = zsubs + 1;
140: if (zsubs[1] == '\0')
141: break;
142: zsubs += 2;
143: bnext = *zsubs;
144: *zsubs = '\0';
145: }
146: }
147:
148: /* Any remaining fields form a chat script. */
149: if (ctoks > 2)
150: {
151: pzsplit[1] = (char *) "chat";
152: iret = _uuconf_ichat_cmd (qglobal, ctoks - 1,
153: pzsplit + 1,
154: &qdialer->uuconf_schat,
155: pblock);
156: iret &=~ UUCONF_CMDTABRET_KEEP;
157: if (iret != UUCONF_SUCCESS)
158: {
159: uuconf_free_block (pblock);
160: break;
161: }
162: }
163: }
164:
165: iret = UUCONF_SUCCESS;
166: break;
167: }
168:
169: (void) fclose (e);
170:
171: if (iret != UUCONF_NOT_FOUND)
172: break;
173: }
174:
175: if (zline != NULL)
176: free ((pointer) zline);
177: if (pzsplit != NULL)
178: free ((pointer) pzsplit);
179:
180: if (iret != UUCONF_SUCCESS && iret != UUCONF_NOT_FOUND)
181: {
182: qglobal->zfilename = *pz;
183: iret |= UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO;
184: }
185:
186: return iret;
187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.