[OPENSM] make formatting & whitespace use consistent in getopt_long_only().
[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         /* Does not start with a '-' we are done scanning */
207         return (EOF);
208     }
209   
210     /*termination of scanning */
211     if (!strcmp("--",argv[iArg])) {
212         return EOF;
213     }
214     
215     /* char option : -d 5 */
216     if ((argv[iArg][0] == '-') && (argv[iArg][1] != '-') ) {
217         optarg = get_char_option(optstring, argv, argc, iArg, &optind, &chOpt);
218         iArg = optind;
219         return chOpt;
220     }
221       
222     /* Look for this string in longopts */
223     strcpy(tmp_str,&(argv[iArg][2]));
224     
225     /*get the option */
226     tok = strtok(tmp_str,tokens);
227     
228     for (i = 0; longopts[i].name; i++) {
229         if (strcmp (tok, longopts[i].name) == 0) {
230             /* We have a match */             
231              if (longindex != NULL )
232                 *longindex = i;
233               
234              if (longopts[i].flag != NULL)
235                 *(longopts[i].flag) = longopts[i].val;
236               
237              if (longopts[i].has_arg != no_argument) {
238                 /*get the argument */
239                 if (strchr(argv[iArg],'=') != NULL) {
240                     optarg = strtok(NULL,tokens);
241                 }
242                 else { /* the next arg in cmd line is the param */ 
243                     tmp_arg = argv[iArg+1];
244                     if (!tmp_arg || *tmp_arg == '-') {
245                         /* no param is found */
246                         if ((longopts[i].has_arg == required_argument) && opterr) {
247                             fprintf (stderr,
248                                     "Option '--%s' requires an argument\n",tok);
249                             iArg++;
250                             optind++;
251                             break;
252                         }
253
254                     } else {
255                         optarg = tmp_arg;
256                         iArg++;
257                         optind++;
258                     }
259                 }
260                                      
261             } /* longopts */
262                                 
263             iArg++;
264             optind++;
265             if (longopts[i].flag == 0)
266                 return (longopts[i].val);
267             else
268                 return 0; 
269         } /* end if strcmp */
270     }
271     return ('?');
272 }
273  
274 /******************************************************************************/
275 static char* get_char_option(const char* optstring, char*const* argv, int argc, 
276                              int iArg, int* opt_ind, char* opt_p)   
277  {
278      char chOpt;
279      char* tmp_str;
280      char* prm = NULL;
281
282     chOpt = argv[iArg][1];
283     
284     /*non valid argument*/
285     if (!isalpha(chOpt))
286     {
287         chOpt = EOF; 
288         goto end;
289     }
290     tmp_str = strchr(optstring, chOpt);
291     
292     /*the argument wasn't found in optstring */
293     if (tmp_str == NULL){
294         chOpt = EOF; 
295         optopt = chOpt; 
296         goto end;
297     }
298         
299     /* don't need argument */
300     if (tmp_str[1] != ':' ) {
301         goto end; 
302     }
303
304      if (argv[iArg][2] != '\0')
305      {
306        // param is attached to option: -po8889
307         prm = &(argv[iArg][2]);
308         goto end;
309       }
310          
311       /* must look at next argv for param at the end of arg list */ 
312      if ((iArg)+1 == argc) {
313       /* no param will be found */
314         if (tmp_str[2]== ':' ) {
315             /* optional argument ::*/
316             goto end; 
317         }
318         else
319         {   
320             chOpt = EOF; 
321             goto end;
322         }
323       }
324
325       prm = &(argv[(iArg)+1][0]);
326       if (*prm == '-' )
327       {   
328          // next argv is a new option, so param
329          // not given for current option
330           if (tmp_str[2]== ':' ) {
331               /* optional argument ::*/
332               goto end; 
333           }
334           else
335           {
336               chOpt = EOF; 
337               goto end;
338           }
339       }
340       
341       // next argv is the param
342       (*opt_ind)++;
343  
344 end:
345     (*opt_ind)++;
346     *opt_p = chOpt;
347
348     return prm;
349 }
350
351 /* getimeofday() */
352 #include <..\..\..\etc\user\gtod.c>
353