예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
/**
* 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);
}
예제 #4
0
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;
}