static sg_error set_valid_filesystems(char const *fslist) { char const **newfs; char const **given_fs; while(sg_is_spc(*fslist)) ++fslist; if('!' == *fslist) { size_t new_items = 0, given_items = 0; const char **old_valid_fs = sg_get_valid_filesystems(0); if( NULL == old_valid_fs ) sg_die("sg_get_valid_filesystems()", 1); ++fslist; while(*fslist && sg_is_spc(*fslist)) ++fslist; given_fs = split_list(fslist); for(newfs = given_fs; *newfs; ++newfs) { ++given_items; } qsort(given_fs, given_items, sizeof(given_fs[0]), fsnmcmp); newfs = NULL; new_items = 0; while(*old_valid_fs) { if (NULL == bsearch(old_valid_fs, given_fs, given_items, sizeof(given_fs[0]), fsnmcmp)) { newfs = push_item(newfs, *old_valid_fs, new_items++); } ++old_valid_fs; } newfs = push_item(newfs, NULL, new_items); } else { newfs = given_fs = split_list(fslist); } if( SG_ERROR_NONE != sg_set_valid_filesystems( newfs ) ) sg_die("sg_set_valid_filesystems() failed", 1); for(newfs = given_fs; *newfs; ++newfs) { free((void *)(*newfs)); } return SG_ERROR_NONE; }
bool DataSourceStatgrab::InitStatgrab() { if( SG_ERROR_NONE != sg_init(1) ) { report_sg_error("InitDataSourceStatgrab", "sg_init() failed"); return false; } const StatgrabSettings & sgs = Config::getInstance().getStatgrabSettings(); if( !sgs.ValidFilesystems.empty() ) { vector<const char *> newValidFs; set<string> buildValidFs; if( sgs.RemoveFilesystems ) { const char **old_valid_fs = sg_get_valid_filesystems(0); if( 0 == old_valid_fs ) { LOG_BEGIN(loggerModuleName, ERROR_LOG | 0); LOG("InitDataSourceStatgrab(): sg_get_valid_filesystems() failed"); LOG_END; return false; } while( *old_valid_fs ) { buildValidFs.insert(*old_valid_fs); ++old_valid_fs; } for( vector<string>::const_iterator iter = sgs.ValidFilesystems.begin(); iter != sgs.ValidFilesystems.end(); ++iter ) { set<string>::iterator jter = buildValidFs.find( *iter ); if( jter != buildValidFs.end() ) buildValidFs.erase(jter); } } else { for( vector<string>::const_iterator iter = sgs.ValidFilesystems.begin(); iter != sgs.ValidFilesystems.end(); ++iter ) { buildValidFs.insert(*iter); } } newValidFs.reserve( buildValidFs.size() + 1 ); for( set<string>::const_iterator iter = buildValidFs.begin(); iter != buildValidFs.end(); ++iter ) { newValidFs.push_back( iter->c_str() ); } newValidFs.push_back( 0 ); if( SG_ERROR_NONE != sg_set_valid_filesystems( &newValidFs[0] ) ) { report_sg_error("InitDataSourceStatgrab", "sg_set_valid_filesystems() failed"); return false; } } return true; }