@@ -282,115 +282,6 @@ pcmk__compare_versions(const char *version1, const char *version2)
282282 return rc ;
283283}
284284
285- /*!
286- * \internal
287- * \brief Return the integer equivalent of a portion of a string
288- *
289- * \param[in] text Pointer to beginning of string portion
290- * \param[out] end_text This will point to next character after integer
291- */
292- static int
293- version_helper (const char * text , const char * * end_text )
294- {
295- int atoi_result = -1 ;
296-
297- pcmk__assert (end_text != NULL );
298-
299- errno = 0 ;
300-
301- if (text != NULL && text [0 ] != 0 ) {
302- /* seemingly sacrificing const-correctness -- because while strtol
303- doesn't modify the input, it doesn't want to artificially taint the
304- "end_text" pointer-to-pointer-to-first-char-in-string with constness
305- in case the input wasn't actually constant -- by semantic definition
306- not a single character will get modified so it shall be perfectly
307- safe to make compiler happy with dropping "const" qualifier here */
308- atoi_result = (int ) strtol (text , (char * * ) end_text , 10 );
309-
310- if (errno == EINVAL ) {
311- crm_err ("Conversion of '%s' %c failed" , text , text [0 ]);
312- atoi_result = -1 ;
313- }
314- }
315- return atoi_result ;
316- }
317-
318- /*
319- * version1 < version2 : -1
320- * version1 = version2 : 0
321- * version1 > version2 : 1
322- */
323- int
324- compare_version (const char * version1 , const char * version2 )
325- {
326- int rc = 0 ;
327- int lpc = 0 ;
328- const char * ver1_iter , * ver2_iter ;
329-
330- if (version1 == NULL && version2 == NULL ) {
331- return 0 ;
332- } else if (version1 == NULL ) {
333- return -1 ;
334- } else if (version2 == NULL ) {
335- return 1 ;
336- }
337-
338- ver1_iter = version1 ;
339- ver2_iter = version2 ;
340-
341- while (1 ) {
342- int digit1 = 0 ;
343- int digit2 = 0 ;
344-
345- lpc ++ ;
346-
347- if (ver1_iter == ver2_iter ) {
348- break ;
349- }
350-
351- if (ver1_iter != NULL ) {
352- digit1 = version_helper (ver1_iter , & ver1_iter );
353- }
354-
355- if (ver2_iter != NULL ) {
356- digit2 = version_helper (ver2_iter , & ver2_iter );
357- }
358-
359- if (digit1 < digit2 ) {
360- rc = -1 ;
361- break ;
362-
363- } else if (digit1 > digit2 ) {
364- rc = 1 ;
365- break ;
366- }
367-
368- if (ver1_iter != NULL && * ver1_iter == '.' ) {
369- ver1_iter ++ ;
370- }
371- if (ver1_iter != NULL && * ver1_iter == '\0' ) {
372- ver1_iter = NULL ;
373- }
374-
375- if (ver2_iter != NULL && * ver2_iter == '.' ) {
376- ver2_iter ++ ;
377- }
378- if (ver2_iter != NULL && * ver2_iter == 0 ) {
379- ver2_iter = NULL ;
380- }
381- }
382-
383- if (rc == 0 ) {
384- crm_trace ("%s == %s (%d)" , version1 , version2 , lpc );
385- } else if (rc < 0 ) {
386- crm_trace ("%s < %s (%d)" , version1 , version2 , lpc );
387- } else if (rc > 0 ) {
388- crm_trace ("%s > %s (%d)" , version1 , version2 , lpc );
389- }
390-
391- return rc ;
392- }
393-
394285/* @FIXME uuid.h is an optional header per configure.ac, and we include it
395286 * conditionally above. But uuid_generate() and uuid_unparse() depend on it, on
396287 * many or perhaps all systems with libuuid. So it's not clear how it would ever
@@ -647,5 +538,102 @@ pcmk_daemon_user(uid_t *uid, gid_t *gid)
647538 return rc ;
648539}
649540
541+ static int
542+ version_helper (const char * text , const char * * end_text )
543+ {
544+ int atoi_result = -1 ;
545+
546+ pcmk__assert (end_text != NULL );
547+
548+ errno = 0 ;
549+
550+ if (text != NULL && text [0 ] != 0 ) {
551+ /* seemingly sacrificing const-correctness -- because while strtol
552+ doesn't modify the input, it doesn't want to artificially taint the
553+ "end_text" pointer-to-pointer-to-first-char-in-string with constness
554+ in case the input wasn't actually constant -- by semantic definition
555+ not a single character will get modified so it shall be perfectly
556+ safe to make compiler happy with dropping "const" qualifier here */
557+ atoi_result = (int ) strtol (text , (char * * ) end_text , 10 );
558+
559+ if (errno == EINVAL ) {
560+ crm_err ("Conversion of '%s' %c failed" , text , text [0 ]);
561+ atoi_result = -1 ;
562+ }
563+ }
564+ return atoi_result ;
565+ }
566+
567+ int
568+ compare_version (const char * version1 , const char * version2 )
569+ {
570+ int rc = 0 ;
571+ int lpc = 0 ;
572+ const char * ver1_iter , * ver2_iter ;
573+
574+ if (version1 == NULL && version2 == NULL ) {
575+ return 0 ;
576+ } else if (version1 == NULL ) {
577+ return -1 ;
578+ } else if (version2 == NULL ) {
579+ return 1 ;
580+ }
581+
582+ ver1_iter = version1 ;
583+ ver2_iter = version2 ;
584+
585+ while (1 ) {
586+ int digit1 = 0 ;
587+ int digit2 = 0 ;
588+
589+ lpc ++ ;
590+
591+ if (ver1_iter == ver2_iter ) {
592+ break ;
593+ }
594+
595+ if (ver1_iter != NULL ) {
596+ digit1 = version_helper (ver1_iter , & ver1_iter );
597+ }
598+
599+ if (ver2_iter != NULL ) {
600+ digit2 = version_helper (ver2_iter , & ver2_iter );
601+ }
602+
603+ if (digit1 < digit2 ) {
604+ rc = -1 ;
605+ break ;
606+
607+ } else if (digit1 > digit2 ) {
608+ rc = 1 ;
609+ break ;
610+ }
611+
612+ if (ver1_iter != NULL && * ver1_iter == '.' ) {
613+ ver1_iter ++ ;
614+ }
615+ if (ver1_iter != NULL && * ver1_iter == '\0' ) {
616+ ver1_iter = NULL ;
617+ }
618+
619+ if (ver2_iter != NULL && * ver2_iter == '.' ) {
620+ ver2_iter ++ ;
621+ }
622+ if (ver2_iter != NULL && * ver2_iter == 0 ) {
623+ ver2_iter = NULL ;
624+ }
625+ }
626+
627+ if (rc == 0 ) {
628+ crm_trace ("%s == %s (%d)" , version1 , version2 , lpc );
629+ } else if (rc < 0 ) {
630+ crm_trace ("%s < %s (%d)" , version1 , version2 , lpc );
631+ } else if (rc > 0 ) {
632+ crm_trace ("%s > %s (%d)" , version1 , version2 , lpc );
633+ }
634+
635+ return rc ;
636+ }
637+
650638// LCOV_EXCL_STOP
651639// End deprecated API
0 commit comments