Whitespace tidying.
[ppp.git] / pppd / plugins / radius / radiusclient / lib / util.c
1 /*
2  * $Id: util.c,v 1.2 2002/02/27 15:51:20 dfs Exp $
3  *
4  * Copyright (C) 1995,1996,1997 Lars Fenneberg
5  *
6  * Copyright 1992 Livingston Enterprises, Inc.
7  *
8  * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
9  * and Merit Network, Inc. All Rights Reserved
10  *
11  * See the file COPYRIGHT for the respective terms and conditions.
12  * If the file is missing contact me at lf@elemental.net
13  * and I'll send you a copy.
14  *
15  */
16
17 #include <config.h>
18 #include <includes.h>
19 #include <radiusclient.h>
20
21 /*
22  * Function: rc_str2tm
23  *
24  * Purpose: Turns printable string into correct tm struct entries.
25  *
26  */
27
28 static const char * months[] =
29                 {
30                         "Jan", "Feb", "Mar", "Apr", "May", "Jun",
31                         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
32                 };
33
34 void rc_str2tm (char *valstr, struct tm *tm)
35 {
36         int             i;
37
38         /* Get the month */
39         for (i = 0; i < 12; i++)
40         {
41                 if (strncmp (months[i], valstr, 3) == 0)
42                 {
43                         tm->tm_mon = i;
44                         i = 13;
45                 }
46         }
47
48         /* Get the Day */
49         tm->tm_mday = atoi (&valstr[4]);
50
51         /* Now the year */
52         tm->tm_year = atoi (&valstr[7]) - 1900;
53 }
54
55 /*
56  * Function: rc_getifname
57  *
58  * Purpose: get the network interface name associated with this tty
59  *
60  */
61
62 char *rc_getifname(char *tty)
63 {
64 #if defined(BSD4_4) || defined(linux)
65         static char     name[512];
66         int             fd;
67
68         if ((fd = open(tty, O_RDWR|O_NDELAY)) < 0) {
69                 rc_log(LOG_ERR, "rc_getifname: can't open %s: %s", tty, strerror(errno));
70                 return NULL;
71         }
72 #endif
73
74 #ifdef BSD4_4
75         strcpy(name,ttyname(fd));
76         if (strlen(name) < 1) {
77                 rc_log(LOG_ERR, "rc_getifname: can't get attached interface of %s: %s", tty, strerror(errno));
78                 close(fd);
79                 return NULL;
80         }
81 #elif linux
82         if (ioctl(fd, SIOCGIFNAME, name) < 0) {
83                 rc_log(LOG_ERR, "rc_getifname: can't ioctl %s: %s", tty, strerror(errno));
84                 close(fd);
85                 return NULL;
86         }
87 #else
88         return NULL;
89 #endif
90
91 #if defined(BSD4_4) || defined(linux)
92         close(fd);
93         return name;
94 #endif
95 }
96
97 /*
98  * Function: rc_getstr
99  *
100  * Purpose: Reads in a string from the user (with or witout echo)
101  *
102  */
103
104 char *rc_getstr (char *prompt, int do_echo)
105 {
106         int             in, out;
107         char           *p;
108         sigset_t        newset;
109         sigset_t        oldset;
110         struct termios  term_old, term_new;
111         static char     buf[GETSTR_LENGTH];
112         int             is_term, flags, old_flags;
113         char            c;
114         int             flushed = 0;
115
116         in = fileno(stdin);
117         out = fileno(stdout);
118
119         (void) sigemptyset (&newset);
120         (void) sigaddset (&newset, SIGINT);
121         (void) sigaddset (&newset, SIGTSTP);
122         (void) sigaddset (&newset, SIGQUIT);
123
124         (void) sigprocmask (SIG_BLOCK, &newset, &oldset);
125
126         if ((is_term = isatty(in)))
127         {
128
129                 (void) tcgetattr (in, &term_old);
130                 term_new = term_old;
131                 if (do_echo)
132                         term_new.c_lflag |= ECHO;
133                 else
134                         term_new.c_lflag &= ~ECHO;
135
136                 if (tcsetattr (in, TCSAFLUSH, &term_new) == 0)
137                         flushed = 1;
138
139         }
140         else
141         {
142                 is_term = 0;
143                 if ((flags = fcntl(in, F_GETFL, 0)) >= 0) {
144                         old_flags = flags;
145                         flags |= O_NONBLOCK;
146
147                         fcntl(in, F_SETFL, flags);
148
149                         while (read(in, &c, 1) > 0)
150                                 /* nothing */;
151
152                         fcntl(in, F_SETFL, old_flags);
153
154                         flushed = 1;
155                 }
156         }
157
158         write(out, prompt, strlen(prompt));
159
160         /* well, this looks ugly, but it handles the following end of line
161            markers: \r \r\0 \r\n \n \n\r, at least at a second pass */
162
163         p = buf;
164         for (;;)
165         {
166                 if (read(in, &c, 1) <= 0)
167                         return NULL;
168
169                 if (!flushed && ((c == '\0') || (c == '\r') || (c == '\n'))) {
170                         flushed = 1;
171                         continue;
172                 }
173
174                 if ((c == '\r') || (c == '\n'))
175                         break;
176
177                 flushed = 1;
178
179                 if (p < buf + GETSTR_LENGTH)
180                 {
181                         if (do_echo && !is_term)
182                                 write(out, &c, 1);
183                         *p++ = c;
184                 }
185         }
186
187         *p = '\0';
188
189         if (!do_echo || !is_term) write(out, "\r\n", 2);
190
191         if (is_term)
192                 tcsetattr (in, TCSAFLUSH, &term_old);
193         else {
194                 if ((flags = fcntl(in, F_GETFL, 0)) >= 0) {
195                         old_flags = flags;
196                         flags |= O_NONBLOCK;
197
198                         fcntl(in, F_SETFL, flags);
199
200                         while (read(in, &c, 1) > 0)
201                                 /* nothing */;
202
203                         fcntl(in, F_SETFL, old_flags);
204                 }
205         }
206
207         (void) sigprocmask (SIG_SETMASK, &oldset, NULL);
208
209         return (buf);
210 }
211
212 void rc_mdelay(int msecs)
213 {
214         struct timeval tv;
215
216         tv.tv_sec = (int) msecs / 1000;
217         tv.tv_usec = (msecs % 1000) * 1000;
218
219         select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL, &tv);
220 }
221
222 /*
223  * Function: rc_mksid
224  *
225  * Purpose: generate a quite unique string
226  *
227  * Remarks: not that unique at all...
228  *
229  */
230
231 char *
232 rc_mksid (void)
233 {
234   static char buf[14];
235   sprintf (buf, "%08lX%04X", (unsigned long int) time (NULL), (unsigned int) getpid ());
236   return buf;
237 }