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

use resolve tree Master file to deal with the current one

parent 942e6ec1
No related branches found
No related tags found
No related merge requests found
......@@ -142,7 +142,7 @@ extern int tree_isvalid(char const *base, char const *treename) ;
/** Append @tree with the name of the current tree
* @Return 1 on success
* @Return 0 on fail */
extern int tree_find_current(stralloc *tree, char const *base, uid_t owner) ;
extern int tree_find_current(stralloc *tree, char const *base) ;
/** @Return 1 on success
* @Return 0 if not valid
......@@ -170,14 +170,6 @@ extern int tree_copy(stralloc *dir, char const *tree,char const *treename) ;
extern int tree_copy_tmp(char const *workdir, ssexec_t *info) ;
/** Set the tree to use as current for 66 tools
* This is avoid to use the -t options for all 66 tools
* Search on @base the directory current and append @tree
* with the path.
* @Return 1 on success
* @Return 0 on fail */
extern int tree_find_current(stralloc *tree, char const *base, uid_t owner) ;
extern int tree_get_permissions(char const *tree, uid_t owner) ;
extern int tree_sethome(ssexec_t *info) ;
......
......@@ -50,35 +50,28 @@ int tree_isvalid(char const *base, char const *treename)
return 1 ;
}
int tree_find_current(stralloc *tree, char const *base, uid_t owner)
int tree_find_current(stralloc *tree, char const *base)
{
log_flow() ;
ssize_t r ;
int e = 0 ;
size_t baselen = strlen(base) ;
char pack[UID_FMT] ;
uint32_pack(pack,owner) ;
size_t packlen = uint_fmt(pack,owner) ;
pack[packlen] = 0 ;
char t[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + 1 + SS_TREE_CURRENT_LEN + 1] ;
auto_strings(t, base, SS_TREE_CURRENT, "/", pack, "/", SS_TREE_CURRENT) ;
r = scan_mode(t,S_IFDIR) ;
if(r <= 0)
return 0 ;
resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
char t[baselen + SS_SYSTEM_LEN + 1] ;
r = sarealpath(tree,t) ;
if (r < 0 )
return 0 ;
auto_strings(t, base, SS_SYSTEM) ;
if (!stralloc_0(tree))
return 0 ;
if (!resolve_read(wres, t, SS_MASTER + 1))
goto err ;
tree->len--;
if (!auto_stra(tree, base, SS_SYSTEM, "/", mres.sa.s + mres.current))
goto err ;
return 1 ;
e = 1 ;
err:
resolve_free(wres) ;
return e ;
}
int tree_iscurrent(char const *base, char const *treename)
......@@ -87,8 +80,8 @@ int tree_iscurrent(char const *base, char const *treename)
int e = -1 ;
size_t baselen = strlen(base) ;
resolve_tree_t tres = RESOLVE_TREE_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
char t[baselen + SS_SYSTEM_LEN + 1] ;
auto_strings(t, base, SS_SYSTEM) ;
......@@ -96,7 +89,7 @@ int tree_iscurrent(char const *base, char const *treename)
if (!resolve_read(wres, t, SS_MASTER + 1))
goto err ;
if (!strcmp(tres.sa.s + tres.current, treename))
if (!strcmp(mres.sa.s + mres.current, treename))
e = 1 ;
else
e = 0 ;
......@@ -135,8 +128,8 @@ int tree_isenabled(char const *base, char const *treename)
int e = -1 ;
size_t baselen = strlen(base), pos = 0 ;
stralloc sa = STRALLOC_ZERO ;
resolve_tree_t tres = RESOLVE_TREE_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
char solve[baselen + SS_SYSTEM_LEN + 1] ;
auto_strings(solve, base, SS_SYSTEM) ;
......@@ -144,9 +137,9 @@ int tree_isenabled(char const *base, char const *treename)
if (!resolve_read(wres, solve, SS_MASTER + 1))
goto err ;
if (tres.nenabled) {
if (mres.nenabled) {
if (!sastr_clean_string(&sa, tres.sa.s + tres.enabled))
if (!sastr_clean_string(&sa, mres.sa.s + mres.enabled))
goto err ;
e = 0 ;
......
......@@ -46,7 +46,7 @@ int tree_sethome(ssexec_t *info)
if (!info->treename.len) {
if (!tree_find_current(&info->tree, base, owner))
if (!tree_find_current(&info->tree, base))
return -3 ;
if (!tree_setname(&info->treename,info->tree.s))
......
......@@ -15,59 +15,25 @@
#include <66/tree.h>
#include <sys/types.h>
#include <stddef.h>
#include <string.h>
#include <oblibs/string.h>
#include <oblibs/directory.h>
#include <oblibs/types.h>
#include <oblibs/log.h>
#include <skalibs/stralloc.h>
#include <skalibs/types.h>
#include <skalibs/unix-transactional.h>
#include <66/config.h>
#include <66/constants.h>
#include <66/utils.h>
#include <66/resolve.h>
int tree_switch_current(char const *base, char const *treename)
{
log_flow() ;
ssize_t r ;
size_t baselen = strlen(base), treelen = strlen(treename), newlen = 0, packlen = 0 ;
resolve_tree_t tres = RESOLVE_TREE_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
char pack[UID_FMT] ;
char dst[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + treelen + 2 + 1] ;
packlen = uint_fmt(pack,MYUID) ;
pack[packlen] = 0 ;
auto_strings(dst,base,SS_SYSTEM,"/",treename) ;
r = scan_mode(dst,S_IFDIR) ;
if (r <= 0) return 0 ;
auto_string_from(dst,baselen,SS_TREE_CURRENT,"/",pack) ;
newlen = baselen + SS_TREE_CURRENT_LEN + 1 + packlen ;
r = scan_mode(dst,S_IFDIR) ;
if (!r){
if (!dir_create_parent(dst,0755)) return 0 ;
}
if(r == -1) return 0 ;
char current[newlen + 1 + SS_TREE_CURRENT_LEN + 1] ;
auto_strings(current,dst,"/",SS_TREE_CURRENT) ;
auto_string_from(dst,baselen,SS_SYSTEM,"/",treename) ;
if (!atomic_symlink(dst, current,"tree_switch_current")) return 0 ;
size_t baselen = strlen(base), treelen = strlen(treename) ;
resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
if (!resolve_modify_field_g(wres, base, SS_MASTER + 1, TREE_ENUM_CURRENT, treename))
log_warnu_return(LOG_EXIT_ZERO, "modify field: ", resolve_tree_field_table[TREE_ENUM_CURRENT].field," of tree: ", SS_MASTER + 1, " with value: ", treename) ;
if (!resolve_modify_field_g(wres, base, SS_MASTER + 1, TREE_ENUM_MASTER_CURRENT, treename))
log_warnu_return(LOG_EXIT_ZERO, "modify field: ", resolve_tree_master_field_table[TREE_ENUM_MASTER_CURRENT].field," of inner resolve file with value: ", treename) ;
resolve_free(wres) ;
......
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