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; }
/** * 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); }
os_result idl_genJavaHelperAddPackageRedirect ( const os_char *optarg) { idl_packageRedirect exists, redirect = NULL; os_char *colon; os_char *module = NULL; os_char *package = NULL; os_char *trim = NULL; os_result result = os_resultSuccess; assert (optarg != NULL); colon = os_index (optarg, ':'); if (colon != NULL) { if (colon == optarg) { module = NULL; } else { module = os_strndup (optarg, (size_t) (colon - optarg)); if (module != NULL) { if ((trim = os_str_trim (module, "./:")) != module) { os_free (module); } module = trim; } if (module == NULL) { result = os_resultFail; } else if (strlen (module) == 0) { os_free (module); module = NULL; } } package = os_strdup (colon + 1); if ((trim = os_str_trim (package, "./:")) != package) { os_free (package); } package = trim; if (strlen (package) == 0) { result = os_resultInvalid; } redirect = os_malloc (OS_SIZEOF (idl_packageRedirect)); if (result == os_resultSuccess) { redirect->module = module; redirect->package = package; exists = os_iterResolve ( idl_genJavaHelperPackageRedirects, &idl_genJavaHelperComparePackageRedirect, redirect); if (exists != NULL) { result = os_resultInvalid; } else { idl_genJavaHelperPackageRedirects = os_iterAppend ( idl_genJavaHelperPackageRedirects, redirect); /* idl_genJavaHelperPackageRedirect must be sorted */ os_iterSort ( idl_genJavaHelperPackageRedirects, &idl_genJavaHelperComparePackageRedirect, OS_FALSE); } } if (result != os_resultSuccess) { os_free (module); os_free (package); os_free (redirect); } } else { result = os_resultInvalid; } return result; }