/* periodically generate a csn and dump it to the error log */ static void _csngen_gen_tester_main (void *data) { CSNGen *gen = (CSNGen*)data; CSN *csn = NULL; char buff [CSN_STRSIZE]; int rc; PR_ASSERT (gen); while (!s_must_exit) { rc = csngen_new_csn (gen, &csn, PR_FALSE); if (rc != CSN_SUCCESS) { slapi_log_err(SLAPI_LOG_ERR, "_csngen_gen_tester_main", "failed to generate csn; csn error - %d\n", rc); } else { slapi_log_err(SLAPI_LOG_INFO, "_csngen_gen_tester_main", "generate csn %s\n", csn_as_string(csn, PR_FALSE, buff)); } csn_free(&csn); /* sleep for 30 seconds */ DS_Sleep (PR_SecondsToInterval(10)); } PR_AtomicDecrement (&s_thread_count); }
/* * WARNING: ss must point to memory at least (7+CSN_STRSIZE) bytes long, * WARNING: or be NULL, which means this function will allocate the * WARNING: memory, which must be free'd by the caller. */ char * csn_as_attr_option_string(CSNType t,const CSN *csn,char *ss) { char *s= ss; if(csn!=NULL) { if(s==NULL) { s= slapi_ch_malloc(8+CSN_STRSIZE); } s[0]= ';'; switch(t) { case CSN_TYPE_UNKNOWN: s[1]= 'x'; s[2]= '1'; break; case CSN_TYPE_NONE: s[1]= 'x'; s[2]= '2'; break; case CSN_TYPE_ATTRIBUTE_DELETED: s[1]= 'a'; s[2]= 'd'; break; case CSN_TYPE_VALUE_UPDATED: s[1]= 'v'; s[2]= 'u'; break; case CSN_TYPE_VALUE_DELETED: s[1]= 'v'; s[2]= 'd'; break; case CSN_TYPE_VALUE_DISTINGUISHED: s[1]= 'm'; s[2]= 'd'; break; } s[3]= 'c'; s[4]= 's'; s[5]= 'n'; s[6]= '-'; csn_as_string(csn,PR_FALSE,s+7); } return s; }
/* * Helper function - convert a CSN to a string and ber_printf() it. */ static int my_ber_printf_csn(BerElement *ber, const CSN *csn, const CSNType t) { char csn_str[CSN_STRSIZE]; int rc = -1; ber_int_t csn_type_as_ber = -1; switch (t) { case CSN_TYPE_VALUE_UPDATED: csn_type_as_ber = CSN_TYPE_VALUE_UPDATED_ON_WIRE; break; case CSN_TYPE_VALUE_DELETED: csn_type_as_ber = CSN_TYPE_VALUE_DELETED_ON_WIRE; break; case CSN_TYPE_VALUE_DISTINGUISHED: csn_type_as_ber = CSN_TYPE_VALUE_DISTINGUISHED_ON_WIRE; break; case CSN_TYPE_ATTRIBUTE_DELETED: break; default: slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "my_ber_printf_csn: unknown " "csn type %d encountered.\n", (int)t); return -1; } csn_as_string(csn,PR_FALSE,csn_str); /* we don't send type for attr csn since there is only one */ if (t == CSN_TYPE_ATTRIBUTE_DELETED) { rc = ber_printf(ber, "s", csn_str); BER_DEBUG("s(csn_str)"); } else { rc = ber_printf(ber, "{es}", csn_type_as_ber, csn_str); BER_DEBUG("{e(csn type)s(csn)}"); } return rc; }