Remove the RCSID macro
[openafs.git] / src / volser / physio.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 #include <afsconfig.h>
11 #include <afs/param.h>
12
13
14 #include <sys/types.h>
15 #ifdef AFS_NT40_ENV
16 #include <fcntl.h>
17 #else
18 #include <sys/file.h>
19 #include <netinet/in.h>
20 #include <unistd.h>
21 #endif
22 #include <string.h>
23 #ifdef  AFS_SUN5_ENV
24 #include <sys/fcntl.h>
25 #endif
26 #include <errno.h>
27 #include <rx/xdr.h>
28 #include <rx/rx.h>
29 #include <stdio.h>
30 #include <afs/afsint.h>
31 #include <afs/nfs.h>
32 #include <afs/assert.h>
33 #include <afs/dir.h>
34 #include <afs/ihandle.h>
35 #include "vol.h"
36
37 /* returns 0 on success, errno on failure */
38 int
39 ReallyRead(DirHandle * file, int block, char *data)
40 {
41     FdHandle_t *fdP;
42     int code;
43     errno = 0;
44     fdP = IH_OPEN(file->dirh_handle);
45     if (fdP == NULL) {
46         code = errno;
47         return code;
48     }
49     if (FDH_SEEK(fdP, block * AFS_PAGESIZE, SEEK_SET) < 0) {
50         code = errno;
51         FDH_REALLYCLOSE(fdP);
52         return code;
53     }
54     code = FDH_READ(fdP, data, AFS_PAGESIZE);
55     if (code != AFS_PAGESIZE) {
56         if (code < 0)
57             code = errno;
58         else
59             code = EIO;
60         FDH_REALLYCLOSE(fdP);
61         return code;
62     }
63     FDH_CLOSE(fdP);
64     return 0;
65 }
66
67 /* returns 0 on success, errno on failure */
68 int
69 ReallyWrite(DirHandle * file, int block, char *data)
70 {
71     FdHandle_t *fdP;
72     extern int VolumeChanged;
73     int code;
74
75     errno = 0;
76
77     fdP = IH_OPEN(file->dirh_handle);
78     if (fdP == NULL) {
79         code = errno;
80         return code;
81     }
82     if (FDH_SEEK(fdP, block * AFS_PAGESIZE, SEEK_SET) < 0) {
83         code = errno;
84         FDH_REALLYCLOSE(fdP);
85         return code;
86     }
87     code = FDH_WRITE(fdP, data, AFS_PAGESIZE);
88     if (code != AFS_PAGESIZE) {
89         if (code < 0)
90             code = errno;
91         else
92             code = EIO;
93         FDH_REALLYCLOSE(fdP);
94         return code;
95     }
96     FDH_CLOSE(fdP);
97     VolumeChanged = 1;
98     return 0;
99 }
100
101 /* SetSalvageDirHandle:
102  * Create a handle to a directory entry and reference it (IH_INIT).
103  * The handle needs to be dereferenced with the FidZap() routine.
104  */
105 void
106 SetSalvageDirHandle(DirHandle * dir, afs_int32 volume, afs_int32 device,
107                     Inode inode)
108 {
109     private SalvageCacheCheck = 1;
110     memset(dir, 0, sizeof(DirHandle));
111
112     dir->dirh_volume = volume;
113     dir->dirh_device = device;
114     dir->dirh_inode = inode;
115     IH_INIT(dir->dirh_handle, device, volume, inode);
116
117     /* Always re-read for a new dirhandle */
118     dir->dirh_cacheCheck = SalvageCacheCheck++;
119 }
120
121 void
122 FidZap(DirHandle * file)
123 {
124     IH_RELEASE(file->dirh_handle);
125     memset(file, 0, sizeof(DirHandle));
126 }
127
128 void
129 FidZero(DirHandle * file)
130 {
131     memset(file, 0, sizeof(DirHandle));
132 }
133
134 int
135 FidEq(DirHandle * afile, DirHandle * bfile)
136 {
137     if (afile->dirh_volume != bfile->dirh_volume)
138         return 0;
139     if (afile->dirh_device != bfile->dirh_device)
140         return 0;
141     if (afile->dirh_cacheCheck != bfile->dirh_cacheCheck)
142         return 0;
143     if (afile->dirh_inode != bfile->dirh_inode)
144         return 0;
145     return 1;
146 }
147
148 int
149 FidVolEq(DirHandle * afile, afs_int32 vid)
150 {
151     if (afile->dirh_volume != vid)
152         return 0;
153     return 1;
154 }
155
156 void
157 FidCpy(DirHandle * tofile, DirHandle * fromfile)
158 {
159     *tofile = *fromfile;
160     IH_COPY(tofile->dirh_handle, fromfile->dirh_handle);
161 }
162
163 void
164 Die(char *msg)
165 {
166     printf("%s\n", msg);
167     assert(1 == 2);
168 }