1 /*
2 * utils.c: various utility functions
3 *
4 * Copyright(c) 1997-2000 - All Rights Reserved
5 *
6 * See the COPYRIGHT file.
7 */
8
9 #ifndef lint
10 static char rcsid[] = "@(#)$Id: utils.c,v 1.14 2000/07/31 22:37:23 kalt Exp $";
11 #endif
12
13 #include "os.h"
14
15 /* match: some lame version
16 * returns 0 if no match.
17 */
18 int
rmatch(pattern,string)19 rmatch (pattern, string)
20 char *pattern, *string;
21 {
22 int ret;
23 char Ustring[1024];
24
25 Ustring[1023] = '\0';
26 strncpy(Ustring, string, 1024);
27 assert( Ustring[1023] == '\0' );
28
29 for(ret = 0; Ustring[ret] = toupper(string[ret]); ret++);
30
31 ret = 0; string = Ustring;
32 while (*pattern || *string)
33 {
34 if ((*pattern == '?') || (toupper(*pattern) == *string))
35 {
36 pattern++;
37 string++;
38 }
39 else if (*pattern=='*')
40 {
41 while ((*++pattern=='*') || (*pattern=='?'))
42 if (*pattern=='?')
43 string++;
44 if (!*pattern)
45 return (1);
46 while (string = (char*) index(string, toupper(*pattern)))
47 {
48 ret += rmatch(pattern+1,string+1);
49 string++;
50 }
51 return ret;
52 }
53 else
54 return 0;
55 }
56 if (*pattern || *string)
57 return (0);
58 else
59 return (1);
60 }
61
62 char *
my_cftime(s,len,format,tv)63 my_cftime(s, len, format, tv)
64 char *s, *format;
65 int len;
66 time_t tv;
67 {
68 struct tm *stm;
69
70 stm = localtime(&tv);
71 #if HAVE_STRFTIME
72 if (strftime(s, len, format, stm) == 0)
73 s[len-1] = '\0';
74 #else
75 s[0] = '\0';
76 if (*format)
77 {
78 strncpy(s, "<notime>", len);
79 s[len-1] = '\0';
80 }
81 #endif
82 return s;
83 }
84
85 char *
my_strftime(s,len,format)86 my_strftime(s, len, format)
87 char *s, *format;
88 int len;
89 {
90 time_t now;
91
92 now = time(NULL);
93 return my_cftime(s, len, format, now);
94 }
95
96 /* sic_tdiff: returns an alphanumeric representation of diff seconds.
97 * force can be used to control the format.
98 */
99 char *
sic_tdiff(diff,force)100 sic_tdiff(diff, force)
101 time_t diff;
102 char force;
103 {
104 static char result[10][16];
105 static int i = -1;
106 unsigned int j, h, m, s;
107
108 if (i++ == 9)
109 i = 0;
110 j = diff / 86400;
111 h = (diff - 86400*j) / 3600;
112 m = (diff - 86400*j - 3600*h) / 60;
113 s = diff - 86400*j - 3600*h - 60*m;
114 if (j || (force == 3))
115 sprintf (result[i], "%ud%2.2u:%2.2u", j, h, m);
116 else
117 if (h || (force == 2))
118 sprintf (result[i], "%2.2u:%2.2u", h, m);
119 else
120 if (!force && m)
121 sprintf (result[i], "%2.2u.%2.2u", m, s);
122 else
123 if (m || (force == 1))
124 sprintf (result[i], "%2.2um", m);
125 else
126 sprintf (result[i], "%2.2us", s);
127 return result[i];
128 }
129
130 #if !defined(HAVE_STRERROR)
131
132 # if !defined(SYS_ERRLIST_DECLARED)
133 extern char *sys_errlist[];
134 # endif
135
136 # if !defined(SYS_NERR_DECLARED)
137 extern int sys_nerr;
138 # endif
139
140 char *
strerror(err_no)141 strerror(err_no)
142 int err_no;
143 {
144 static char buff[40];
145 char *errp;
146
147 errp = (err_no > sys_nerr ? (char *)NULL : sys_errlist[err_no]);
148
149 if (errp == (char *)NULL)
150 {
151 errp = buff;
152 sprintf(errp, "Unknown Error %d", err_no);
153 }
154 return errp;
155 }
156 #endif
157
158 #if defined(HAVE_GETADDRINFO)
159 /* aitoip: return the IP address (string) contained in the addrinfo struct */
160 char *
aitoip(addr)161 aitoip(addr)
162 struct addrinfo *addr;
163 {
164 char tmp[512];
165
166 assert(addr->ai_family == AF_INET || addr->ai_family == AF_INET6);
167
168 if (inet_ntop(addr->ai_family, (addr->ai_family == AF_INET) ?
169 &((struct sockaddr_in *)addr->ai_addr)->sin_addr :
170 &((struct sockaddr_in6 *)addr->ai_addr)->sin6_addr,
171 tmp, 512) == NULL)
172 abort();
173
174 return strdup(tmp);
175 }
176 #endif
177