void nsTopProgressManager::UpdateStatusMessage(AggregateTransferInfo& info) { // Compute how much time has elapsed nsInt64 dt = nsTime(PR_Now()) - fActualStart; PRUint32 elapsed = dt / nsInt64((PRUint32) PR_USEC_PER_SEC); char buf[256]; *buf = 0; if (info.ObjectCount == 1 || info.CompleteCount == 0) { // If we only have one object that we're transferring, or if // nothing has completed yet, show the default status message PL_strncpy(buf, fDefaultStatus, sizeof(buf)); } if (elapsed > TIME_UNTIL_DETAILS) { char details[256]; *details = 0; if (!info.UnknownLengthCount && info.ContentLength > 0) { formatKnownContentLength(details, sizeof(details), info.BytesReceived, info.ContentLength, elapsed); } else if (info.BytesReceived > 0) { formatUnknownContentLength(details, sizeof(details), info.BytesReceived, elapsed); } if (*details) { // XXX needs to go to allxpstr.h if (*buf) PL_strcatn(buf, sizeof(buf), ", "); PL_strcatn(buf, sizeof(buf), details); } } FE_Progress(fContext, buf); }
static int MimeUntypedText_open_subpart(MimeObject *obj, MimeUntypedTextSubpartType ttype, const char *type, const char *enc, const char *name, const char *desc) { MimeUntypedText *uty = (MimeUntypedText *)obj; int status = 0; char *h = 0; if (!type || !*type || !PL_strcasecmp(type, UNKNOWN_CONTENT_TYPE)) type = APPLICATION_OCTET_STREAM; if (enc && !*enc) enc = 0; if (desc && !*desc) desc = 0; if (name && !*name) name = 0; if (uty->open_subpart) { status = MimeUntypedText_close_subpart(obj); if (status < 0) return status; } NS_ASSERTION(!uty->open_subpart, "no open subpart"); NS_ASSERTION(!uty->open_hdrs, "no open headers"); /* To make one of these implicitly-typed sub-objects, we make up a fake header block, containing only the minimum number of MIME headers needed. We could do most of this (Type and Encoding) by making a null header block, and simply setting obj->content_type and obj->encoding; but making a fake header block is better for two reasons: first, it means that something will actually be displayed when in `Show All Headers' mode; and second, it's the only way to communicate the filename parameter, aside from adding a new slot to MimeObject (which is something to be avoided when possible.) */ uty->open_hdrs = MimeHeaders_new(); if (!uty->open_hdrs) return MIME_OUT_OF_MEMORY; uint32_t hlen = strlen(type) + (enc ? strlen(enc) : 0) + (desc ? strlen(desc) : 0) + (name ? strlen(name) : 0) + 100; h = (char *)PR_MALLOC(hlen); if (!h) return MIME_OUT_OF_MEMORY; PL_strncpyz(h, HEADER_CONTENT_TYPE ": ", hlen); PL_strcatn(h, hlen, type); PL_strcatn(h, hlen, MSG_LINEBREAK); status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs); if (status < 0) goto FAIL; if (enc) { PL_strncpyz(h, HEADER_CONTENT_TRANSFER_ENCODING ": ", hlen); PL_strcatn(h, hlen, enc); PL_strcatn(h, hlen, MSG_LINEBREAK); status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs); if (status < 0) goto FAIL; } if (desc) { PL_strncpyz(h, HEADER_CONTENT_DESCRIPTION ": ", hlen); PL_strcatn(h, hlen, desc); PL_strcatn(h, hlen, MSG_LINEBREAK); status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs); if (status < 0) goto FAIL; } if (name) { PL_strncpyz(h, HEADER_CONTENT_DISPOSITION ": inline; filename=\"", hlen); PL_strcatn(h, hlen, name); PL_strcatn(h, hlen, "\"" MSG_LINEBREAK); status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs); if (status < 0) goto FAIL; } /* push out a blank line. */ PL_strncpyz(h, MSG_LINEBREAK, hlen); status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs); if (status < 0) goto FAIL; /* Create a child... */ { bool horrid_kludge = (obj->options && obj->options->state && obj->options->state->first_part_written_p); if (horrid_kludge) obj->options->state->first_part_written_p = false; uty->open_subpart = mime_create(type, uty->open_hdrs, obj->options); if (horrid_kludge) obj->options->state->first_part_written_p = true; if (!uty->open_subpart) { status = MIME_OUT_OF_MEMORY; goto FAIL; } } /* Add it to the list... */ status = ((MimeContainerClass *)obj->clazz)->add_child(obj, uty->open_subpart); if (status < 0) { mime_free(uty->open_subpart); uty->open_subpart = 0; goto FAIL; } /* And start its parser going. */ status = uty->open_subpart->clazz->parse_begin(uty->open_subpart); if (status < 0) { /* MimeContainer->finalize will take care of shutting it down now. */ uty->open_subpart = 0; goto FAIL; } uty->type = ttype; FAIL: PR_FREEIF(h); if (status < 0 && uty->open_hdrs) { MimeHeaders_free(uty->open_hdrs); uty->open_hdrs = 0; } return status; }
//---------------------------------------------------------------------------------------- void nsSpecialSystemDirectory::operator = (SystemDirectories aSystemSystemDirectory) //---------------------------------------------------------------------------------------- { SystemDirectoriesKey dirKey(aSystemSystemDirectory); SystemDirectoriesKey mozBinDirKey(Moz_BinDirectory); // This flag is used to tell whether or not we need to append something // onto the *this. Search for needToAppend to how it's used. // IT's VERY IMPORTANT that needToAppend is initialized to PR_TRUE. PRBool needToAppend = PR_TRUE; *this = (const char*)nsnull; switch (aSystemSystemDirectory) { case OS_DriveDirectory: #if defined (XP_WIN) { char path[_MAX_PATH]; PRInt32 len = GetWindowsDirectory( path, _MAX_PATH ); if (len) { if ( path[1] == ':' && path[2] == '\\' ) path[3] = 0; } *this = MakeUpperCase(path); } #elif defined(XP_OS2) { // printf( "*** Warning warning OS_DriveDirectory called for"); ULONG ulBootDrive = 0; char buffer[] = " :\\OS2\\"; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof ulBootDrive); buffer[0] = 'A' - 1 + ulBootDrive; // duh, 1-based index... *this = buffer; #ifdef DEBUG printf( "Got OS_DriveDirectory: %s\n", buffer); #endif } #else *this = "/"; #endif break; case OS_TemporaryDirectory: #if defined (WINCE) { *this = "\\TEMP"; } #elif defined (XP_WIN) { char path[_MAX_PATH]; DWORD len = GetTempPath(_MAX_PATH, path); *this = MakeUpperCase(path); } #elif defined(XP_OS2) { char buffer[CCHMAXPATH] = ""; char *c = getenv( "TMP"); if( c) strcpy( buffer, c); else { c = getenv( "TEMP"); if( c) strcpy( buffer, c); } if( c) *this = buffer; // use exe's directory if not set else GetCurrentProcessDirectory(*this); } #elif defined(XP_UNIX) || defined(XP_BEOS) { static const char *tPath = nsnull; if (!tPath) { tPath = PR_GetEnv("TMPDIR"); if (!tPath || !*tPath) { tPath = PR_GetEnv("TMP"); if (!tPath || !*tPath) { tPath = PR_GetEnv("TEMP"); if (!tPath || !*tPath) { tPath = "/tmp/"; } } } } *this = tPath; } #endif break; case OS_CurrentProcessDirectory: GetCurrentProcessDirectory(*this); break; case OS_CurrentWorkingDirectory: GetCurrentWorkingDirectory(*this); break; case XPCOM_CurrentProcessComponentRegistry: { nsFileSpec *dirSpec = NULL; // if someone has called nsSpecialSystemDirectory::Set() if (systemDirectoriesLocations) { // look for the value for the argument key if (!(dirSpec = (nsFileSpec *)systemDirectoriesLocations->Get(&dirKey))) { // if not found, try Moz_BinDirectory dirSpec = (nsFileSpec *) systemDirectoriesLocations->Get(&mozBinDirKey); } else { // if the value is found for the argument key, // we don't need to append. needToAppend = PR_FALSE; } } if (dirSpec) { *this = *dirSpec; } else { GetCurrentProcessDirectory(*this); } if (needToAppend) { // XXX We need to unify these names across all platforms *this += "component.reg"; } } break; case XPCOM_CurrentProcessComponentDirectory: { nsFileSpec *dirSpec = NULL; // if someone has called nsSpecialSystemDirectory::Set() if (systemDirectoriesLocations) { // look for the value for the argument key if (!(dirSpec = (nsFileSpec *)systemDirectoriesLocations->Get(&dirKey))) { // if not found, try Moz_BinDirectory dirSpec = (nsFileSpec *) systemDirectoriesLocations->Get(&mozBinDirKey); } else { // if the value is found for the argument key, // we don't need to append. needToAppend = PR_FALSE; } } if (dirSpec) { *this = *dirSpec; } else { // <exedir>/Components GetCurrentProcessDirectory(*this); } if (needToAppend) { // XXX We need to unify these names across all platforms *this += "components"; } } break; case Moz_BinDirectory: { nsFileSpec *dirSpec = NULL; // if someone has called nsSpecialSystemDirectory::Set() if (systemDirectoriesLocations) { // look for the value for the argument key dirSpec = (nsFileSpec *) systemDirectoriesLocations->Get(&dirKey); } if (dirSpec) { *this = *dirSpec; } else { GetCurrentProcessDirectory(*this); } } break; #if defined (XP_WIN) case Win_SystemDirectory: { char path[_MAX_PATH]; PRInt32 len = GetSystemDirectory( path, _MAX_PATH ); // Need enough space to add the trailing backslash if (len > _MAX_PATH-2) break; path[len] = '\\'; path[len+1] = '\0'; *this = MakeUpperCase(path); break; } case Win_WindowsDirectory: { char path[_MAX_PATH]; PRInt32 len = GetWindowsDirectory( path, _MAX_PATH ); // Need enough space to add the trailing backslash if (len > _MAX_PATH-2) break; path[len] = '\\'; path[len+1] = '\0'; *this = MakeUpperCase(path); break; } case Win_HomeDirectory: { char path[_MAX_PATH]; if (GetEnvironmentVariable(TEXT("HOME"), path, _MAX_PATH) > 0) { PRInt32 len = PL_strlen(path); // Need enough space to add the trailing backslash if (len > _MAX_PATH - 2) break; path[len] = '\\'; path[len+1] = '\0'; *this = MakeUpperCase(path); break; } if (GetEnvironmentVariable(TEXT("HOMEDRIVE"), path, _MAX_PATH) > 0) { char temp[_MAX_PATH]; if (GetEnvironmentVariable(TEXT("HOMEPATH"), temp, _MAX_PATH) > 0) PL_strcatn(path, _MAX_PATH, temp); PRInt32 len = PL_strlen(path); // Need enough space to add the trailing backslash if (len > _MAX_PATH - 2) break; path[len] = '\\'; path[len+1] = '\0'; *this = MakeUpperCase(path); break; } } case Win_Desktop: { GetWindowsFolder(CSIDL_DESKTOP, *this); break; } case Win_Programs: { GetWindowsFolder(CSIDL_PROGRAMS, *this); break; } case Win_Controls: { GetWindowsFolder(CSIDL_CONTROLS, *this); break; } case Win_Printers: { GetWindowsFolder(CSIDL_PRINTERS, *this); break; } case Win_Personal: { GetWindowsFolder(CSIDL_PERSONAL, *this); break; } case Win_Favorites: { GetWindowsFolder(CSIDL_FAVORITES, *this); break; } case Win_Startup: { GetWindowsFolder(CSIDL_STARTUP, *this); break; } case Win_Recent: { GetWindowsFolder(CSIDL_RECENT, *this); break; } case Win_Sendto: { GetWindowsFolder(CSIDL_SENDTO, *this); break; } case Win_Bitbucket: { GetWindowsFolder(CSIDL_BITBUCKET, *this); break; } case Win_Startmenu: { GetWindowsFolder(CSIDL_STARTMENU, *this); break; } case Win_Desktopdirectory: { GetWindowsFolder(CSIDL_DESKTOPDIRECTORY, *this); break; } case Win_Drives: { GetWindowsFolder(CSIDL_DRIVES, *this); break; } case Win_Network: { GetWindowsFolder(CSIDL_NETWORK, *this); break; } case Win_Nethood: { GetWindowsFolder(CSIDL_NETHOOD, *this); break; } case Win_Fonts: { GetWindowsFolder(CSIDL_FONTS, *this); break; } case Win_Templates: { GetWindowsFolder(CSIDL_TEMPLATES, *this); break; } #ifndef WINCE case Win_Common_Startmenu: { GetWindowsFolder(CSIDL_COMMON_STARTMENU, *this); break; } case Win_Common_Programs: { GetWindowsFolder(CSIDL_COMMON_PROGRAMS, *this); break; } case Win_Common_Startup: { GetWindowsFolder(CSIDL_COMMON_STARTUP, *this); break; } case Win_Common_Desktopdirectory: { GetWindowsFolder(CSIDL_COMMON_DESKTOPDIRECTORY, *this); break; } case Win_Printhood: { GetWindowsFolder(CSIDL_PRINTHOOD, *this); break; } case Win_Cookies: { GetWindowsFolder(CSIDL_COOKIES, *this); break; } #endif // WINCE case Win_Appdata: { GetWindowsFolder(CSIDL_APPDATA, *this); break; } #endif // XP_WIN #if defined(XP_UNIX) case Unix_LocalDirectory: *this = "/usr/local/netscape/"; break; case Unix_LibDirectory: *this = "/usr/local/lib/netscape/"; break; case Unix_HomeDirectory: #ifdef VMS { char *pHome; pHome = getenv("HOME"); if (*pHome == '/') *this = pHome; else *this = decc$translate_vms(pHome); } #else *this = PR_GetEnv("HOME"); #endif break; #endif #ifdef XP_BEOS case BeOS_SettingsDirectory: { char path[MAXPATHLEN]; find_directory(B_USER_SETTINGS_DIRECTORY, 0, 0, path, MAXPATHLEN); // Need enough space to add the trailing backslash int len = strlen(path); if (len > MAXPATHLEN-2) break; path[len] = '/'; path[len+1] = '\0'; *this = path; break; } case BeOS_HomeDirectory: { char path[MAXPATHLEN]; find_directory(B_USER_DIRECTORY, 0, 0, path, MAXPATHLEN); // Need enough space to add the trailing backslash int len = strlen(path); if (len > MAXPATHLEN-2) break; path[len] = '/'; path[len+1] = '\0'; *this = path; break; } case BeOS_DesktopDirectory: { char path[MAXPATHLEN]; find_directory(B_DESKTOP_DIRECTORY, 0, 0, path, MAXPATHLEN); // Need enough space to add the trailing backslash int len = strlen(path); if (len > MAXPATHLEN-2) break; path[len] = '/'; path[len+1] = '\0'; *this = path; break; } case BeOS_SystemDirectory: { char path[MAXPATHLEN]; find_directory(B_BEOS_DIRECTORY, 0, 0, path, MAXPATHLEN); // Need enough space to add the trailing backslash int len = strlen(path); if (len > MAXPATHLEN-2) break; path[len] = '/'; path[len+1] = '\0'; *this = path; break; } #endif #ifdef XP_OS2 case OS2_SystemDirectory: { ULONG ulBootDrive = 0; char buffer[] = " :\\OS2\\System\\"; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof ulBootDrive); buffer[0] = 'A' - 1 + ulBootDrive; // duh, 1-based index... *this = buffer; #ifdef DEBUG printf( "Got OS2_SystemDirectory: %s\n", buffer); #endif break; } case OS2_OS2Directory: { ULONG ulBootDrive = 0; char buffer[] = " :\\OS2\\"; DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulBootDrive, sizeof ulBootDrive); buffer[0] = 'A' - 1 + ulBootDrive; // duh, 1-based index... *this = buffer; #ifdef DEBUG printf( "Got OS2_OS2Directory: %s\n", buffer); #endif break; } case OS2_HomeDirectory: { char *tPath = PR_GetEnv("MOZILLA_HOME"); /* If MOZILLA_HOME is not set, use GetCurrentProcessDirectory */ /* To ensure we get a long filename system */ if (!tPath || !*tPath) GetCurrentProcessDirectory(*this); else *this = tPath; PrfWriteProfileString(HINI_USERPROFILE, "Mozilla", "Home", *this); break; } case OS2_DesktopDirectory: { char szPath[CCHMAXPATH + 1]; BOOL fSuccess; fSuccess = WinQueryActiveDesktopPathname (szPath, sizeof(szPath)); int len = strlen (szPath); if (len > CCHMAXPATH -1) break; szPath[len] = '\\'; szPath[len + 1] = '\0'; #ifdef DEBUG if (fSuccess) { printf ("Got OS2_DesktopDirectory: %s\n", szPath); } else { printf ("Failed getting OS2_DesktopDirectory: %s\n", szPath); } #endif break; } #endif default: break; } }
char * MimeExternalBody_make_url(const char *ct, const char *at, const char *lexp, const char *size, const char *perm, const char *dir, const char *mode, const char *name, const char *url, const char *site, const char *svr, const char *subj, const char *body) { char *s; PRUint32 slen; if (!at) { return 0; } else if (!PL_strcasecmp(at, "ftp") || !PL_strcasecmp(at, "anon-ftp")) { if (!site || !name) return 0; slen = strlen(name) + strlen(site) + (dir ? strlen(dir) : 0) + 20; s = (char *) PR_MALLOC(slen); if (!s) return 0; PL_strncpyz(s, "ftp://", slen); PL_strcatn(s, slen, site); PL_strcatn(s, slen, "/"); if (dir) PL_strcatn(s, slen, (dir[0] == '/' ? dir+1 : dir)); if (s[strlen(s)-1] != '/') PL_strcatn(s, slen, "/"); PL_strcatn(s, slen, name); return s; } else if (!PL_strcasecmp(at, "local-file") || !PL_strcasecmp(at, "afs")) { if (!name) return 0; #ifdef XP_UNIX if (!PL_strcasecmp(at, "afs")) /* only if there is a /afs/ directory */ { nsCOMPtr <nsILocalFile> fs = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID); bool exists = false; if (fs) { fs->InitWithNativePath(NS_LITERAL_CSTRING("/afs/.")); fs->Exists(&exists); } if (!exists) return 0; } #else /* !XP_UNIX */ return 0; /* never, if not Unix. */ #endif /* !XP_UNIX */ slen = (strlen(name) * 3 + 20); s = (char *) PR_MALLOC(slen); if (!s) return 0; PL_strncpyz(s, "file:", slen); nsCString s2; MsgEscapeString(nsDependentCString(name), nsINetUtil::ESCAPE_URL_PATH, s2); PL_strcatn(s, slen, s2.get()); return s; } else if (!PL_strcasecmp(at, "mail-server")) { if (!svr) return 0; slen = (strlen(svr)*4 + (subj ? strlen(subj)*4 : 0) + (body ? strlen(body)*4 : 0) + 25); // dpv xxx: why 4x? %xx escaping should be 3x s = (char *) PR_MALLOC(slen); if (!s) return 0; PL_strncpyz(s, "mailto:", slen); nsCString s2; MsgEscapeString(nsDependentCString(svr), nsINetUtil::ESCAPE_XALPHAS, s2); PL_strcatn(s, slen, s2.get()); if (subj) { MsgEscapeString(nsDependentCString(subj), nsINetUtil::ESCAPE_XALPHAS, s2); PL_strcatn(s, slen, "?subject="); PL_strcatn(s, slen, s2.get()); } if (body) { MsgEscapeString(nsDependentCString(body), nsINetUtil::ESCAPE_XALPHAS, s2); PL_strcatn(s, slen, (subj ? "&body=" : "?body=")); PL_strcatn(s, slen, s2.get()); } return s; } else if (!PL_strcasecmp(at, "url")) /* RFC 2017 */ { if (url) return strdup(url); /* it's already quoted and everything */ else return 0; } else return 0; }
static int MimeExternalObject_parse_begin (MimeObject *obj) { int status; status = ((MimeObjectClass*)&MIME_SUPERCLASS)->parse_begin(obj); if (status < 0) return status; // If we're writing this object, and we're doing it in raw form, then // now is the time to inform the backend what the type of this data is. // if (obj->output_p && obj->options && !obj->options->write_html_p && !obj->options->state->first_data_written_p) { status = MimeObject_output_init(obj, 0); if (status < 0) return status; NS_ASSERTION(obj->options->state->first_data_written_p, "1.1 <*****@*****.**> 19 Mar 1999 12:00"); } // // If we're writing this object as HTML, do all the work now -- just write // out a table with a link in it. (Later calls to the `parse_buffer' method // will simply discard the data of the object itself.) // if (obj->options && obj->output_p && obj->options->write_html_p && obj->options->output_fn) { MimeDisplayOptions newopt = *obj->options; // copy it char *id = 0; char *id_url = 0; char *id_name = 0; nsCString id_imap; PRBool all_headers_p = obj->options->headers == MimeHeadersAll; id = mime_part_address (obj); if (obj->options->missing_parts) id_imap.Adopt(mime_imap_part_address (obj)); if (! id) return MIME_OUT_OF_MEMORY; if (obj->options && obj->options->url) { const char *url = obj->options->url; if (!id_imap.IsEmpty() && id) { // if this is an IMAP part. id_url = mime_set_url_imap_part(url, id_imap.get(), id); } else { // This is just a normal MIME part as usual. id_url = mime_set_url_part(url, id, PR_TRUE); } if (!id_url) { PR_Free(id); return MIME_OUT_OF_MEMORY; } } if (!strcmp (id, "0")) { PR_Free(id); id = MimeGetStringByID(MIME_MSG_ATTACHMENT); } else { const char *p = "Part "; PRUint32 slen = strlen(p) + strlen(id) + 1; char *s = (char *)PR_MALLOC(slen); if (!s) { PR_Free(id); PR_Free(id_url); return MIME_OUT_OF_MEMORY; } // we have a valid id if (id) id_name = mime_find_suggested_name_of_part(id, obj); PL_strncpyz(s, p, slen); PL_strcatn(s, slen, id); PR_Free(id); id = s; } if (all_headers_p && // Don't bother showing all headers on this part if it's the only // part in the message: in that case, we've already shown these // headers. obj->options->state && obj->options->state->root == obj->parent) all_headers_p = PR_FALSE; newopt.fancy_headers_p = PR_TRUE; newopt.headers = (all_headers_p ? MimeHeadersAll : MimeHeadersSome); /****** RICHIE SHERRY GOTTA STILL DO THIS FOR QUOTING! status = MimeHeaders_write_attachment_box (obj->headers, &newopt, obj->content_type, obj->encoding, id_name? id_name : id, id_url, 0) *****/ // obj->options really owns the storage for this. newopt.part_to_load = nsnull; newopt.default_charset = nsnull; PR_FREEIF(id); PR_FREEIF(id_url); PR_FREEIF(id_name); if (status < 0) return status; } return 0; }
int collation_config (size_t cargc, char** cargv, const char* fname, size_t lineno) /* Process one line from a configuration file. Return 0 if it's OK, -1 if it's not recognized. Any other return value is a process exit code. */ { if (cargc <= 0) { /* Bizarre. Oh, well... */ } else if (!strcasecmp (cargv[0], "NLS")) { /* ignore - not needed anymore with ICU - was used to get path for NLS_Initialize */ } else if (!strcasecmp (cargv[0], "collation")) { if ( cargc < 7 ) { slapi_log_err(SLAPI_LOG_ERR, COLLATE_PLUGIN_SUBSYSTEM, "collation_config - %s: line %lu ignored: only %lu arguments (expected " "collation language country variant strength decomposition oid ...)\n", fname, (unsigned long)lineno, (unsigned long)cargc ); } else { auto size_t arg; auto coll_profile_t* profile = (coll_profile_t*) slapi_ch_calloc (1, sizeof (coll_profile_t)); if (*cargv[1]) profile->language = slapi_ch_strdup (cargv[1]); if (*cargv[2]) profile->country = slapi_ch_strdup (cargv[2]); if (*cargv[3]) profile->variant = slapi_ch_strdup (cargv[3]); switch (atoi(cargv[4])) { case 1: profile->strength = UCOL_PRIMARY; break; case 2: profile->strength = UCOL_SECONDARY; /* no break here? fall through? wtf? */ case 3: profile->strength = UCOL_TERTIARY; break; case 4: profile->strength = UCOL_IDENTICAL; break; default: profile->strength = UCOL_SECONDARY; slapi_log_err(SLAPI_LOG_ERR, COLLATE_PLUGIN_SUBSYSTEM, "collation_config - %s: line %lu: strength \"%s\" not supported (will use 2)\n", fname, (unsigned long)lineno, cargv[4]); break; } switch (atoi(cargv[5])) { case 1: profile->decomposition = UCOL_OFF; break; case 2: profile->decomposition = UCOL_DEFAULT; /* no break here? fall through? wtf? */ case 3: profile->decomposition = UCOL_ON; break; default: profile->decomposition = UCOL_DEFAULT; slapi_log_err(SLAPI_LOG_ERR, COLLATE_PLUGIN_SUBSYSTEM, "collation_config - %s: line %lu: decomposition \"%s\" not supported (will use 2)\n", fname, (unsigned long)lineno, cargv[5]); break; } { char descStr[256]; char nameOrder[256]; char nameSubstring[256]; char oidString[256]; char *tmpStr=NULL; Slapi_MatchingRuleEntry *mrentry=slapi_matchingrule_new(); if(UCOL_PRIMARY == profile->strength) { strcpy(nameOrder,"caseIgnoreOrderingMatch"); strcpy(nameSubstring,"caseIgnoreSubstringMatch"); } else { strcpy(nameOrder,"caseExactOrderingMatch"); strcpy(nameSubstring,"caseExactSubstringMatch"); } /* PAR: this looks broken the "extra" text based oids that are actually used to form the name and description are always derived from the language and country fields so there should be no need to have two separate code paths to set the name and description fields of the schema as language is always available, and if country is not, it is not in the name anyway. Is it safe to assume all matching rules will follow this convention? The answer, or lack of it, probably explains the reasoning for doing things the way they are currently. */ if(cargc > 7) { PL_strcatn(nameOrder,sizeof(nameOrder),"-"); PL_strcatn(nameOrder,sizeof(nameOrder),cargv[7]); PL_strcatn(nameSubstring,sizeof(nameSubstring),"-"); PL_strcatn(nameSubstring,sizeof(nameSubstring),cargv[7]); slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_NAME, (void *)slapi_ch_strdup(nameOrder)); } else { if(0 != cargv[1][0]) { PL_strcatn(nameOrder,sizeof(nameOrder),"-"); PL_strcatn(nameSubstring,sizeof(nameSubstring),"-"); } else { nameOrder[0] = 0; nameSubstring[0] = 0; } PL_strcatn(nameOrder,sizeof(nameOrder),cargv[1]); PL_strcatn(nameSubstring,sizeof(nameSubstring),cargv[1]); slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_NAME, (void *)slapi_ch_strdup(nameOrder)); } PL_strncpyz(oidString,cargv[6], sizeof(oidString)); slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_OID, (void *)slapi_ch_strdup(oidString)); if(0 != cargv[2][0]) { PR_snprintf(descStr, sizeof(descStr), "%s-%s",cargv[1],cargv[2]); } else { PL_strncpyz(descStr,cargv[1], sizeof(descStr)); } slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_DESC, (void *)slapi_ch_strdup(descStr)); slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_SYNTAX, (void *)slapi_ch_strdup(DIRSTRING_SYNTAX_OID)); slapi_matchingrule_register(mrentry); slapi_matchingrule_get(mrentry,SLAPI_MATCHINGRULE_NAME, (void *)&tmpStr); slapi_ch_free((void **)&tmpStr); slapi_matchingrule_get(mrentry,SLAPI_MATCHINGRULE_OID, (void *)&tmpStr); slapi_ch_free((void **)&tmpStr); slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_NAME, (void *)slapi_ch_strdup(nameSubstring)); PL_strcatn(oidString,sizeof(oidString),".6"); slapi_matchingrule_set(mrentry,SLAPI_MATCHINGRULE_OID, (void *)slapi_ch_strdup(oidString)); slapi_matchingrule_register(mrentry); slapi_matchingrule_free(&mrentry,1); } for (arg = 6; arg < cargc; ++arg) { auto coll_id_t* id = (coll_id_t*) slapi_ch_malloc (sizeof (coll_id_t)); id->oid = slapi_ch_strdup (cargv[arg]); id->profile = profile; if (collation_ids <= 0) { collation_id = (const coll_id_t**) slapi_ch_malloc (2 * sizeof (coll_id_t*)); } else { collation_id = (const coll_id_t**) slapi_ch_realloc ((void*)collation_id, (collation_ids + 2) * sizeof (coll_id_t*)); } collation_id [collation_ids++] = id; collation_id [collation_ids] = NULL; } } } else { return -1; /* unrecognized */ } return 0; /* success */ }