Beispiel #1
0
char *GFileGetAbsoluteName(char *name, char *result, int rsiz) {
   /* result may be the same as name */
   char buffer[1000];

   if (!GFileIsAbsolute(name)) {
      char *pt, *spt, *rpt, *bpt;

      if (dirname_[0] == '\0') {
	 getcwd(dirname_, sizeof(dirname_));
      }
      strcpy(buffer, dirname_);
      if (buffer[strlen(buffer) - 1] != '/')
	 strcat(buffer, "/");
      strcat(buffer, name);
#if defined(__MINGW32__)
      _backslash_to_slash(buffer);
#endif

      /* Normalize out any .. */
      spt = rpt = buffer;
      while (*spt != '\0') {
	 if (*spt == '/') {
	    if (*++spt == '\0')
	       break;
	 }
	 for (pt = spt; *pt != '\0' && *pt != '/'; ++pt);
	 if (pt == spt)		/* Found // in a path spec, reduce to / (we've */
	    savestrcpy(spt, spt + 1);	/*  skipped past the :// of the machine name) */
	 else if (pt == spt + 1 && spt[0] == '.' && *pt == '/') {	/* Noop */
	    savestrcpy(spt, spt + 2);
	 } else if (pt == spt + 2 && spt[0] == '.' && spt[1] == '.') {
	    for (bpt = spt - 2; bpt > rpt && *bpt != '/'; --bpt);
	    if (bpt >= rpt && *bpt == '/') {
	       savestrcpy(bpt, pt);
	       spt = bpt;
	    } else {
	       rpt = pt;
	       spt = pt;
	    }
	 } else
	    spt = pt;
      }
      name = buffer;
      if (rsiz > sizeof(buffer))
	 rsiz = sizeof(buffer);	/* Else valgrind gets unhappy */
   }
   if (result != name) {
      strncpy(result, name, rsiz);
      result[rsiz - 1] = '\0';
#if defined(__MINGW32__)
      _backslash_to_slash(result);
#endif
   }
   return (result);
}
Beispiel #2
0
char *GFileGetHomeDocumentsDir(void)
{
    static char* ret = 0;
    if( ret )
	return ret;

#if defined(__MINGW32__)

    CHAR my_documents[MAX_PATH+2];
    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents );
    if (result != S_OK)
    {
    	fprintf(stderr,"Error: Can't get My Documents path!'\n");
        return ret;
    }
    int pos = strlen(my_documents);
    my_documents[ pos++ ] = '\\';
    my_documents[ pos++ ] = '\0';
    ret = copy( my_documents );
	_backslash_to_slash(ret);
    return ret;
#endif

    // On GNU/Linux and OSX it was decided that this should be just the
    // home directory itself.
    ret = GFileGetHomeDir();
    return ret;
}
Beispiel #3
0
/* reimplementation of GFileGetHomeDir, avoiding copy().  Returns NULL if home
 * directory cannot be found */
char *getUserHomeDir(void) {
#if defined(__MINGW32__)
	char* dir = getenv("APPDATA");
	if( dir==NULL )
	dir = getenv("USERPROFILE");
	if( dir!=NULL ) {
	_backslash_to_slash(dir);
return dir;
	}
return NULL;
#else
	uid_t uid;
	struct passwd *pw;
	char *home = getenv("HOME");

	if( home!=NULL )
return home;

	uid = getuid();
	while( (pw=getpwent())!=NULL ) {
	if ( pw->pw_uid==uid ) {
		home = pw->pw_dir;
		endpwent();
return home;
	}
	}
	endpwent();
return NULL;
#endif
}
Beispiel #4
0
char *GFileGetHomeDir(void) {
#if defined(__MINGW32__)
    char* dir = getenv("HOME");
    if(!dir)
	dir = getenv("USERPROFILE");
    if(dir){
	char* buffer = copy(dir);
	_backslash_to_slash(buffer);
return buffer;
    }
return NULL;
#else
    static char *dir;
    uid_t uid;
    struct passwd *pw;

    dir = getenv("HOME");
    if ( dir!=NULL )
	return( copy(dir) );

    uid = getuid();
    while ( (pw=getpwent())!=NULL ) {
	if ( pw->pw_uid==uid ) {
	    dir = copy(pw->pw_dir);
	    endpwent();
return( dir );
	}
    }
    endpwent();
return( NULL );
#endif
}
Beispiel #5
0
char *GFileDirName(const char *path)
{
    char ret[PATH_MAX+1];
    strncpy( ret, path, PATH_MAX );
    _backslash_to_slash( ret );
    char *pt = strrchr( ret, '/' );
    if ( pt )
	*pt = '\0';
    return strdup(ret);
}