Skip to content

Commit 0e0da1a

Browse files
committed
exmdb: split HX_dirname+mkdir logic from cu_cid_writeout
References: GXL-411
1 parent 87ae829 commit 0e0da1a

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

exch/exmdb/common_util.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2992,14 +2992,9 @@ static errno_t cu_cid_writeout(const char *maildir, std::string_view data,
29922992
maildir = exmdb_server::get_dir();
29932993
path = maildir + "/cid/"s + hval.str();
29942994
cid = hval.str();
2995-
std::unique_ptr<char[], stdlib_delete> extradir(HX_dirname(path.c_str()));
2996-
if (extradir == nullptr) {
2997-
mlog(LV_ERR, "E-5318: ENOMEM");
2998-
return ENOMEM;
2999-
}
3000-
auto ret = HX_mkdir(extradir.get(), FMODE_PRIVATE | S_IXUSR | S_IXGRP);
2995+
auto ret = gx_mkbasedir(path.c_str(), FMODE_PRIVATE);
30012996
if (ret < 0) {
3002-
mlog(LV_ERR, "E-2009: mkdir %s: %s", extradir.get(), strerror(-ret));
2997+
mlog(LV_ERR, "E-2009: mkbasedir for %s: %s", path.c_str(), strerror(-ret));
30032998
return -ret;
30042999
}
30053000

include/gromox/fileio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,6 @@ extern GX_EXPORT std::string base64_encode(const std::string_view &);
9797
extern GX_EXPORT std::string base64_decode(const std::string_view &);
9898
extern GX_EXPORT std::string sss_obf_reverse(const std::string_view &);
9999
extern GX_EXPORT int haproxy_intervene(int fd, unsigned int level, struct sockaddr_storage *);
100+
extern GX_EXPORT int gx_mkbasedir(const char *file, unsigned int mode);
100101

101102
}

lib/rfbl.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,6 +1800,25 @@ int ece2nerrno(ec_error_t e)
18001800
}
18011801
}
18021802

1803+
/**
1804+
* Given a file path, create all directories leading up to it.
1805+
* @mode: desired mode of directory (+x is always auto-added)
1806+
*/
1807+
int gx_mkbasedir(const char *file, unsigned int mode)
1808+
{
1809+
std::unique_ptr<char[], stdlib_delete> base(HX_dirname(file));
1810+
if (base == nullptr)
1811+
return ENOMEM;
1812+
if (mode & (S_IRUSR | S_IWUSR))
1813+
mode |= S_IXUSR;
1814+
if (mode & (S_IRGRP | S_IWGRP))
1815+
mode |= S_IXGRP;
1816+
if (mode & (S_IROTH | S_IWOTH))
1817+
mode |= S_IXOTH;
1818+
auto ret = HX_mkdir(base.get(), mode);
1819+
return ret < 0 ? -ret : 0;
1820+
}
1821+
18031822
}
18041823

18051824
int XARRAY::append(MITEM &&ptr, unsigned int tag) try

0 commit comments

Comments
 (0)