aboutsummaryrefslogblamecommitdiffstats
path: root/erts/etc/win32/erlsrv/erlsrv_util.c
blob: 4b1ba071e87e32ff6c2be5408347455d43744474 (plain) (tree)


























                                                                         

                                 
 
                                
              
                                                   
 
                                                   
           

                                                           


                              
                              
              
                                                   
 
                                                   
           

                                                       


                              
                             
              
                                                   
 
                                                   
           

                                                            



                              


                                                           




                 

                              
          
                                                     



                        

                                      


             


                                   

                      
                                                     

                                          
                                                      
        

                                                      






                                                 



                                  



          
                         
         
                         





                           
                             





                                   


                                   



                                  
                               
                                   
                                          
                  

                                        
          
                                           

                                  
                          
                   
                           
     
                 



               
/*
 * %CopyrightBegin%
 * 
 * Copyright Ericsson AB 1998-2009. All Rights Reserved.
 * 
 * The contents of this file are subject to the Erlang Public License,
 * Version 1.1, (the "License"); you may not use this file except in
 * compliance with the License. You should have received a copy of the
 * Erlang Public License along with this software. If not, it can be
 * retrieved online at http://www.erlang.org/.
 * 
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 * 
 * %CopyrightEnd%
 */
#include <windows.h>
#include <winsvc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "erlsrv_global.h"
#include "erlsrv_util.h"
#include "erlsrv_logmess.h"

wchar_t *service_name = L"";
wchar_t *real_service_name = L"";

void log_warning(wchar_t *mess){
  HANDLE logh;
  wchar_t *strings[] = {service_name, mess , NULL};

  if(!(logh = RegisterEventSourceW(NULL,APP_NAME)))
    return;
  ReportEventW(logh, EVENTLOG_WARNING_TYPE, 0, MSG_WARNING,
	       NULL, 2, 0, strings, NULL);
  DeregisterEventSource(logh);
}

void log_error(wchar_t *mess){
  HANDLE logh;
  wchar_t *strings[] = {service_name, mess , NULL};

  if(!(logh = RegisterEventSourceW(NULL,APP_NAME)))
    return;
  ReportEventW(logh, EVENTLOG_ERROR_TYPE, 0, MSG_ERROR,
	       NULL, 2, 0, strings, NULL);
  DeregisterEventSource(logh);
}

void log_info(wchar_t *mess){
  HANDLE logh;
  wchar_t *strings[] = {service_name, mess , NULL};

  if(!(logh = RegisterEventSourceW(NULL,APP_NAME)))
    return;
  ReportEventW(logh, EVENTLOG_INFORMATION_TYPE, 0, MSG_INFO,
	       NULL, 2, 0, strings, NULL);
  DeregisterEventSource(logh);
}

#ifndef NDEBUG
void log_debug(wchar_t *mess){
  wchar_t *buff=malloc((wcslen(mess)+100)*sizeof(wchar_t));
  swprintf(buff,wcslen(mess)+100,L"DEBUG! %s",mess);
  log_info(buff);
  free(buff);
}
#endif

wchar_t *envdup(wchar_t *env){
  wchar_t *tmp;
  int len;
  for(tmp = env; *tmp != L'\0'; tmp += wcslen(tmp)+1)
    ;
  len = (tmp - env) + 1;
  if(len == 1)
    ++len;
  tmp = malloc(len*sizeof(wchar_t));
  memcpy(tmp,env,len*sizeof(wchar_t));
  return tmp;
}

wchar_t **env_to_arg(wchar_t *env){
  wchar_t **ret;
  wchar_t *tmp;
  int i;
  int num_strings = 0;
  for(tmp = env; *tmp != L'\0'; tmp += wcslen(tmp)+1)
    ++num_strings;
  /* malloc enough to insert ONE string */
  ret = malloc(sizeof(wchar_t *) * (num_strings + 2));
  i = 0;
  for(tmp = env; *tmp != L'\0'; tmp += wcslen(tmp)+1){
    ret[i++] = wcsdup(tmp);
  }
  ret[i] = NULL;
  free(env);
  return ret;
}

static int compare(const void *a, const void *b){
  wchar_t *s1 = *((wchar_t **) a);
  wchar_t *s2 = *((wchar_t **) b);
  wchar_t *e1 = wcschr(s1,L'=');
  wchar_t *e2 = wcschr(s2,L'=');
  int ret;
  int len;
  
  if(!e1)
    e1 = s1 + wcslen(s1);
  if(!e2)
    e2 = s2 + wcslen(s2);
  
  if((e1 - s1) > (e2 - s2))
    len = (e2 - s2);
  else
    len = (e1 - s1);
  
  ret = _wcsnicmp(s1,s2,len);
  if(ret == 0)
    return ((e1 - s1) - (e2 - s2));
  else
    return ret;
}

wchar_t *arg_to_env(wchar_t **arg){
  wchar_t *block;
  wchar_t *pek;
  int i;
  int totlen = 1; /* extra '\0' */

  for(i=0;arg[i] != NULL;++i)
    totlen += wcslen(arg[i])+1;
  /* sort the environment vector */
  qsort(arg,i,sizeof(wchar_t *),&compare);
  if(totlen == 1){
      block = malloc(2*sizeof(wchar_t));
    block[0] = block[1] = L'\0'; 
  } else {
    block = malloc(totlen*sizeof(wchar_t));
    pek = block;
    for(i=0; arg[i] != NULL; ++i){
      wcscpy(pek, arg[i]);
      free(arg[i]);
      pek += wcslen(pek)+1;
    }
    *pek = L'\0';
  }
  free(arg);
  return block;
}