c04633629848cec396416f8a07b16c79a61511a4
[mirror/winof/.git] / ulp / opensm / user / libvendor / winosm_common.c
1
2 #include <vendor/winosm_common.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <io.h>
6 #include <complib/cl_memory.h>
7 #include <opensm/osm_base.h>
8
9 #include <..\..\..\..\etc\user\inet.c>
10
11 #define OSM_MAX_LOG_NAME_SIZE 512
12
13 static char *syslog_fname;
14 static FILE *syslog_file;
15 static char *syslog_id;
16
17 void openlog(char *ident, int option, int facility)
18 {
19         if (!syslog_fname)
20                 syslog_fname = strdup_expand(OSM_DEFAULT_TMP_DIR "osm.syslog"); 
21
22         if (!syslog_file) {
23                 syslog_file = fopen(syslog_fname,"w");
24                 if (syslog_file)
25                         syslog_id = strdup(ident);
26         }
27 }
28
29 void closelog(void)
30 {
31         if (syslog_file) {
32                 fprintf(syslog_file, "\n[%s] Closing syslog\n",syslog_id);
33                 fflush(syslog_file);
34                 fclose(syslog_file);
35                 syslog_file = NULL;
36                 if (syslog_id) {
37                         free((void*)syslog_id);
38                         syslog_id = NULL;
39                 }
40                 if (syslog_fname) {
41                         free((void*)syslog_fname);
42                         syslog_fname = NULL;
43                 }
44         }
45 }
46
47 /* output to user-mode DebugView monitor if running */
48  
49 void syslog(int prio, char *fmt, ... )
50 {
51         char Buffer[1024];
52         SYSTEMTIME st;
53         uint32_t pid = GetCurrentThreadId();
54         va_list args;
55
56         va_start(args,fmt);
57         _vsnprintf(Buffer, 1024, (LPSTR)fmt, args); 
58         va_end(args);
59
60         if (!syslog_file) {
61                 OutputDebugStringA(Buffer);
62                 return;
63         }
64
65         GetLocalTime(&st);
66         fprintf(syslog_file, "[%s][%02d:%02d:%02d:%03d][%04X] %s", syslog_id,
67                 st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, pid,
68                 Buffer);
69         fflush(syslog_file);
70 }
71
72
73 #if 0
74 /* Mellanox specific WinIB_HOME env var override of %TEMP% from previous
75  * openSM port; Not currently utilized pending feedback.
76  */
77
78 char*
79 GetOsmTempPath(void)
80 {
81         char* temp_path;
82         int length;
83
84         temp_path = (char*)cl_malloc(OSM_MAX_LOG_NAME_SIZE);
85         if (!temp_path)
86                 return temp_path;
87
88         length = GetTempPath(OSM_MAX_LOG_NAME_SIZE,temp_path);
89         if (length > OSM_MAX_LOG_NAME_SIZE)
90         {
91                 cl_free(temp_path);
92                 temp_path = (char*)cl_malloc(length+1);
93                 GetTempPath(length+1,temp_path);
94         }
95         return  temp_path;
96 }
97
98 char*
99 GetOsmCachePath(void)
100 {
101    char* cache_path;
102    char* tmp_file_name;
103    char* winib_home, tmp;
104    HANDLE hFile;
105
106    winib_home = getenv("WinIB_HOME");
107    if (winib_home == NULL)
108    {
109      /* The WinIB_HOME variable isn't defined. Use the 
110         default temp path */
111      return GetOsmTempPath();
112    }
113    cache_path = (char*)cl_malloc(OSM_MAX_LOG_NAME_SIZE);
114    strcpy(cache_path, winib_home);
115
116    strcat(cache_path, "\\etc\\");
117    tmp_file_name = (char*)cl_malloc(OSM_MAX_LOG_NAME_SIZE);
118    strcpy(tmp_file_name, cache_path);
119    strcat(tmp_file_name, "opensm.opts");
120    hFile = CreateFile(tmp_file_name,
121                       GENERIC_READ,
122                       0,
123                       NULL,
124                       OPEN_EXISTING,
125                       FILE_ATTRIBUTE_NORMAL,
126                       NULL);
127    if (hFile == INVALID_HANDLE_VALUE) 
128    { 
129      cl_free(cache_path);
130      return GetOsmTempPath();
131    }
132    /* Such file exists. This means the directory is usable */
133    CloseHandle(hFile);
134
135    return cache_path;
136 }
137 #endif
138
139
140 /*
141  * Like _strdup() with Environment varible expansion.
142  * Example: str '%windir%\temp\osm.log' --> 'C:\windows\temp\osm.log'
143  * Multiple Env vars are supported.
144  */
145
146 char *strdup_expand(const char *base)
147 {
148         char *str,*p,*s,*es,*xs,*rc,*n;
149         char p_env[80];
150
151         str = _strdup(base);
152
153         while( (s = strchr(str,'%')) )
154         {
155                 p = strchr((++s),'%');
156                 if (!p)
157                         return str;
158
159                 memcpy(p_env,s,p-s);
160                 p_env[p-s] = '\0';
161                 
162                 es = getenv(p_env);
163                 if (!es)
164                         return str;
165
166                 xs = (char*)malloc(strlen(str)+strlen(es));
167                 for(rc=str,n=xs; rc < (s-1);rc++) *n++ = *rc; 
168                 *n='\0';
169                 strcat(n,es);
170                 strcat(n,(p+1));
171                 free(str);
172                 str = xs;
173         }
174         return str;
175 }
176
177
178 /****************************************************************************/
179
180 int optind=1;
181 int opterr=1;
182 int optopt='?';
183 char *optarg;
184
185 static int iArg=1;
186
187 int getopt_long_only(int argc, char *const*argv, const char *optstring,
188                         const struct option *longopts, int *longindex)
189 {
190   char chOpt;
191   char tmp_str[256];
192   char* tmp_arg = NULL;
193   char* tok=NULL;
194   int i;
195   char tokens[2] = {'='};
196
197     if (optind == 0) {
198         optind = iArg = opterr = 1;
199         optopt='?';
200     }
201
202     if (iArg == argc)
203         return (EOF);
204
205     if (argv[iArg][0] != '-')
206     {
207         /* Does not start with a '-' we are done scanning */
208         return (EOF);
209     }
210   
211     /*termination of scanning */
212     if (!strcmp("--",argv[iArg])) {
213         return EOF;
214     }
215     
216   
217     /* char option : -d 5 */
218     if ((argv[iArg][0] == '-') && (argv[iArg][1] != '-') ) {
219         optarg = get_char_option(optstring, argv, argc, iArg, &optind, &chOpt);
220         iArg = optind;
221         return chOpt;
222     }
223       
224     /* Look for this string in longopts */
225     strcpy(tmp_str,&(argv[iArg][2]));
226     
227     /*get the option */
228     tok = strtok(tmp_str,tokens);
229     
230     for (i = 0; longopts[i].name; i++)
231         {
232         if (strcmp (tok, longopts[i].name) == 0)
233                 {
234             /* We have a match */             
235              if (longindex != NULL )
236                 *longindex = i;
237               
238                 if (longopts[i].flag != NULL) {
239                  *(longopts[i].flag) = longopts[i].val;
240                 }
241               
242                 
243                 
244                 if (longopts[i].has_arg != no_argument) 
245                   {
246                     /*get the argument */
247                     
248                     if (strchr(argv[iArg],'=') != NULL)
249                     {
250                         optarg = strtok(NULL,tokens);
251                     }else { /*the next arg in cmd line is the param */ 
252                         tmp_arg = argv[iArg+1];
253                         if (*tmp_arg == '-') {
254                         
255                             /*no param is found */
256                             chOpt = '?';
257                             if ((longopts[i].has_arg == required_argument) && opterr)
258                            {
259                              fprintf (stderr,
260                                     "Option '--%s' requires an argument\n",tok);
261                              iArg++;
262                              optind++;
263                              break;
264                            }
265
266                         }else 
267                         {
268                             optarg = tmp_arg;
269                             iArg++;
270                             optind++;
271                         }
272                     }
273                                      
274                  }/*longopts */
275                                 
276                 iArg++;
277                 optind++;
278                 if (longopts[i].flag == 0)
279                     return (longopts[i].val);
280                 else return 0; 
281                
282             }/*end if strcmp */
283             }
284
285   return ('?');
286 }
287  
288 /******************************************************************************/
289 static char* get_char_option(const char* optstring, char*const* argv, int argc, 
290                              int iArg, int* opt_ind, char* opt_p)   
291  {
292      char chOpt;
293      char* tmp_str;
294      char* prm = NULL;
295
296     chOpt = argv[iArg][1];
297     
298     /*non valid argument*/
299     if (!isalpha(chOpt))
300     {
301         chOpt = EOF; 
302         goto end;
303     }
304     tmp_str = strchr(optstring, chOpt);
305     
306     /*the argument wasn't found in optstring */
307     if (tmp_str == NULL){
308         chOpt = EOF; 
309         optopt = chOpt; 
310         goto end;
311     }
312         
313     /* don't need argument */
314     if (tmp_str[1] != ':' ) {
315         goto end; 
316     }
317
318      if (argv[iArg][2] != '\0')
319      {
320        // param is attached to option: -po8889
321         prm = &(argv[iArg][2]);
322         goto end;
323       }
324          
325       /* must look at next argv for param at the end of arg list */ 
326      if ((iArg)+1 == argc) {
327       /* no param will be found */
328         if (tmp_str[2]== ':' ) {
329             /* optional argument ::*/
330             goto end; 
331         }
332         else
333         {   
334             chOpt = EOF; 
335             goto end;
336         }
337       }
338
339       prm = &(argv[(iArg)+1][0]);
340       if (*prm == '-' )
341       {   
342          // next argv is a new option, so param
343          // not given for current option
344           if (tmp_str[2]== ':' ) {
345               /* optional argument ::*/
346               goto end; 
347           }
348           else
349           {
350               chOpt = EOF; 
351               goto end;
352           }
353       }
354       
355       // next argv is the param
356       (*opt_ind)++;
357  
358 end:
359     (*opt_ind)++;
360     *opt_p = chOpt;
361
362     return prm;
363 }
364
365 /* getimeofday() */
366 #include <..\..\..\etc\user\gtod.c>
367