diff --git a/libStructDiv/src/filebased.cpp b/libStructDiv/src/filebased.cpp index 67fdfa51931044686e8f5eca7bba41712121848a..78b50f0a28068d688843eebe860ddb4042447497 100644 --- a/libStructDiv/src/filebased.cpp +++ b/libStructDiv/src/filebased.cpp @@ -18,7 +18,9 @@ using namespace std; using namespace libStructDiv; -void ignore_result(int /* res */ ) {} + +template <class T> +void ignore_result(T /* res */ ) {} template<typename T> std::string toString(const T& value) @@ -47,33 +49,47 @@ FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t(string key, int m_shared_dir=p_config; // check path exists. - struct stat info; + struct stat info = {}; if( stat(m_shared_dir.c_str(), &info ) != 0 ) { // dir doesn't exist, make it. if(mkdir(m_shared_dir.c_str(),0755)!=0) { - perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t"); - cerr<<"Cannot create dir:"<<endl; - exit(1); + // OK if this fails, because maybe another variant did it since we last checked. } } - else + + // but now, _we_ have tried to make the dir, and so it should be there, or we give up. + if( stat(m_shared_dir.c_str(), &info ) != 0 ) { - // dir exists, - // remove any old Barriers file for my variant.. - string base_filespec=m_shared_dir+"/Barriers_"+uname+"_"+GetKey()+"_*_"+toString(GetVariantID())+".*"; - string rm_cmd="/bin/rm -f "+base_filespec; - int res=system(rm_cmd.c_str()); - if(res!=0) - { - perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t"); - cerr<<"Cannot remove files, cmd="<<rm_cmd<<endl; - exit(1); - } - + // at this point, we tried to make it and couldn't. + // and no one else did either. Thus, it's an error. + perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t"); + cerr<<"Cannot create dir:"<<m_shared_dir<<endl; + exit(1); + } + + if(!S_ISDIR(info.st_mode)) + { + cerr<<"FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t: " + <<m_shared_dir<<" is not a directory."<<endl; + exit(1); } + + + // dir exists, + // remove any old Barriers file for my variant.. + string base_filespec=m_shared_dir+"/Barriers_"+uname+"_"+GetKey()+"_*_"+toString(GetVariantID())+".*"; + string rm_cmd="/bin/rm -f "+base_filespec; + int res=system(rm_cmd.c_str()); + if(res!=0) + { + perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t"); + cerr<<"Cannot remove files, cmd="<<rm_cmd<<endl; + exit(1); + } + cout<<"Initing shared path: "<<m_shared_dir<<endl<<"Contents:"<<endl; string ls_cmd="ls "+m_shared_dir; ignore_result(system(ls_cmd.c_str()));