/* * Read commands from an initialization file. * where = 0: look for gnuplotrc in system shared directory * where = 1: look for .gnuplot in current directory * where = 2: look for .gnuplot in home directory */ static void load_rcfile(int where) { FILE *plotrc = NULL; char *rcfile = NULL; if (skip_gnuplotrc) return; if (where == 0) { #ifdef GNUPLOT_SHARE_DIR # if defined(_Windows) /* retrieve path relative to gnuplot executable, * whose path is in szModuleName (winmain.c) */ rcfile = gp_alloc(strlen((char *)szPackageDir) + 1 + strlen(GNUPLOT_SHARE_DIR) + 1 + strlen("gnuplotrc") + 1, "rcfile"); strcpy(rcfile, (char *)szPackageDir); PATH_CONCAT(rcfile, GNUPLOT_SHARE_DIR); # else rcfile = (char *) gp_alloc(strlen(GNUPLOT_SHARE_DIR) + 1 + strlen("gnuplotrc") + 1, "rcfile"); strcpy(rcfile, GNUPLOT_SHARE_DIR); # endif PATH_CONCAT(rcfile, "gnuplotrc"); plotrc = fopen(rcfile, "r"); #endif } else if (where == 1) { #ifdef USE_CWDRC /* Allow check for a .gnuplot init file in the current directory */ /* This is a security risk, as someone might leave a malicious */ /* init file in a shared directory. */ plotrc = fopen(PLOTRC, "r"); #endif /* !USE_CWDRC */ } else if (where == 2 && user_homedir) { /* length of homedir + directory separator + length of file name + \0 */ int len = (user_homedir ? strlen(user_homedir) : 0) + 1 + strlen(PLOTRC) + 1; rcfile = gp_alloc(len, "rcfile"); strcpy(rcfile, user_homedir); PATH_CONCAT(rcfile, PLOTRC); plotrc = fopen(rcfile, "r"); } if (plotrc) { char *rc = gp_strdup(rcfile ? rcfile : PLOTRC); load_file(plotrc, rc, FALSE); push_terminal(0); /* needed if terminal or its options were changed */ } free(rcfile); }
/* Look for a gnuplot init file in current or home directory */ static void load_rcfile() { FILE *plotrc = NULL; char *rcfile = NULL; #ifdef NOCWDRC /* inhibit check of init file in current directory for security reasons */ #else plotrc = fopen(PLOTRC, "r"); #endif /* !NOCWDRC */ if (plotrc == NULL) { if (user_homedir) { /* len of homedir + directory separator + len of file name + \0 */ rcfile = (char *) gp_alloc((user_homedir ? strlen(user_homedir) : 0) + 1 + strlen(PLOTRC) + 1, "rcfile"); strcpy(rcfile, user_homedir); PATH_CONCAT(rcfile, PLOTRC); plotrc = fopen(rcfile, "r"); } } if (plotrc) { char *rc = gp_strdup(rcfile ? rcfile : PLOTRC); load_file(plotrc, rc, FALSE); push_terminal(0); /* needed if terminal or its options were changed */ } free(rcfile); }
/* * Read commands from an initialization file. * where = 0: look for gnuplotrc in system shared directory * where = 1: look for .gnuplot in current directory * where = 2: look for .gnuplot in home directory */ static void load_rcfile(int where) { FILE *plotrc = NULL; char *rcfile = NULL; if (skip_gnuplotrc) return; if (where == 0) { #ifdef GNUPLOT_SHARE_DIR # if defined(_WIN32) || defined(MSDOS) || defined(OS2) rcfile = RelativePathToGnuplot(GNUPLOT_SHARE_DIR "\\gnuplotrc"); # else rcfile = (char *) gp_alloc(strlen(GNUPLOT_SHARE_DIR) + 1 + strlen("gnuplotrc") + 1, "rcfile"); strcpy(rcfile, GNUPLOT_SHARE_DIR); PATH_CONCAT(rcfile, "gnuplotrc"); # endif plotrc = fopen(rcfile, "r"); #endif } else if (where == 1) { #ifdef USE_CWDRC /* Allow check for a .gnuplot init file in the current directory */ /* This is a security risk, as someone might leave a malicious */ /* init file in a shared directory. */ plotrc = fopen(PLOTRC, "r"); #endif /* !USE_CWDRC */ } else if (where == 2 && user_homedir) { /* length of homedir + directory separator + length of file name + \0 */ int len = (user_homedir ? strlen(user_homedir) : 0) + 1 + strlen(PLOTRC) + 1; rcfile = gp_alloc(len, "rcfile"); strcpy(rcfile, user_homedir); PATH_CONCAT(rcfile, PLOTRC); plotrc = fopen(rcfile, "r"); } if (plotrc) { char *rc = gp_strdup(rcfile ? rcfile : PLOTRC); load_file(plotrc, rc, 3); push_terminal(0); /* needed if terminal or its options were changed */ } free(rcfile); }
FILE * loadpath_fopen(const char *filename, const char *mode) { FILE *fp; #if defined(PIPES) if (*filename == '<') { restrict_popen(); if ((fp = popen(filename + 1, "r")) == (FILE *) NULL) return (FILE *) 0; } else #endif /* PIPES */ if ((fp = fopen(filename, mode)) == (FILE *) NULL) { /* try 'loadpath' variable */ char *fullname = NULL, *path; while ((path = get_loadpath()) != NULL) { /* length of path, dir separator, filename, \0 */ fullname = gp_realloc(fullname, strlen(path) + 1 + strlen(filename) + 1, "loadpath_fopen"); strcpy(fullname, path); PATH_CONCAT(fullname, filename); if ((fp = fopen(fullname, mode)) != NULL) { free(fullname); fullname = NULL; /* reset loadpath internals! * maybe this can be replaced by calling get_loadpath with * a NULL argument and some loadpath_handler internal logic */ while (get_loadpath()); break; } } if (fullname) free(fullname); } #ifdef _Windows if (fp != NULL) setmode(fileno(fp), _O_BINARY); #endif return fp; }
/* Thanks to John Bollinger <*****@*****.**> who has tested the windows part */ static char * recursivefullname(const char *path, const char *filename, TBOOLEAN recursive) { char *fullname = NULL; FILE *fp; /* length of path, dir separator, filename, \0 */ fullname = gp_alloc(strlen(path) + 1 + strlen(filename) + 1, "recursivefullname"); strcpy(fullname, path); PATH_CONCAT(fullname, filename); if ((fp = fopen(fullname, "r")) != NULL) { fclose(fp); return fullname; } else { free(fullname); fullname = NULL; } if (recursive) { #ifdef HAVE_DIRENT_H DIR *dir; struct dirent *direntry; struct stat buf; dir = opendir(path); if (dir) { while ((direntry = readdir(dir)) != NULL) { char *fulldir = gp_alloc(strlen(path) + 1 + strlen(direntry->d_name) + 1, "fontpath_fullname"); strcpy(fulldir, path); # if defined(VMS) if (fulldir[strlen(fulldir) - 1] == ']') fulldir[strlen(fulldir) - 1] = '\0'; strcpy(&(fulldir[strlen(fulldir)]), "."); strcpy(&(fulldir[strlen(fulldir)]), direntry->d_name); strcpy(&(fulldir[strlen(fulldir)]), "]"); # else PATH_CONCAT(fulldir, direntry->d_name); # endif stat(fulldir, &buf); if ((S_ISDIR(buf.st_mode)) && (strcmp(direntry->d_name, ".") != 0) && (strcmp(direntry->d_name, "..") != 0)) { fullname = recursivefullname(fulldir, filename, TRUE); if (fullname != NULL) break; } free(fulldir); } closedir(dir); } #elif defined(_Windows) HANDLE filehandle; WIN32_FIND_DATA finddata; char *pathwildcard = gp_alloc(strlen(path) + 2, "fontpath_fullname"); strcpy(pathwildcard, path); PATH_CONCAT(pathwildcard, "*"); filehandle = FindFirstFile(pathwildcard, &finddata); free(pathwildcard); if (filehandle != INVALID_HANDLE_VALUE) do { if ((finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (strcmp(finddata.cFileName, ".") != 0) && (strcmp(finddata.cFileName, "..") != 0)) { char *fulldir = gp_alloc(strlen(path) + 1 + strlen(finddata.cFileName) + 1, "fontpath_fullname"); strcpy(fulldir, path); PATH_CONCAT(fulldir, finddata.cFileName); fullname = recursivefullname(fulldir, filename, TRUE); free(fulldir); if (fullname != NULL) break; } } while (FindNextFile(filehandle, &finddata) != 0); FindClose(filehandle); #else int_warn(NO_CARET, "Recursive directory search not supported\n\t('%s!')", path); #endif } return fullname; }