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