Windows: symlink make should translate \\afs target
authorJeffrey Altman <jaltman@your-file-system.com>
Fri, 5 Aug 2011 02:50:03 +0000 (22:50 -0400)
committerJeffrey Altman <jaltman@openafs.org>
Fri, 5 Aug 2011 13:22:35 +0000 (06:22 -0700)
If the target is a UNC path beginning with the AFS netbios name,
convert the path to use Unix /afs mountpoint notation.

Change-Id: I01e01b70938f8eb383fd3e7458a140d9e89dd237
Reviewed-on: http://gerrit.openafs.org/5162
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>

src/WINNT/afsd/symlink.c

index 81cd572..adbf0ac 100644 (file)
@@ -210,29 +210,37 @@ MakeLinkCmd(struct cmd_syndesc *as, void *arock)
     afs_int32 code;
     struct ViceIoctl blob;
     char * parent;
-    char path[1024] = "";
-
-    if( FAILED(StringCbCopy(path, sizeof(path), as->parms[0].items->data))) {
-        fprintf (stderr, "MakeLinkCmd - input path too long");
+    char link[1024] = "";
+    char target_buf[1024] = "";
+    char *target = target_buf;
+    const char * nbname;
+    int nblen;
+
+    if( FAILED(StringCbCopy(link, sizeof(link), as->parms[0].items->data))) {
+        fprintf (stderr, "MakeLinkCmd - link path too long");
+        exit(1);
+    }
+    if( FAILED(StringCbCopy(target, sizeof(target_buf), as->parms[1].items->data))) {
+        fprintf (stderr, "MakeLinkCmd - target path too long");
         exit(1);
     }
-    parent = fs_GetParent(path);
+    parent = fs_GetParent(link);
 
-    if (!fs_InAFS(parent)) {
-       const char * nbname = fs_NetbiosName();
-       int len = (int)strlen(nbname);
+    nbname = fs_NetbiosName();
+    nblen = (int)strlen(nbname);
 
+    if (!fs_InAFS(parent)) {
        if (parent[0] == '\\' && parent[1] == '\\' &&
-           (parent[len+2] == '\\' && parent[len+3] == '\0' || parent[len+2] == '\0') &&
-           !strnicmp(nbname,&parent[2],len))
+           (parent[nblen+2] == '\\' && parent[nblen+3] == '\0' || parent[nblen+2] == '\0') &&
+           !strnicmp(nbname,&parent[2],nblen))
        {
-           if( FAILED(StringCbPrintf(path, sizeof(path),
-                                      "%s%sall%s", parent, parent[len+2]?"":"\\",
+           if( FAILED(StringCbPrintf(link, sizeof(link),
+                                      "%s%sall%s", parent, parent[nblen+2]?"":"\\",
                                       &as->parms[0].items->data[strlen(parent)]))) {
-                fprintf(stderr, "path cannot be populated\n");
+                fprintf(stderr, "link cannot be populated\n");
                 exit(1);
             }
-           parent = fs_GetParent(path);
+           parent = fs_GetParent(link);
        } else {
             fprintf(stderr,"%s: symlinks must be created within the AFS file system\n", pn);
             return 1;
@@ -244,16 +252,31 @@ MakeLinkCmd(struct cmd_syndesc *as, void *arock)
        return 1;
     }
 
-    fprintf(stderr, "Creating symlink [%s] to [%s]\n", path, as->parms[1].items->data);
+    /*
+     * Fix up the target path to conform to unix notation
+     * if it is a UNC path to the AFS server name.
+     */
+    if (target[0] == '\\' && target[1] == '\\' &&
+        target[nblen+2] == '\\' &&
+               !strnicmp(nbname,&target[2],nblen))
+    {
+        char *p;
+        for ( p=target; *p; p++) {
+            if (*p == '\\')
+                *p = '/';
+        }
+        target++;
+    }
+    fprintf(stderr, "Creating symlink [%s] to [%s]\n", link, target);
 
     /* create symlink with a special pioctl for Windows NT, since it doesn't
      * have a symlink system call.
      */
     blob.out_size = 0;
-    blob.in_size = 1 + (long)strlen(as->parms[1].items->data);
-    blob.in = as->parms[1].items->data;
+    blob.in_size = 1 + (long)strlen(target);
+    blob.in = target;
     blob.out = NULL;
-    code = pioctl_utf8(path, VIOC_SYMLINK, &blob, 0);
+    code = pioctl_utf8(link, VIOC_SYMLINK, &blob, 0);
     if (code) {
        fs_Die(errno, as->parms[0].items->data);
        return 1;