Windows: AFSTearDownExtents may experience active extents
[openafs.git] / src / WINNT / client_osi / osiutils.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* Copyright (C) 1994 Cazamar Systems, Inc. */
11
12 #include <afs/param.h>
13 #include <afs/stds.h>
14
15 #include <windows.h>
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <assert.h>
19 #include <limits.h>
20
21 #include <rpc.h>
22 #include "osiutils.h"
23
24 void osi_LongToUID(long inval, UUID *outuidp)
25 {
26         /* generic UUID whose seconds field we'll never use again */
27         UUID genericCazamarUUID = { /* 7C45E3F8-5F73-101B-89A3-204C4F4F5020 */
28                 0x7C45E3F8,
29                 0x5F73,
30                 0x101B,
31                 {0x89, 0xa3, 0x20, 0x4C, 0x4F, 0x4F, 0x50, 0x20}
32         };
33
34         genericCazamarUUID.Data1 = inval;
35         memcpy(outuidp, &genericCazamarUUID, sizeof(UUID));
36 }
37
38 /* compare two UIDs in the dictionary ordering */
39 int osi_UIDCmp(UUID *uid1p, UUID *uid2p)
40 {
41         int i;
42         int v1;
43         int v2;
44         char *t1p;
45         char *t2p;
46
47         if (uid1p->Data1 < uid2p->Data1) return -1;
48         else if (uid1p->Data1 > uid2p->Data1) return 1;
49
50         if (uid1p->Data2 < uid2p->Data2) return -1;
51         else if (uid1p->Data2 > uid2p->Data2) return 1;
52
53         if (uid1p->Data3 < uid2p->Data3) return -1;
54         else if (uid1p->Data3 > uid2p->Data3) return 1;
55
56         t1p = uid1p->Data4;
57         t2p = uid2p->Data4;
58
59         for(i=0; i<8; i++) {
60                 v1 = *t1p++;
61                 v2 = *t2p++;
62                 if (v1 < v2) return -1;
63                 else if (v1 > v2) return 1;
64         }
65         return 0;
66 }
67
68 void * __RPC_API MIDL_user_allocate(size_t size)
69 {
70   return (void *) malloc(size);
71 }
72
73 void __RPC_API MIDL_user_free(void *p)
74 {
75   free(p);
76 }
77
78 #if (_MSC_VER >= 1300)
79 LARGE_INTEGER /* WINAPI */ LargeIntegerAdd(LARGE_INTEGER a, LARGE_INTEGER b)
80 {
81         LARGE_INTEGER result;
82         int carry;
83         result.LowPart=a.LowPart+b.LowPart;
84         carry=(result.LowPart < b.LowPart) ? 1 : 0;
85         result.HighPart=a.HighPart+b.HighPart+ carry;
86         return result;
87 }
88 LARGE_INTEGER /* WINAPI */ LargeIntegerSubtract(LARGE_INTEGER a, LARGE_INTEGER b)
89 {
90         LARGE_INTEGER result;
91         int borrow;
92         result.LowPart=a.LowPart-b.LowPart;
93         borrow=(result.LowPart > a.LowPart) ? 1 : 0;
94         result.HighPart=a.HighPart-b.HighPart- borrow;
95         return result;
96 }
97 LARGE_INTEGER /* WINAPI */ ExtendedLargeIntegerDivide(LARGE_INTEGER a, unsigned long b, unsigned long *remainder)
98 {
99     LARGE_INTEGER result;
100     ULONGLONG a1,q1,r1;
101
102     result.HighPart=0;
103     result.LowPart=0;
104     if (b == 0) { return result; }
105     if (b == 1) { *remainder = 0; return a; }
106
107     a1 = a.HighPart;
108     a1 <<= 32;
109     a1 |= a.LowPart;
110     q1=a1/b;
111     r1=a1-(q1*b);
112     if (r1 > ULONG_MAX) /*XXX */;
113     result.HighPart=(LONG)(q1 >> 32);
114     result.LowPart=(DWORD)(q1 & 0xffffffff);
115     *remainder=(unsigned long)(r1 & 0xffffffff);
116     return result;
117 }
118 LARGE_INTEGER /* WINAPI */ LargeIntegerDivide(LARGE_INTEGER a, LARGE_INTEGER b, LARGE_INTEGER *remainder)
119 {
120     LARGE_INTEGER result;
121     ULONGLONG a1,b1,q1,r1;
122
123     result.HighPart=0;
124     result.LowPart=0;
125     if (b.HighPart == 0 && b.LowPart == 0) { return result; }
126     if (b.HighPart == 0 && b.LowPart == 1) {
127         remainder->HighPart = 0;
128         remainder->LowPart = 0;
129         return a;
130     }
131
132     a1 = a.HighPart;
133     a1 <<= 32;
134     a1 |= a.LowPart;
135     b1 = b.HighPart;
136     b1 <<= 32;
137     b1 |= b.LowPart;
138     q1=a1/b1;
139     r1=a1-(q1*b1);
140     result.HighPart=(LONG)(q1 >> 32);
141     result.LowPart=(DWORD)(q1 & 0xffffffff);
142     remainder->HighPart=(LONG)(r1 >> 32);
143     remainder->LowPart=(DWORD)(r1 & 0xffffffff);
144     return result;
145 }
146
147 LARGE_INTEGER /* WINAPI */ ConvertLongToLargeInteger(unsigned long a)
148 {
149     LARGE_INTEGER result;
150     result.HighPart=0;
151     result.LowPart=a;
152     return result;
153 }
154 #endif