dtinfo subdirectory DtMmdb
This commit is contained in:
committed by
Jon Trulson
parent
0be684281d
commit
fbd81ef151
@@ -77,7 +77,9 @@ char* get_oid_2(info_lib* infolib_ptr, char* base_str, char* locator)
|
||||
if ( strcmp( this_node_locator, locator) == 0 ) {
|
||||
ostringstream strout(oid_in_string_buf, ios::out);
|
||||
x.its_oid().asciiOut(strout);
|
||||
strcpy(oid_in_string_buf, strout.str().c_str());
|
||||
int len = strout.str().size();
|
||||
*((char *) memcpy(oid_in_string_buf,
|
||||
strout.str().c_str(), len) + len) = '\0';
|
||||
} else {
|
||||
cerr << "dangling locator " << locator << "\n"
|
||||
<< "mismatches with " << this_node_locator << "\n"
|
||||
|
||||
@@ -29,7 +29,6 @@ extern "C"
|
||||
void showBook(DtMmdbInfoRequest* req)
|
||||
{
|
||||
const char* str = 0;
|
||||
int size = 0;
|
||||
DtMmdbHandle* id = 0;
|
||||
unsigned int l;
|
||||
int x ;
|
||||
@@ -59,7 +58,7 @@ void showBook(DtMmdbInfoRequest* req)
|
||||
|
||||
ids = DtMmdbBookGetTabList(req, &l);
|
||||
if (ids) {
|
||||
for ( x=0; x<l; x++ )
|
||||
for ( x=0; x<(int)l; x++ )
|
||||
fprintf(stderr, " bookInfo: tab section id=%s\n", DtMmdbHandleToString(ids[x]));
|
||||
}
|
||||
DtMmdbFreeHandleList(ids);
|
||||
@@ -70,9 +69,7 @@ extern "C"
|
||||
int test_book1(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int n = 0;
|
||||
int i = -1;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req = 0;
|
||||
|
||||
switch ( argc ) {
|
||||
@@ -102,10 +99,9 @@ extern "C"
|
||||
int test_book2(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int n = 0;
|
||||
int i = -1;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req = 0;
|
||||
|
||||
switch ( argc ) {
|
||||
case 5:
|
||||
{
|
||||
@@ -133,10 +129,9 @@ extern "C"
|
||||
int test_book3(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int n = 0;
|
||||
int i = -1;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req = 0;
|
||||
|
||||
switch ( argc ) {
|
||||
case 5:
|
||||
{
|
||||
|
||||
@@ -271,6 +271,8 @@ int auto_test_c_api(int argc, char** argv)
|
||||
return -1;
|
||||
}
|
||||
end_try;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -332,7 +334,7 @@ char* DtMmdbHandleToString(DtMmdbHandle* x)
|
||||
static char buf[100];
|
||||
if ( x -> oid_ptr) {
|
||||
oid_t *z = (oid_t*)(x -> oid_ptr);
|
||||
sprintf(buf, "%d.%d", z -> ccode(), (int)z -> icode());
|
||||
snprintf(buf, sizeof(buf), "%d.%d", z -> ccode(), (int)z -> icode());
|
||||
} else
|
||||
buf[0] = 0;
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ int test_dlp(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req ;
|
||||
|
||||
switch ( argc ) {
|
||||
|
||||
@@ -31,7 +31,7 @@ void showGraphic(DtMmdbInfoRequest* req)
|
||||
{
|
||||
const char* str;
|
||||
unsigned int l;
|
||||
int i;
|
||||
unsigned int i;
|
||||
DtMmdbGraphicInfo* info ;
|
||||
|
||||
if ( req == 0 ) return ;
|
||||
@@ -68,7 +68,6 @@ int test_graphic1(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req;
|
||||
|
||||
switch ( argc ) {
|
||||
@@ -99,7 +98,6 @@ int test_graphic2(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req;
|
||||
|
||||
switch ( argc ) {
|
||||
|
||||
@@ -56,8 +56,6 @@ DtMmdbOpenInfoLib(
|
||||
{
|
||||
mtry {
|
||||
|
||||
Boolean option = (delayed_infolib_init == DtMmdbTrue) ? true : false;
|
||||
|
||||
mmdb_ptr = new OLIAS_DB;
|
||||
info_lib* x = mmdb_ptr -> openInfoLib(infolib_path, selected_base_name);
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ int test_loc1(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req;
|
||||
|
||||
switch ( argc ) {
|
||||
@@ -80,7 +79,6 @@ int test_loc2(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req ;
|
||||
|
||||
switch ( argc ) {
|
||||
|
||||
@@ -75,9 +75,7 @@ extern "C"
|
||||
int test2(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int n = 0;
|
||||
int i = -1;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req = 0;
|
||||
|
||||
switch ( argc ) {
|
||||
@@ -106,10 +104,9 @@ extern "C"
|
||||
int test3(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int n = 0;
|
||||
int i = -1;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req = 0;
|
||||
|
||||
switch ( argc ) {
|
||||
case 5:
|
||||
{
|
||||
|
||||
@@ -49,7 +49,6 @@ int test_ss1(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req ;
|
||||
|
||||
switch ( argc ) {
|
||||
@@ -80,7 +79,6 @@ int test_ss2(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req ;
|
||||
|
||||
switch ( argc ) {
|
||||
|
||||
@@ -156,7 +156,7 @@ char* DtMmdbHandleToString(DtMmdbHandle* x)
|
||||
static char buf[100];
|
||||
if ( x -> oid_ptr) {
|
||||
oid_t *z = (oid_t*)(x -> oid_ptr);
|
||||
sprintf(buf, "%d.%d", z -> ccode(), z -> icode());
|
||||
snprintf(buf, sizeof(buf), "%d.%d", z -> ccode(), z -> icode());
|
||||
} else
|
||||
buf[0] = 0;
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ void showTOC(DtMmdbInfoRequest* req)
|
||||
{
|
||||
DtMmdbHandle* id = 0;
|
||||
unsigned int ct = 0;
|
||||
int i = 0;
|
||||
unsigned int i = 0;
|
||||
DtMmdbHandle** ids = 0;
|
||||
|
||||
if ( req == 0 ) return ;
|
||||
@@ -59,7 +59,6 @@ int test4(int argc, char** argv)
|
||||
{
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
const char* str;
|
||||
DtMmdbInfoRequest* req = 0;
|
||||
|
||||
switch ( argc ) {
|
||||
|
||||
@@ -49,9 +49,9 @@ protected:
|
||||
oid_t get_oid(int index);
|
||||
|
||||
protected:
|
||||
int f_index;
|
||||
cset_handler* f_set_ptr;
|
||||
info_base* f_base;
|
||||
int f_index;
|
||||
};
|
||||
|
||||
// iterator over node set
|
||||
|
||||
@@ -184,6 +184,8 @@ const char* graphic_smart_ptr::title()
|
||||
return 0;
|
||||
}
|
||||
end_try;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int graphic_smart_ptr::type() const
|
||||
|
||||
@@ -71,7 +71,8 @@ int compare_graphic(graphic_smart_ptr& pattern, info_base* base_ptr)
|
||||
print_graphic(pattern, pattern_out, false);
|
||||
|
||||
char loc[BUFSIZ];
|
||||
strcpy(loc, pattern.locator());
|
||||
int len = MIN(strlen(pattern.locator()), BUFSIZ -1);
|
||||
*((char *) memcpy(loc, pattern.locator(), len) + len) = '\0';
|
||||
|
||||
graphic_smart_ptr x( base_ptr, loc );
|
||||
char db_buf[LARGE_BUFSIZ];
|
||||
|
||||
@@ -63,7 +63,7 @@ mark_base* get_mark_base(char* path, char* name)
|
||||
);
|
||||
}
|
||||
|
||||
catch (mmdbException &,e)
|
||||
catch (MMDBeXCEPtion &,e)
|
||||
{
|
||||
return 0;
|
||||
} end_try;
|
||||
|
||||
@@ -214,7 +214,7 @@ Boolean OLIAS_DB::real_destroy(const char* infoLibPath, const char* infoLibName)
|
||||
int major_mm_version = 0;
|
||||
int minor_mm_version = 0;
|
||||
|
||||
sprintf(buf, "%s/%s", infoLibPath, MAP_FILE_8_3);
|
||||
snprintf(buf, sizeof(buf), "%s/%s", infoLibPath, MAP_FILE_8_3);
|
||||
fstream in(buf, ios::in);
|
||||
|
||||
while ( in.getline(base_name, PATHSIZ, '\t') ) {
|
||||
|
||||
@@ -55,7 +55,8 @@ int compare_node(node_smart_ptr& pattern, info_base* base_ptr)
|
||||
print_node(pattern, pattern_out, false, false);
|
||||
|
||||
char loc[BUFSIZ];
|
||||
strcpy(loc, pattern.locator());
|
||||
int len = MIN(strlen(pattern.locator()), BUFSIZ - 1);
|
||||
*((char *) memcpy(loc, pattern.locator(), len) + len) = '\0';
|
||||
|
||||
node_smart_ptr x( base_ptr, loc );
|
||||
char db_buf[LARGE_BUFSIZ];
|
||||
|
||||
@@ -102,14 +102,14 @@ void insert_to_collection(c_code_t ccode, istream& in)
|
||||
coll_type obj_type = VOID;
|
||||
|
||||
abs_storage* store = 0;
|
||||
handler* hd = 0;
|
||||
// handler* hd = 0;
|
||||
|
||||
int i;
|
||||
for ( i = 0; i<SET_MAP_SZ ; i++ ) {
|
||||
if ( set_map[i].instance_class_code == ccode ) {
|
||||
obj_type = SET;
|
||||
store = set_map[i].collection_hd -> its_store();
|
||||
hd = set_map[i].collection_hd;
|
||||
// hd = set_map[i].collection_hd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -119,7 +119,7 @@ void insert_to_collection(c_code_t ccode, istream& in)
|
||||
if ( list_map[i].instance_class_code == ccode ) {
|
||||
obj_type = LIST;
|
||||
store = list_map[i].collection_hd -> its_store();
|
||||
hd = set_map[i].collection_hd;
|
||||
// hd = set_map[i].collection_hd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,7 +236,7 @@ int generate_stream(info_base* b_ptr, char* path, int num_sections, int min, int
|
||||
int stylesheets = x.pick_a_value(5, 20); // assume [5, 20] is the range
|
||||
|
||||
char buf[BUFSIZ];
|
||||
sprintf(buf, "%s/%s", path, TEST_STY_FILE);
|
||||
snprintf(buf, sizeof(buf), "%s/%s", path, TEST_STY_FILE);
|
||||
fstream stylesheet_stream(buf, ios::out);
|
||||
|
||||
if ( !stylesheet_stream )
|
||||
@@ -252,14 +252,14 @@ int generate_stream(info_base* b_ptr, char* path, int num_sections, int min, int
|
||||
|
||||
cerr << " sections ..." << endl;
|
||||
|
||||
sprintf(buf, "%s/%s", path, TEST_SEC_FILE);
|
||||
snprintf(buf, sizeof(buf), "%s/%s", path, TEST_SEC_FILE);
|
||||
fstream section_stream(buf, ios::out);
|
||||
|
||||
if ( !section_stream ) return -1;
|
||||
|
||||
|
||||
// prepare mixed stream
|
||||
sprintf(buf, "%s/%s", path, TEST_MIX_FILE);
|
||||
snprintf(buf, sizeof(buf), "%s/%s", path, TEST_MIX_FILE);
|
||||
fstream mix_stream(buf, ios::out);
|
||||
|
||||
if ( !mix_stream ) return -1;
|
||||
@@ -432,8 +432,8 @@ int auto_test(int argc, char** argv, OLIAS_DB& db)
|
||||
cerr << " loading stylesheets ..." << endl;
|
||||
char buf[256];
|
||||
char file_name[256];
|
||||
sprintf(buf, "%s.stylesheet", argv[4]);
|
||||
sprintf(file_name, "%s/%s", argv[2], TEST_STY_FILE);
|
||||
snprintf(buf, sizeof(buf), "%s.stylesheet", argv[4]);
|
||||
snprintf(file_name, sizeof(file_name), "%s/%s", argv[2], TEST_STY_FILE);
|
||||
|
||||
infolib_ptr = db.openInfoLib(argv[2]);
|
||||
base_ptr = infolib_ptr -> get_info_base(argv[4]);
|
||||
@@ -450,8 +450,8 @@ int auto_test(int argc, char** argv, OLIAS_DB& db)
|
||||
|
||||
// load sections (small component)
|
||||
cerr << " loading sections ..." << endl;
|
||||
sprintf(buf, "%s.node", argv[4]);
|
||||
sprintf(file_name, "%s/%s", argv[2], TEST_SEC_FILE);
|
||||
snprintf(buf, sizeof(buf), "%s.node", argv[4]);
|
||||
snprintf(file_name, sizeof(file_name), "%s/%s", argv[2], TEST_SEC_FILE);
|
||||
|
||||
infolib_ptr = db.openInfoLib(argv[2]);
|
||||
base_ptr = infolib_ptr -> get_info_base(argv[4]);
|
||||
@@ -467,7 +467,7 @@ int auto_test(int argc, char** argv, OLIAS_DB& db)
|
||||
|
||||
// load all other objects
|
||||
cerr << " loading all other objects ..." << endl;
|
||||
sprintf(file_name, "%s/%s", argv[2], TEST_MIX_FILE);
|
||||
snprintf(file_name, sizeof(file_name), "%s/%s", argv[2], TEST_MIX_FILE);
|
||||
fstream in(file_name, ios::in);
|
||||
|
||||
if ( !in ) return -1;
|
||||
@@ -490,7 +490,7 @@ int auto_test(int argc, char** argv, OLIAS_DB& db)
|
||||
base_ptr = infolib_ptr -> get_info_base(argv[4]);
|
||||
|
||||
// stylesheet
|
||||
sprintf(file_name, "%s/%s", argv[2], TEST_STY_FILE);
|
||||
snprintf(file_name, sizeof(file_name), "%s/%s", argv[2], TEST_STY_FILE);
|
||||
fstream ss_in(file_name, ios::in);
|
||||
|
||||
if ( !ss_in ) return -1;
|
||||
@@ -504,7 +504,7 @@ int auto_test(int argc, char** argv, OLIAS_DB& db)
|
||||
STDERR_MESSAGE("testing stylesheet data done\n");
|
||||
|
||||
// node
|
||||
sprintf(file_name, "%s/%s", argv[2], TEST_SEC_FILE);
|
||||
snprintf(file_name, sizeof(file_name), "%s/%s", argv[2], TEST_SEC_FILE);
|
||||
fstream nd_in(file_name, ios::in);
|
||||
if ( !nd_in ) return -1;
|
||||
|
||||
@@ -517,7 +517,7 @@ int auto_test(int argc, char** argv, OLIAS_DB& db)
|
||||
STDERR_MESSAGE("testing section done\n");
|
||||
|
||||
// all other
|
||||
sprintf(file_name, "%s/%s", argv[2], TEST_MIX_FILE);
|
||||
snprintf(file_name, sizeof(file_name), "%s/%s", argv[2], TEST_MIX_FILE);
|
||||
fstream all_in(file_name, ios::in);
|
||||
if ( !all_in ) return -1;
|
||||
|
||||
|
||||
@@ -44,7 +44,8 @@ int compare_stylesheet(stylesheet_smart_ptr& pattern, info_base* base_ptr)
|
||||
print_stylesheet(pattern, pattern_out);
|
||||
|
||||
char loc[BUFSIZ];
|
||||
strcpy(loc, pattern.name());
|
||||
int len = MIN(strlen(pattern.name()), BUFSIZ - 1);
|
||||
*((char *) memcpy(loc, pattern.name(), len) + len) = '\0';
|
||||
|
||||
stylesheet_smart_ptr x( base_ptr, loc );
|
||||
char db_buf[LARGE_BUFSIZ];
|
||||
@@ -61,7 +62,9 @@ void update_stylesheet_test(char* filename, info_base* base_ptr, char* locator)
|
||||
fstream in(filename, ios::in);
|
||||
while (in) {
|
||||
in.getline(buf, LBUFSIZ);
|
||||
strcat(st_buf, buf);
|
||||
int slen = strlen(st_buf);
|
||||
int len = MIN(strlen(buf), LBUFSIZ - 1 - slen);
|
||||
*((char *) memcpy(st_buf + slen, buf, len) + len) = '\0';
|
||||
}
|
||||
stylesheet_smart_ptr st(base_ptr, locator);
|
||||
st.update_online_data(st_buf, strlen(st_buf));
|
||||
|
||||
@@ -65,10 +65,11 @@ extern Boolean g_transaction_on;
|
||||
extern int g_mode_8_3;
|
||||
|
||||
user_base::user_base( const char* spec_path, rw_flag_t rw) :
|
||||
spec_name(spec_path), backup_file(0), rw_flag(rw), first_desc_ptr(0),
|
||||
base(0)
|
||||
base(0), backup_file(0), rw_flag(rw), first_desc_ptr(0),
|
||||
spec_name(spec_path)
|
||||
{
|
||||
g_mode_8_3 = 1;
|
||||
int len;
|
||||
|
||||
f_obj_dict = new object_dict;
|
||||
|
||||
@@ -91,9 +92,12 @@ user_base::user_base( const char* spec_path, rw_flag_t rw) :
|
||||
if ( name == 0 )
|
||||
name = (char*)"";
|
||||
|
||||
strcpy(base_path, path);
|
||||
strcpy(base_name, name);
|
||||
strcpy(base_desc, "");
|
||||
len = MIN(strlen(path), PATHSIZ - 1);
|
||||
*((char *) memcpy(base_path, path, len) + len) = '\0';
|
||||
len = MIN(strlen(name), PATHSIZ - 1);
|
||||
*((char *) memcpy(base_name, name, len) + len) = '\0';
|
||||
len = MIN(strlen(""), PATHSIZ - 1);
|
||||
*((char *) memcpy(base_desc, "", len) + len) = '\0';
|
||||
|
||||
_init();
|
||||
|
||||
@@ -106,9 +110,9 @@ user_base::user_base( const char* base_dir,
|
||||
const char* spec_path,
|
||||
rw_flag_t rw
|
||||
) :
|
||||
base(0, 0, 0, base_dir, base_nm, base_ds, ""), first_desc_ptr(0),
|
||||
backup_file(0), rw_flag(rw), checking_status(SUCC),
|
||||
spec_name(spec_path)
|
||||
base(0, 0, 0, base_dir, base_nm, base_ds, ""), backup_file(0),
|
||||
rw_flag(rw), checking_status(SUCC), first_desc_ptr(0),
|
||||
spec_name(spec_path)
|
||||
{
|
||||
g_mode_8_3 = 1;
|
||||
|
||||
@@ -157,17 +161,24 @@ user_base::checking_status_t user_base::check_mode()
|
||||
user_base::checking_status_t user_base::check_lock()
|
||||
{
|
||||
char lock_dir[PATHSIZ];
|
||||
int len;
|
||||
|
||||
sprintf(lock_dir, "%s/%s", base_path, LOCK_DIR);
|
||||
snprintf(lock_dir, sizeof(lock_dir), "%s/%s", base_path, LOCK_DIR);
|
||||
|
||||
if ( check_and_create_dir(lock_dir) == false ) {
|
||||
MESSAGE(cerr, form("no write permission to %s", lock_dir));
|
||||
return user_base::CREATE_LOCKFILE_FAIL;
|
||||
}
|
||||
|
||||
strcpy(atomic_lock_path, form("%s/%s", lock_dir, AT_LOCK));
|
||||
strcpy(write_lock_path, form("%s/%s", lock_dir, W_LOCK));
|
||||
strcpy(ai_path, form("%s/%s", lock_dir, ACCESS_INFO));
|
||||
len = MIN(strlen(atomic_lock_path), strlen(lock_dir) + strlen(AT_LOCK) + 1);
|
||||
*((char *) memcpy(atomic_lock_path,
|
||||
form("%s/%s", lock_dir, AT_LOCK), len) + len) = '\0';
|
||||
len = MIN(strlen(write_lock_path), strlen(lock_dir) + strlen(W_LOCK) + 1);
|
||||
*((char *) memcpy(write_lock_path,
|
||||
form("%s/%s", lock_dir, W_LOCK), len) + len) = '\0';
|
||||
len = MIN(strlen(ai_path), strlen(lock_dir) + strlen(ACCESS_INFO) + 1);
|
||||
*((char *) memcpy(ai_path,
|
||||
form("%s/%s", lock_dir, ACCESS_INFO), len) + len) = '\0';
|
||||
|
||||
char* ai_info = 0;
|
||||
|
||||
@@ -392,6 +403,8 @@ MESSAGE(cerr, store_ptr -> my_name());
|
||||
|
||||
Boolean user_base::define()
|
||||
{
|
||||
int len;
|
||||
|
||||
if ( check_and_create_dir(base_path) == false ) {
|
||||
throw(stringException(form("can't create %s", base_path)));
|
||||
}
|
||||
@@ -402,10 +415,14 @@ Boolean user_base::define()
|
||||
char* x = getenv("DTINFO_MARKSPECPATH");
|
||||
|
||||
if ( x == 0 ) {
|
||||
strcpy(spec_file_path, spec_name);
|
||||
len = MIN(strlen(spec_name), PATHSIZ - 1);
|
||||
*((char *) memcpy(spec_file_path, spec_name, len) + len) = '\0';
|
||||
}
|
||||
else
|
||||
strcpy(spec_file_path, form("%s/%s", x, spec_name));
|
||||
else {
|
||||
len = MIN(strlen(x) + strlen(spec_name) + 1, PATHSIZ - 1);
|
||||
*((char *) memcpy(spec_file_path,
|
||||
form("%s/%s", x, spec_name), len) + len) = '\0';
|
||||
}
|
||||
|
||||
if (exist_file(spec_file_path) == false) {
|
||||
|
||||
@@ -419,7 +436,11 @@ Boolean user_base::define()
|
||||
|
||||
/*
|
||||
char unique_nm[PATHSIZ];
|
||||
strcpy(unique_nm, form("%s.%s", base_name, unique_id()));
|
||||
const char* uid;
|
||||
uid = unique_id();
|
||||
len = MIN(strlen(base_name) + strlen(uid) + 1, PATHSIZ - 1);
|
||||
*((char *) memcpy(unique_nm,
|
||||
form("%s.%s", base_name, uid), len) + len) = '\0';
|
||||
*/
|
||||
|
||||
first_desc_ptr =
|
||||
|
||||
Reference in New Issue
Block a user