si_SaveSignonDataLocked();
si_SaveSignonDataLocked("rejects", PR_TRUE);
si_PutReject(const char * passwordRealm, const nsString& userName, PRBool save) {  char * passwordRealm2=NULL;  nsAutoString userName2;  si_Reject * reject = new si_Reject;  if (reject) {    if(!si_reject_list) {      si_reject_list = new nsVoidArray();      if(!si_reject_list) {        delete reject;        return;      }    }    /*     * lock the signon list     *  Note that, for efficiency, SI_LoadSignonData already sets the lock     *  before calling this routine whereas none of the other callers do.     *  So we need to determine whether or not we were called from     *  SI_LoadSignonData before setting or clearing the lock.  We can     *  determine this by testing "save" since only SI_LoadSignonData     *  passes in a value of PR_FALSE for "save".     */    if (save) {      si_lock_signon_list();    }    StrAllocCopy(passwordRealm2, passwordRealm);    userName2 = userName;    reject->passwordRealm = passwordRealm2;    reject->userName = userName2;#ifdef alphabetize    /* add it to the list in alphabetical order */    si_Reject * tmp_reject;    PRBool rejectAdded = PR_FALSE;    PRInt32 rejectCount = LIST_COUNT(si_reject_list);    for (PRInt32 i = 0; i<rejectCount; ++i) {      tmp_reject = NS_STATIC_CAST(si_Reject *, si_reject_list->ElementAt(i));      if (tmp_reject) {        if (PL_strcasecmp(reject->passwordRealm, tmp_reject->passwordRealm)<0) {          si_reject_list->InsertElementAt(reject, i);          rejectAdded = PR_TRUE;          break;        }      }    }    if (!rejectAdded) {      si_reject_list->AppendElement(reject);    }#else    /* add it to the end of the list */    si_reject_list->AppendElement(reject);#endif    if (save) {      si_signon_list_changed = PR_TRUE;      si_lock_signon_list();      si_SaveSignonDataLocked();      si_unlock_signon_list();    }  }}