Skip to content
Snippets Groups Projects
Commit 99d06ff2 authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

create/copy/delete live/run/state

parent 6ea81be1
No related branches found
No related tags found
No related merge requests found
......@@ -18,6 +18,8 @@
#include <oblibs/string.h>
#include <oblibs/error2.h>
#include <oblibs/directory.h>
#include <oblibs/types.h>
#include <skalibs/stralloc.h>
#include <skalibs/djbunix.h>
......@@ -35,10 +37,12 @@ void err(unsigned int *e, unsigned int msg,char const *resolve,char const *swap,
break ;
case 1: strerr_warnwu1x("set revolve pointer to backup") ;
break ;
case 2: strerr_warnwu4sys("to copy tree: ",resolve," to ", swap) ;
case 2: strerr_warnwu4sys("copy : ",svdir," to ", resolve) ;
break ;
case 3: strerr_warnwu2sys("remove directory: ", svdir) ;
break ;
case 4: strerr_warnwu1x("set revolve pointer to live") ;
break ;
default: break ;
}
*e = 0 ;
......@@ -49,7 +53,9 @@ int tree_copy_tmp(char const *workdir, ssexec_t *info)
stralloc saresolve = STRALLOC_ZERO ;
stralloc swap = STRALLOC_ZERO ;
unsigned int e = 1 ;
int r ;
size_t svdirlen ;
size_t newlen ;
char svdir[info->tree.len + SS_SVDIRS_LEN + SS_RESOLVE_LEN + 1] ;
memcpy(svdir,info->tree.s,info->tree.len) ;
......@@ -58,6 +64,12 @@ int tree_copy_tmp(char const *workdir, ssexec_t *info)
memcpy(svdir + svdirlen,SS_SVC, SS_SVC_LEN) ;
svdir[svdirlen + SS_SVC_LEN] = 0 ;
size_t workdirlen = strlen(workdir) ;
char resolve[workdirlen + SS_RESOLVE_LEN + 1] ;
memcpy(resolve,workdir,workdirlen) ;
memcpy(resolve + workdirlen, SS_RESOLVE,SS_RESOLVE_LEN) ;
resolve[workdirlen + SS_RESOLVE_LEN] = 0 ;
/** svc */
if (rm_rf(svdir) < 0)
{
......@@ -135,7 +147,8 @@ int tree_copy_tmp(char const *workdir, ssexec_t *info)
err(&e,3,saresolve.s,swap.s,svdir) ;
goto err ;
}
svdir[svdirlen] = 0 ;
if (!hiercopy(workdir,svdir))
......@@ -155,10 +168,66 @@ int tree_copy_tmp(char const *workdir, ssexec_t *info)
err(&e,2,saresolve.s,swap.s,svdir) ;
goto err ;
}
err(&e,3,saresolve.s,swap.s,svdir) ;
err(&e,2,saresolve.s,swap.s,svdir) ;
goto err ;
}
/** resolve in live */
if (!ss_resolve_pointo(&saresolve,info,SS_NOTYPE,SS_RESOLVE_LIVE))
{
err(&e,0,saresolve.s,swap.s,resolve) ;
goto err ;
}
newlen = saresolve.len ;
saresolve.len--;
if (!stralloc_cats(&saresolve,SS_RESOLVE)) goto err ;
if (!stralloc_0(&saresolve)) goto err ;
r = scan_mode(saresolve.s,S_IFDIR) ;
if (r < 0) strerr_dief2x(111,resolve," conflicting format") ;
if (!r)
{
saresolve.len = newlen ;
if (!stralloc_0(&saresolve)) goto err ;
VERBO2 strerr_warni3x("create directory: ",saresolve.s,SS_RESOLVE+1) ;
r = dir_create_under(saresolve.s,SS_RESOLVE+1,0700) ;
if (!r) strerr_diefu3sys(111,"create directory: ",saresolve.s,SS_RESOLVE+1) ;
}
saresolve.len = newlen ;
if (!stralloc_cats(&saresolve,SS_RESOLVE)) goto err ;
if (!stralloc_0(&saresolve)) goto err ;
if (!ss_resolve_pointo(&swap,info,SS_NOTYPE,SS_RESOLVE_BACK))
{
err(&e,1,saresolve.s,swap.s,resolve) ;
goto err ;
}
swap.len--;
if (!stralloc_cats(&swap,SS_RESOLVE)) goto err ;
if (!stralloc_0(&swap)) goto err ;
if (rm_rf(saresolve.s) < 0)
{
if (!hiercopy(swap.s,saresolve.s))
{
err(&e,2,saresolve.s,swap.s,resolve) ;
goto err ;
}
err(&e,2,saresolve.s,swap.s,resolve) ;
goto err ;
}
if (!hiercopy(resolve,saresolve.s))
{
if (!hiercopy(swap.s,saresolve.s))
{
err(&e,2,saresolve.s,swap.s,resolve) ;
goto err ;
}
err(&e,2,saresolve.s,swap.s,resolve) ;
goto err ;
}
err:
stralloc_free(&saresolve) ;
stralloc_free(&swap) ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment