FreeCalypso > hg > freecalypso-sw
comparison rvinterf/etmsync/fileio.c @ 910:d1333db6385f
rvinterf/etmsync refactoring: operation functions consolidated in fileio.c
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Tue, 08 Sep 2015 06:34:02 +0000 |
parents | ffeea2f9d149 |
children |
comparison
equal
deleted
inserted
replaced
909:16ed75e266f2 | 910:d1333db6385f |
---|---|
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <string.h> | 8 #include <string.h> |
9 #include <strings.h> | 9 #include <strings.h> |
10 #include "etm.h" | 10 #include "etm.h" |
11 #include "ffs.h" | 11 #include "ffs.h" |
12 #include "ffserr.h" | |
12 #include "tmffs2.h" | 13 #include "tmffs2.h" |
13 #include "limits.h" | 14 #include "limits.h" |
14 #include "localtypes.h" | 15 #include "localtypes.h" |
15 #include "localstruct.h" | 16 #include "localstruct.h" |
16 #include "exitcodes.h" | 17 #include "exitcodes.h" |
235 report_ffs_err("short file write", rvi_msg[3]); | 236 report_ffs_err("short file write", rvi_msg[3]); |
236 return(ERROR_TARGET); | 237 return(ERROR_TARGET); |
237 } | 238 } |
238 return(0); | 239 return(0); |
239 } | 240 } |
241 | |
242 do_opendir(pathname, statertn, countrtn) | |
243 char *pathname; | |
244 u_char *statertn; | |
245 int *countrtn; | |
246 { | |
247 u_char cmdpkt[MAX_PKT_TO_TARGET], *dp; | |
248 int rc, slen; | |
249 | |
250 slen = strlen(pathname); | |
251 if (slen >= TMFFS_STRING_SIZE) { | |
252 printf("error: pathname arg exceeds string length limit\n"); | |
253 return(ERROR_USAGE); | |
254 } | |
255 dp = cmdpkt + 1; | |
256 *dp++ = ETM_FFS2; | |
257 *dp++ = TMFFS_OPENDIR; | |
258 *dp++ = slen + 1; | |
259 strcpy(dp, pathname); | |
260 dp += slen + 1; | |
261 rc = etm_pkt_exch(cmdpkt, dp - cmdpkt - 1); | |
262 if (rc) | |
263 return(rc); | |
264 if (rvi_msg[3]) { | |
265 report_ffs_err("opendir", rvi_msg[3]); | |
266 return(ERROR_TARGET); | |
267 } | |
268 if (rvi_msg_len != 11 || rvi_msg[5] != 4) { | |
269 printf("error: opendir response has wrong length\n"); | |
270 return(ERROR_TARGET); | |
271 } | |
272 *countrtn = rvi_msg[4]; | |
273 bcopy(rvi_msg + 6, statertn, 4); | |
274 return(0); | |
275 } | |
276 | |
277 do_readdir(state, namebuf, namebuflen) | |
278 u_char *state; | |
279 char *namebuf; | |
280 { | |
281 u_char cmdpkt[10]; | |
282 int rc, slen; | |
283 | |
284 cmdpkt[1] = ETM_FFS2; | |
285 cmdpkt[2] = TMFFS_READDIR; | |
286 cmdpkt[3] = 4; | |
287 bcopy(state, cmdpkt+4, 4); | |
288 cmdpkt[8] = TMFFS_STRING_SIZE; | |
289 rc = etm_pkt_exch(cmdpkt, 8); | |
290 if (rc) | |
291 return(rc); | |
292 if (rvi_msg[3]) { | |
293 report_ffs_err("readdir", rvi_msg[3]); | |
294 return(ERROR_TARGET); | |
295 } | |
296 if (rvi_msg_len < 14) { | |
297 malformed: printf("error: readdir response is malformed\n"); | |
298 return(ERROR_TARGET); | |
299 } | |
300 if (rvi_msg[5] != 4) | |
301 goto malformed; | |
302 slen = rvi_msg[10]; | |
303 if (slen < 2 || rvi_msg_len != slen + 12) | |
304 goto malformed; | |
305 if (slen > namebuflen) { | |
306 printf("error: readdir response exceeds provided buffer\n"); | |
307 return(ERROR_TARGET); | |
308 } | |
309 if (rvi_msg[11 + slen - 1]) /* must be terminating NUL */ | |
310 goto malformed; | |
311 bcopy(rvi_msg + 6, state, 4); | |
312 strcpy(namebuf, rvi_msg + 11); | |
313 return(0); | |
314 } | |
315 | |
316 do_xlstat(pathname, result) | |
317 char *pathname; | |
318 struct stat_info *result; | |
319 { | |
320 u_char cmdpkt[MAX_PKT_TO_TARGET], *dp; | |
321 int rc, slen; | |
322 | |
323 slen = strlen(pathname); | |
324 if (slen >= TMFFS_STRING_SIZE) { | |
325 printf("error: pathname arg exceeds string length limit\n"); | |
326 return(ERROR_USAGE); | |
327 } | |
328 dp = cmdpkt + 1; | |
329 *dp++ = ETM_FFS2; | |
330 *dp++ = TMFFS_XLSTAT; | |
331 *dp++ = slen + 1; | |
332 strcpy(dp, pathname); | |
333 dp += slen + 1; | |
334 rc = etm_pkt_exch(cmdpkt, dp - cmdpkt - 1); | |
335 if (rc) | |
336 return(rc); | |
337 if (rvi_msg[3]) { | |
338 report_ffs_err("xlstat", rvi_msg[3]); | |
339 return(ERROR_TARGET); | |
340 } | |
341 if (rvi_msg_len != 30 || rvi_msg[4] != 24) { | |
342 printf("error: xlstat response has wrong length\n"); | |
343 return(ERROR_TARGET); | |
344 } | |
345 result->type = rvi_msg[5]; | |
346 result->flags = rvi_msg[6]; | |
347 result->inode = rvi_msg[7] | rvi_msg[8] << 8; | |
348 result->size = rvi_msg[9] | rvi_msg[10] << 8 | rvi_msg[11] << 16 | | |
349 rvi_msg[12] << 24; | |
350 result->space = rvi_msg[13] | rvi_msg[14] << 8 | rvi_msg[15] << 16 | | |
351 rvi_msg[16] << 24; | |
352 result->location = rvi_msg[17] | rvi_msg[18] << 8 | rvi_msg[19] << 16 | | |
353 rvi_msg[20] << 24; | |
354 result->block = rvi_msg[22]; | |
355 result->sequence = rvi_msg[23] | rvi_msg[24] << 8; | |
356 result->updates = rvi_msg[25] | rvi_msg[26] << 8; | |
357 return(0); | |
358 } | |
359 | |
360 do_mkdir_existok(pathname) | |
361 char *pathname; | |
362 { | |
363 u_char cmdpkt[MAX_PKT_TO_TARGET], *dp; | |
364 int rc, slen; | |
365 struct stat_info stat; | |
366 | |
367 slen = strlen(pathname); | |
368 if (slen >= TMFFS_STRING_SIZE) { | |
369 printf("error: pathname arg exceeds string length limit\n"); | |
370 return(ERROR_USAGE); | |
371 } | |
372 dp = cmdpkt + 1; | |
373 *dp++ = ETM_FFS2; | |
374 *dp++ = TMFFS_MKDIR; | |
375 *dp++ = slen + 1; | |
376 strcpy(dp, pathname); | |
377 dp += slen + 1; | |
378 rc = etm_pkt_exch(cmdpkt, dp - cmdpkt - 1); | |
379 if (rc) | |
380 return(rc); | |
381 if (rvi_msg_len != 5) { | |
382 printf("error: mkdir response has wrong length\n"); | |
383 return(ERROR_TARGET); | |
384 } | |
385 if (!rvi_msg[3]) /* success */ | |
386 return(0); | |
387 if (rvi_msg[3] != TMFFS_ERR_EXISTS) { | |
388 report_ffs_err("mkdir", rvi_msg[3]); | |
389 return(ERROR_TARGET); | |
390 } | |
391 /* object already exists: OK if it's a directory, error otherwise */ | |
392 rc = do_xlstat(pathname, &stat); | |
393 if (rc) | |
394 return(rc); | |
395 if (stat.type == OT_DIR) | |
396 return(0); | |
397 else { | |
398 printf("error: %s exists and is not a directory\n", pathname); | |
399 return(ERROR_TARGET); | |
400 } | |
401 } |