/* * %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 #include #include #include #include #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; }