ut_fileOut ut_fileOutNew( const os_char *name, const os_char *mode) { ut_fileOut stream; os_char *fname; os_char * filename; stream = os_malloc((size_t)OS_SIZEOF(ut_fileOut)); if (ut_outputdir) { fname = os_malloc(strlen(ut_outputdir) + strlen(os_fileSep()) + strlen(name) + 1); os_sprintf(fname, "%s%s%s", ut_outputdir, os_fileSep(), name); } else { fname = os_strdup(name); } filename = os_fileNormalize(fname); stream->file = fopen(filename, mode); os_free(fname); os_free(filename); if (stream->file == NULL) { os_free(stream); stream = NULL; } return stream; }
int ut_traceInitialize( char *outputPathName) { int result; if (strcmp(outputPathName, STDERR_STR) == 0) { stream = stderr; result = 0; } else { if (strcmp(outputPathName, STDOUT_STR) == 0) { stream = stdout; result = 0; } else { char * filename = os_fileNormalize(outputPathName); stream = fopen(filename, "w"); os_free(filename); if (stream) { result = 0; } else { result = 1; } } } return result; }
/** * Return either a log file path string or a pseudo file name/path value * like <stdout> or <stderr>. * The result of os_report_file_path must be freed with os_free * @param override_variable An environment variable name that may hold a filename * or pseudo filename. If this var is set, and is not a pseudo filename, * the value of this var will be added to the value of env variable * OSPL_LOGPATH (if set or './' if not) to create the log file path. * @param default_file If override_variable is not defined in the environment * this is the filename used. */ static char * os_report_file_path(char * default_file, char * override_variable) { char *file_dir; char file_path[2048]; char host[256]; char server_file[256]; unsigned short port; int len; char *file_name = NULL; file_dir = os_getenv(os_env_logdir); if (! os_createLogDir(file_dir)) { file_dir = (os_char *)os_default_logdir; } if (override_variable != NULL) { file_name = os_getenv(override_variable); #if defined VXWORKS_RTP { /** &todo dds3335/dds3299 Allow substitution of %s for the process name */ char *ptok; char *splice_procname; if ( file_name != NULL && ((ptok = os_index( file_name, '%' ) ) != NULL) && ptok[1] == 's' && ( splice_procname = os_getenv( os_env_procname ) ) != NULL ) { char * new_name = os_malloc( strlen( file_name ) + strlen( splice_procname ) -1 ); sprintf( new_name, file_name, splice_procname ); if (sscanf (new_name, "%255[^:]:%hu", host, &port) != 2 && sscanf (new_name, "%255[^:]:%hu:%255[^:]", host, &port, server_file) != 3) { len = snprintf(file_path, sizeof(file_path), "%s/%s", file_dir, new_name); /* Note bug in glibc < 2.0.6 returns -1 for output truncated */ if ( len < (int)sizeof(file_path) && len > -1 ) { os_free( new_name ); return os_fileNormalize(file_path); } else { return( new_name ); } } else { return( new_name ); } } } #endif } if (file_name == NULL) { file_name = default_file; } if (strcmp(file_name, "<stderr>") != 0 && strcmp(file_name, "<stdout>") != 0) { if (sscanf (file_name, "%255[^:]:%hu", host, &port) != 2 && sscanf (file_name, "%255[^:]:%hu:%255[^:]", host, &port, server_file) != 3) { len = snprintf(file_path, sizeof(file_path), "%s/%s", file_dir, file_name); /* Note bug in glibc < 2.0.6 returns -1 for output truncated */ if ( len < (int)sizeof(file_path) && len > -1 ) { return os_fileNormalize(file_path); } } } return os_strdup (file_name); }
static FILE * os_open_file (char * file_name) { FILE *logfile=NULL; char host[256]; unsigned short port; os_char *dir, *file, *fmt, *str; os_int ret; os_size_t len; os_result res = os_resultSuccess; #ifdef VXWORKS_RTP os_char serverfile[256]; os_char *proc; os_char *ptr; #endif /* OSPL-4002: Only OSPL_INFOFILE and OSPL_ERRORFILE can specify a host:port combination. Since OSPL_LOGPATH and OSPL_INFOFILE/ OSPL_ERRORFILE are concatenated we need to strip the prefix from file_name and then check if we should enter tcp mode. This is considered a temporary workaround and will be removed once the work specified in ticket OSPL-4091 is done */ if (strcmp (file_name, "<stdout>") == 0) { logfile = stdout; } else if (strcmp (file_name, "<stderr>") == 0) { logfile = stderr; } else { dir = os_getenv (os_env_logdir); if (dir == NULL) { dir = (os_char *)os_default_logdir; } len = strlen (dir) + 2; /* '/' + '\0' */ str = os_malloc (len); if (str != NULL) { (void)snprintf (str, len, "%s/", dir); dir = os_fileNormalize (str); os_free (str); if (dir == NULL) { res = os_resultFail; } } else { dir = NULL; res = os_resultFail; } if (res != os_resultFail) { file = file_name; len = strlen (dir); if (strncmp (dir, file_name, len) == 0) { file = file_name + len; } os_free (dir); #ifdef VXWORKS_RTP /* FIXME: It isn't pretty, but we must remain bug compatible! */ str = NULL; ptr = os_index (file, '%'); if (ptr != NULL && *ptr == 's') { proc = os_getenv (os_env_procname); if (proc != NULL) { len = (strlen (file)-1) + strlen (proc); /* -"%s" +'\0' */ str = os_malloc (len); if (str != NULL) { (void)snprintf (str, len, file, proc); file = str; } else { res = os_resultFail; } } } if (res == os_resultSuccess) { fmt = "%255[^:]:%hu:%255[^:]"; ret = sscanf (file, fmt, host, &port, serverfile); if (ret != 3) { fmt = "%255[^:]:%hu"; ret = sscanf (file, fmt, host, &port); } if (str != NULL) { os_free (str); } } #else fmt = "%255[^:]:%hu"; ret = sscanf (file, fmt, host, &port); #endif file = NULL; if (res == os_resultSuccess) { if (ret >= 2) { logfile = open_socket (host, port); if (logfile == NULL) { res = os_resultFail; } #ifdef VXWORKS_RTP if (ret == 3) { fprintf (logfile, "FILENAME:%s\n", serverfile); } #endif } else { logfile = fopen (file_name, "a"); } } } } return logfile; }