00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include "w_defines.h"
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 #include <w.h>
00071 #include <sdisk.h>
00072
00073 #include <sthread.h>
00074
00075
00076
00077
00078
00079 int sdisk_base_t::vsize(const iovec_t *iov, int iovcnt)
00080 {
00081 int total = 0;
00082
00083 for (int i = 0; i < iovcnt; i++)
00084 total += iov[i].iov_len;
00085
00086 return total;
00087 }
00088
00089
00090 int sdisk_t::modeBits(int mode)
00091 {
00092 return mode & MODE_FLAGS;
00093 }
00094
00095
00096
00097 bool sdisk_t::hasMode(int mode, int wanted)
00098 {
00099 mode = modeBits(mode);
00100 return mode == wanted;
00101 }
00102
00103
00104 bool sdisk_t::hasOption(int mode, int wanted)
00105 {
00106 mode &= OPTION_FLAGS;
00107 return (mode & wanted) == wanted;
00108 }
00109
00110
00111
00112
00113
00114
00115 w_rc_t sdisk_t::readv(const iovec_t *iov, int iovcnt, int &transfered)
00116 {
00117 int done = 0;
00118 int n;
00119 int i;
00120 w_rc_t e;
00121
00122 (void) vsize(iov, iovcnt);
00123
00124 for (i = 0; i < iovcnt; i++) {
00125 e = read(iov[i].iov_base, iov[i].iov_len, n);
00126 if (e.is_error())
00127 break;
00128 done += n;
00129 if (size_t(n) != iov[i].iov_len)
00130 break;
00131 }
00132
00133 transfered = done;
00134
00135 return e;
00136 }
00137
00138
00139 w_rc_t sdisk_t::writev(const iovec_t *iov, int iovcnt, int &transfered)
00140 {
00141 int done = 0;
00142 int n;
00143 int i;
00144 w_rc_t e;
00145
00146 (void) vsize(iov, iovcnt);
00147
00148 for (i = 0; i < iovcnt; i++) {
00149 e = write(iov[i].iov_base, iov[i].iov_len, n);
00150 if (e.is_error())
00151 break;
00152 done += n;
00153 if (size_t(n) != iov[i].iov_len)
00154 break;
00155 }
00156
00157 transfered = done;
00158
00159 return e;
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169 #ifndef DEAD
00170 w_rc_t sdisk_t::pread(void *, int , fileoff_t , int &)
00171 {
00172
00173 return RC(fcNOTIMPLEMENTED);
00174 }
00175 #else // DEAD
00176 w_rc_t sdisk_t::pread(void *buf, int size, fileoff_t pos,
00177 int &transfered)
00178 {
00179 fileoff_t was;
00180 fileoff_t newpos;
00181 int n;
00182 w_rc_t e;
00183 w_rc_t es;
00184
00185 W_DO(seek(0, SEEK_AT_CUR, was));
00186
00187 if (pos != was) {
00188 W_DO(seek(pos, SEEK_AT_SET, newpos));
00189 if (newpos != pos) {
00190 es = seek(was, SEEK_AT_SET, newpos);
00191 if (es.is_error())
00192 cerr << "Warning: pread reposition failed!"
00193 << endl << e << endl;
00194 return RC(stSHORTSEEK);
00195 }
00196 }
00197
00198 e = read(buf, size, n);
00199
00200 es = seek(was, SEEK_AT_SET, newpos);
00201
00202 if (es.is_error() || newpos != was)
00203 cerr << "Warning: pread reposition failed!"
00204 << endl << e << endl;
00205
00206 transfered = n;
00207
00208 return e;
00209 }
00210 #endif
00211
00212 #ifndef DEAD
00213 w_rc_t sdisk_t::pwrite(const void *, int , fileoff_t ,
00214 int &)
00215 {
00216
00217 return RC(fcNOTIMPLEMENTED);
00218 }
00219 #else // DEAD
00220 w_rc_t sdisk_t::pwrite(const void *buf, int size, fileoff_t pos,
00221 int &transfered)
00222 {
00223
00224 return RC(fcNOTIMPLEMENTED);
00225
00226 fileoff_t was;
00227 fileoff_t newpos;
00228 int n;
00229 w_rc_t e;
00230 w_rc_t es;
00231
00232 W_DO(seek(0, SEEK_AT_CUR, was));
00233
00234 if (pos != was) {
00235 W_DO(seek(pos, SEEK_AT_SET, newpos));
00236 if (newpos != pos) {
00237 es = seek(was, SEEK_AT_SET, newpos);
00238 if (es.is_error())
00239 cerr << "Warning: pwrite reposition failed!"
00240 << endl << e << endl;
00241 return RC(stSHORTSEEK);
00242 }
00243 }
00244
00245 e = write(buf, size, n);
00246
00247 es = seek(was, SEEK_AT_SET, newpos);
00248
00249 if (es.is_error() || newpos != was)
00250 cerr << "Warning: pwrite reposition failed!"
00251 << endl << e << endl;
00252
00253 transfered = n;
00254
00255 return e;
00256 }
00257 #endif
00258
00259
00260
00261 w_rc_t sdisk_t::sync()
00262 {
00263 return RCOK;
00264 }
00265
00266
00267 w_rc_t sdisk_t::stat(filestat_t &)
00268 {
00269 return RC(fcNOTIMPLEMENTED);
00270 }
00271