Fix symlink support on Windows XP.
authorJames Peterson <james@abrakus.com>
Sun, 15 Dec 2002 04:33:30 +0000 (04:33 +0000)
committerGarry Zacheiss <zacheiss@mit.edu>
Sun, 15 Dec 2002 04:33:30 +0000 (04:33 +0000)
src/WINNT/client_exp/gui2fs.cpp
src/WINNT/client_exp/shell_ext.cpp

index 4b5283b..f409d1f 100644 (file)
@@ -1491,6 +1491,82 @@ BOOL GetTokenInfo(CStringArray& tokenInfo)
 //     tokenInfo.Add("");
 //     return TRUE;
 
+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);
+}
+
 
        HOURGLASS hourglass;
 
index 37e0f11..304cd77 100644 (file)
@@ -14,6 +14,7 @@ extern "C" {
 
 #include <afxpriv.h>
 #include "stdafx.h"
+#include <atlconv.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include "afs_shl_ext.h"