From: James Peterson Date: Sun, 15 Dec 2002 04:34:45 +0000 (+0000) Subject: Fix symlink support on Windows XP. X-Git-Tag: openafs-stable-1_2_8a X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=39462291df99cfabc3c1f0a474ace680a8187e09;p=packages%2Fo%2Fopenafs.git Fix symlink support on Windows XP. (cherry picked from commit d057f179506a94db0cc178e5df60977ee753f1f7) --- diff --git a/src/WINNT/client_exp/gui2fs.cpp b/src/WINNT/client_exp/gui2fs.cpp index 4b5283bd0..954f38fdb 100644 --- a/src/WINNT/client_exp/gui2fs.cpp +++ b/src/WINNT/client_exp/gui2fs.cpp @@ -1147,6 +1147,82 @@ long fs_StripDriveLetter(const char *inPathp, char *outPathp, long outSize) } +BOOL RemoveSymlink(const char * linkName) +{ + BOOL error = FALSE; + INT code=0; + struct ViceIoctl blob; + char tbuffer[1024]; + char lsbuffer[1024]; + char tpbuffer[1024]; + char *tp; + + tp = (char *) strrchr(linkName, '\\'); + if (!tp) + tp = (char *) strrchr(linkName, '/'); + if (tp) { + strncpy(tbuffer, linkName, code=tp-linkName+1); /* the dir name */ + tbuffer[code] = 0; + tp++; /* skip the slash */ + } + else { + fs_ExtractDriveLetter(linkName, tbuffer); + strcat(tbuffer, "."); + fs_StripDriveLetter(tp, tpbuffer, 0); + tp=tpbuffer; + } + blob.in = tp; + blob.in_size = strlen(tp)+1; + blob.out = lsbuffer; + blob.out_size = sizeof(lsbuffer); + code = pioctl(tbuffer, VIOC_LISTSYMLINK, &blob, 0); + if (code) + return FALSE; + blob.out_size = 0; + blob.in = tp; + blob.in_size = strlen(tp)+1; + return (pioctl(tbuffer, VIOC_DELSYMLINK, &blob, 0)==0); +} + +BOOL IsSymlink(const char * true_name) +{ + char parent_dir[MAXSIZE]; /*Parent directory of true name*/ + char strip_name[MAXSIZE]; + struct ViceIoctl blob; + char *last_component; + int code; + last_component = (char *) strrchr(true_name, '\\'); + if (!last_component) + last_component = (char *) strrchr(true_name, '/'); + if (last_component) { + /* + * Found it. Designate everything before it as the parent directory, + * everything after it as the final component. + */ + strncpy(parent_dir, true_name, last_component - true_name + 1); + parent_dir[last_component - true_name + 1] = 0; + last_component++; /*Skip the slash*/ + } + else { + /* + * No slash appears in the given file name. Set parent_dir to the current + * directory, and the last component as the given name. + */ + fs_ExtractDriveLetter(true_name, parent_dir); + strcat(parent_dir, "."); + last_component = strip_name; + fs_StripDriveLetter(true_name, strip_name, sizeof(strip_name)); + } + + blob.in = last_component; + blob.in_size = strlen(last_component)+1; + blob.out_size = MAXSIZE; + blob.out = space; + memset(space, 0, MAXSIZE); + code = pioctl(parent_dir, VIOC_LISTSYMLINK, &blob, 1); + return (code==0); +} + BOOL RemoveSymlink(const char * linkName) { BOOL error = FALSE; diff --git a/src/WINNT/client_exp/shell_ext.cpp b/src/WINNT/client_exp/shell_ext.cpp index 37e0f1102..304cd7796 100644 --- a/src/WINNT/client_exp/shell_ext.cpp +++ b/src/WINNT/client_exp/shell_ext.cpp @@ -14,6 +14,7 @@ extern "C" { #include #include "stdafx.h" +#include #include #include #include "afs_shl_ext.h"