Windows: Rewrite LargeSearchTime conversions
[openafs.git] / src / WINNT / afsd / cm_utils.c
index 8ade0c4..6c7718e 100644 (file)
@@ -214,10 +214,13 @@ long cm_MapRPCError(long error, cm_req_t *reqp)
     if (error == RX_CALL_DEAD ||
         error == RX_CALL_TIMEOUT ||
         error == RX_CALL_BUSY ||
-        error == RX_MSGSIZE)
-        error = CM_ERROR_RETRY;
+        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)
@@ -251,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;
@@ -282,14 +285,17 @@ long cm_MapRPCErrorRmdir(long error, cm_req_t *reqp)
         error == RX_CALL_TIMEOUT ||
         error == RX_CALL_BUSY ||
         error == RX_CALL_IDLE ||
-        error == RX_MSGSIZE)
-        error = CM_ERROR_RETRY;
+        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)
@@ -303,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 */
@@ -332,8 +339,11 @@ long cm_MapVLRPCError(long error, cm_req_t *reqp)
         error == RX_CALL_TIMEOUT ||
         error == RX_CALL_BUSY ||
         error == RX_CALL_IDLE ||
-        error == RX_MSGSIZE)
-        error = CM_ERROR_RETRY;
+        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)
@@ -1043,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)