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