Windows: Rewrite LargeSearchTime conversions
[openafs.git] / src / WINNT / afsd / cm_utils.c
index e963d7d..6c7718e 100644 (file)
@@ -213,8 +213,14 @@ long cm_MapRPCError(long error, cm_req_t *reqp)
 
     if (error == RX_CALL_DEAD ||
         error == RX_CALL_TIMEOUT ||
-        error == RX_MSGSIZE)
-        error = CM_ERROR_RETRY;
+        error == RX_CALL_BUSY ||
+        error == RX_MSGSIZE ||
+        error == VNOSERVICE)
+       error = CM_ERROR_TIMEDOUT;
+    else if (error == RX_CALL_IDLE)
+        error = EIO;
+    else if (error == RX_INVALID_OPERATION)
+        error = CM_ERROR_INVAL_NET_RESP;
     else if (error < 0)
         error = CM_ERROR_UNKNOWN;
     else if (error == EINVAL)
@@ -248,7 +254,7 @@ long cm_MapRPCError(long error, cm_req_t *reqp)
         error = CM_ERROR_QUOTA;
     else if (error == VNOVNODE)
         error = CM_ERROR_BADFD;
-    else if (error == VNOSERVICE || error == VSALVAGE || error == VOFFLINE)
+    else if (error == VSALVAGE || error == VOFFLINE)
         error = CM_ERROR_ALLOFFLINE;
     else if (error == VBUSY || error == VRESTARTING)
         error = CM_ERROR_ALLBUSY;
@@ -277,14 +283,19 @@ long cm_MapRPCErrorRmdir(long error, cm_req_t *reqp)
 
     if (error == RX_CALL_DEAD ||
         error == RX_CALL_TIMEOUT ||
-        error == RX_MSGSIZE)
-        error = CM_ERROR_RETRY;
+        error == RX_CALL_BUSY ||
+        error == RX_CALL_IDLE ||
+        error == RX_MSGSIZE ||
+        error == VNOSERVICE)
+       error = CM_ERROR_TIMEDOUT;
     else if (error == VNOVNODE)
         error = CM_ERROR_BADFD;
-    else if (error == VNOSERVICE || error == VSALVAGE || error == VOFFLINE)
+    else if (error == VSALVAGE || error == VOFFLINE)
         error = CM_ERROR_ALLOFFLINE;
     else if (error == VBUSY || error == VRESTARTING)
         error = CM_ERROR_ALLBUSY;
+    else if (error == RX_INVALID_OPERATION)
+        error = CM_ERROR_INVAL_NET_RESP;
     else if (error < 0)
         error = CM_ERROR_UNKNOWN;
     else if (error == EROFS)
@@ -298,6 +309,7 @@ long cm_MapRPCErrorRmdir(long error, cm_req_t *reqp)
     else if (error == EINVAL)
         error = CM_ERROR_INVAL;
     else if (error == ENOTEMPTY
+              || error == EEXIST
               || error == 17           /* AIX */
               || error == 66           /* SunOS 4, Digital UNIX */
               || error == 93           /* Solaris 2, IRIX */
@@ -325,8 +337,13 @@ long cm_MapVLRPCError(long error, cm_req_t *reqp)
 
     if (error == RX_CALL_DEAD ||
         error == RX_CALL_TIMEOUT ||
-        error == RX_MSGSIZE)
-        error = CM_ERROR_RETRY;
+        error == RX_CALL_BUSY ||
+        error == RX_CALL_IDLE ||
+        error == RX_MSGSIZE ||
+        error == VNOSERVICE)
+       error = CM_ERROR_TIMEDOUT;
+    else if (error == RX_INVALID_OPERATION)
+        error = CM_ERROR_INVAL_NET_RESP;
     else if (error == RX_RESTARTING)
         error = CM_ERROR_ALLBUSY;
     else if (error < 0)
@@ -593,6 +610,43 @@ void cm_Gen8Dot3NameIntW(const clientchar_t * longname, cm_dirFid_t * pfid,
         *shortNameEndp = shortName;
 }
 
+void cm_Gen8Dot3VolNameW(afs_uint32 cell, afs_uint32 volume,
+                         clientchar_t *shortName, clientchar_t **shortNameEndp)
+{
+    clientchar_t number[12];
+    int i, nsize = 0;
+    int validExtension = 0;
+
+    /* Unparse the file's cell and volume numbers */
+    do {
+        number[nsize] = cm_8Dot3Mapping[cell % cm_8Dot3MapSize];
+        nsize++;
+        cell /= cm_8Dot3MapSize;
+    } while (cell);
+    do {
+        number[nsize] = cm_8Dot3Mapping[volume % cm_8Dot3MapSize];
+        nsize++;
+        volume /= cm_8Dot3MapSize;
+    } while (volume && nsize < 8);
+
+    /* Copy uniquifier characters */
+    for (i=0; i < nsize; i++) {
+        *shortName++ = number[i];
+    }
+
+    /* Add extension characters */
+    *shortName++ = '.';        /* copy dot */
+    *shortName++ = 'v';
+    *shortName++ = 'o';
+    *shortName++ = 'l';
+
+    /* Trailing null */
+    *shortName = 0;
+
+    if (shortNameEndp)
+        *shortNameEndp = shortName;
+}
+
 /*! \brief Compare 'pattern' (containing metacharacters '*' and '?') with the file name 'name'.
 
   \note This procedure works recursively calling itself.
@@ -999,26 +1053,29 @@ void cm_UpdateServerPriority()
 void cm_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime)
 {
     // Note that LONGLONG is a 64-bit value
-    LONGLONG ll;
-
-    ll = Int32x32To64(unixTime, 10000000) + 116444736000000000;
-    largeTimep->dwLowDateTime = (DWORD)(ll & 0xFFFFFFFF);
-    largeTimep->dwHighDateTime = (DWORD)(ll >> 32);
+    LARGE_INTEGER ll;
+
+#ifdef _USE_32BIT_TIME_T
+    ll.QuadPart = UInt32x32To64(unixTime, 10000000) + 116444736000000000;
+#else
+    ll.QuadPart = unixTime * 10000000 + 116444736000000000;
+#endif
+    largeTimep->dwLowDateTime = ll.LowPart;
+    largeTimep->dwHighDateTime = ll.HighPart;
 }
 
 void cm_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep)
 {
     // Note that LONGLONG is a 64-bit value
-    LONGLONG ll;
+    LARGE_INTEGER ll;
 
-    ll = largeTimep->dwHighDateTime;
-    ll <<= 32;
-    ll += largeTimep->dwLowDateTime;
+    ll.HighPart = largeTimep->dwHighDateTime;
+    ll.LowPart  = largeTimep->dwLowDateTime;
 
-    ll -= 116444736000000000;
-    ll /= 10000000;
+    ll.QuadPart -= 116444736000000000;
+    ll.QuadPart /= 10000000;
 
-    *unixTimep = (DWORD)ll;
+    *unixTimep = (time_t)ll.QuadPart;
 }
 
 void cm_SearchTimeFromUnixTime(afs_uint32 *searchTimep, time_t unixTime)
@@ -1066,3 +1123,16 @@ void cm_UnixTimeFromSearchTime(time_t *unixTimep, afs_uint32 searchTime)
 
     *unixTimep = mktime(&localTm);
 }
+
+afs_uint32
+cm_NextHighestPowerOf2(afs_uint32 n)
+{
+    n--;
+    n |= n >> 1;
+    n |= n >> 2;
+    n |= n >> 4;
+    n |= n >> 8;
+    n |= n >> 16;
+    n++;
+    return n;
+}