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