This is Unofficial EPICS BASE Doxygen Site
epicsMemFs.c File Reference
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include "epicsMemFs.h"
+ Include dependency graph for epicsMemFs.c:

Go to the source code of this file.

Macros

#define PATH_MAX   100
 

Functions

int epicsMemFsLoad (const epicsMemFS *fs)
 

Macro Definition Documentation

#define PATH_MAX   100

Definition at line 19 of file epicsMemFs.c.

Function Documentation

int epicsMemFsLoad ( const epicsMemFS fs)

Definition at line 22 of file epicsMemFs.c.

23 {
24  char initdir[PATH_MAX];
25  const epicsMemFile * const *fileptr = fs->files;
26 
27  if(getcwd(initdir, sizeof(initdir)-1)==NULL) {
28  perror("getcwd");
29  return errno;
30  }
31  initdir[sizeof(initdir)-1] = '\0';
32 
33  for(;*fileptr; fileptr++) {
34  const epicsMemFile *curfile = *fileptr;
35  int fd;
36  ssize_t ret;
37  size_t sofar;
38  const char * const *dir = curfile->directory;
39  /* jump back to the root each time,
40  * slow but simple.
41  */
42  if(chdir(initdir)) {
43  perror("chdir");
44  return errno;
45  }
46 
47  printf("-> /");
48 
49  /* traverse directory tree, creating as necessary */
50  for(;*dir; dir++) {
51  int ret;
52  if(**dir=='.') continue; /* ignore '.' and '..' */
53  printf("%s/", *dir);
54  ret = chdir(*dir);
55  if(ret==-1 && errno==ENOENT) {
56  /* this directory doesn't exist */
57  if(mkdir(*dir,0744)==-1) {
58  printf("\n");
59  perror("mkdir");
60  return errno;
61  }
62  if(chdir(*dir)==-1) {
63  printf("\n");
64  perror("chdir2");
65  return errno;
66  }
67  } else if(ret==-1) {
68  printf("\n");
69  perror("chdir1");
70  return errno;
71  }
72  }
73 
74  /* no file name creates an empty directory */
75  if(!curfile->name) {
76  printf("\n");
77  continue;
78  }
79  printf("%s", curfile->name);
80 
81  /* create or overwrite */
82  fd = open(curfile->name, O_WRONLY|O_CREAT|O_TRUNC, 0644);
83 
84  if(fd==-1) {
85  printf("\n");
86  perror("open");
87  return errno;
88  }
89 
90  sofar = 0;
91 
92  while(sofar<curfile->size) {
93  ret = write(fd, curfile->data+sofar, curfile->size-sofar);
94  if(ret<=0) {
95  printf("\n");
96  perror("write");
97  return errno;
98  }
99  sofar += ret;
100  }
101 
102  close(fd);
103  printf(" - ok\n");
104  }
105 
106  if(chdir(initdir))
107  perror("chdir");
108 
109  return 0;
110 }
size_t size
Definition: epicsMemFs.h:15
#define PATH_MAX
Definition: epicsMemFs.c:19
const char * data
Definition: epicsMemFs.h:14
#define printf
Definition: epicsStdio.h:41
#define NULL
Definition: catime.c:38
const char *const * directory
Definition: epicsMemFs.h:12
const char * name
Definition: epicsMemFs.h:13
const epicsMemFile *const * files
Definition: epicsMemFs.h:19