我試圖用MinGW編譯libUnihan代碼,但遇到了需要移植的函數。該函數的目的是獲得規範的路徑表示。它使用pwd.h
(這是POSIX,MinGW不是),所以它可以通過檢索包含pw_dir
的passwd
結構來說明使用'〜'來表示主目錄。我確實發現了一些信息here,以及一個端口realpath
here,但是我仍然完全不知道如何處理這個問題。使用MinGW,我仍然有一個主目錄,代表~
,位於/home/nate
,但由於它不是POSIX,因此我沒有pwd.h
來幫助我找到此主目錄的位置。將Unix移植到Windows-使用pwd.h
問:如何將以下功能移植到MinGW上以正常工作?
/**
* Return the canonicalized absolute pathname.
*
* It works exactly the same with realpath(3), except this function can handle the path with ~,
* where realpath cannot.
*
* @param path The path to be resolved.
* @param resolved_path Buffer for holding the resolved_path.
* @return resolved path, NULL is the resolution is not sucessful.
*/
gchar*
truepath(const gchar *path, gchar *resolved_path){
gchar workingPath[PATH_MAX];
gchar fullPath[PATH_MAX];
gchar *result=NULL;
g_strlcpy(workingPath,path,PATH_MAX);
// printf("*** path=%s \n",path);
if (workingPath[0] != '~'){
result = realpath(workingPath, resolved_path);
}else{
gchar *firstSlash, *suffix, *homeDirStr;
struct passwd *pw;
// initialize variables
firstSlash = suffix = homeDirStr = NULL;
firstSlash = strchr(workingPath, DIRECTORY_SEPARATOR);
if (firstSlash == NULL)
suffix = "";
else
{
*firstSlash = 0; // so userName is null terminated
suffix = firstSlash + 1;
}
if (workingPath[1] == '\0')
pw = getpwuid(getuid());
else
pw = getpwnam(&workingPath[1]);
if (pw != NULL)
homeDirStr = pw->pw_dir;
if (homeDirStr != NULL){
gint ret=g_sprintf(fullPath, "%s%c%s", homeDirStr, DIRECTORY_SEPARATOR, suffix);
if (ret>0){
result = realpath(fullPath, resolved_path);
}
}
}
return result;
}
請注意,'〜'本身意味着'$ HOME'環境變量的值,對於當前用戶而言,通常但不一定與'〜user'相同。後者是密碼文件中的信息。 – 2013-03-13 00:34:10