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 }