Files
epics-base/modules/libcom/RTEMS/epicsMemFs.c
Andrew Johnson 3c99391d93 Added SPDX License ID to all EPICS-original source files
In some cases the license-identification header was missing,
so I added that as well. Replaced the remaining headers that
specifically identified "Versions 3.13.7 and higher".

Makefiles and the build system were deliberately excluded.
2020-08-03 11:53:01 -05:00

112 lines
2.8 KiB
C

/*************************************************************************\
* Copyright (c) 2014 Brookhaven National Laboratory.
* SPDX-License-Identifier: EPICS
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#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"
#ifndef PATH_MAX
# define PATH_MAX 100
#endif
int epicsMemFsLoad(const epicsMemFS *fs)
{
char initdir[PATH_MAX];
const epicsMemFile * const *fileptr = fs->files;
if(getcwd(initdir, sizeof(initdir)-1)==NULL) {
perror("getcwd");
return errno;
}
initdir[sizeof(initdir)-1] = '\0';
for(;*fileptr; fileptr++) {
const epicsMemFile *curfile = *fileptr;
int fd;
ssize_t ret;
size_t sofar;
const char * const *dir = curfile->directory;
/* jump back to the root each time,
* slow but simple.
*/
if(chdir(initdir)) {
perror("chdir");
return errno;
}
printf("-> /");
/* traverse directory tree, creating as necessary */
for(;*dir; dir++) {
int ret;
if(**dir=='.') continue; /* ignore '.' and '..' */
printf("%s/", *dir);
ret = chdir(*dir);
if(ret==-1 && errno==ENOENT) {
/* this directory doesn't exist */
if(mkdir(*dir,0744)==-1) {
printf("\n");
perror("mkdir");
return errno;
}
if(chdir(*dir)==-1) {
printf("\n");
perror("chdir2");
return errno;
}
} else if(ret==-1) {
printf("\n");
perror("chdir1");
return errno;
}
}
/* no file name creates an empty directory */
if(!curfile->name) {
printf("\n");
continue;
}
printf("%s", curfile->name);
/* create or overwrite */
fd = open(curfile->name, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if(fd==-1) {
printf("\n");
perror("open");
return errno;
}
sofar = 0;
while(sofar<curfile->size) {
ret = write(fd, curfile->data+sofar, curfile->size-sofar);
if(ret<=0) {
printf("\n");
perror("write");
return errno;
}
sofar += ret;
}
close(fd);
printf(" - ok\n");
}
if(chdir(initdir))
perror("chdir");
return 0;
}