6 #if defined(WITH_CPUINFO)
10 #if defined(HAVE_GELF_H) && !defined(__FreeBSD__)
11 #if LIBELF_H_LFS_CONFLICT
15 # undef _LARGEFILE64_SOURCE
16 # undef _LARGEFILE_SOURCE
17 # undef _FILE_OFFSET_BITS
18 # define _FILE_OFFSET_BITS 32
21 #if defined(__LCLINT__)
22 typedef long long loff_t;
32 #if defined(ENABLE_NLS) && !defined(__LCLINT__)
33 # define _(Text) gettext (Text)
40 #if defined(HAVE_LIBELF) && !defined(HAVE_GELF_GETVERNAUX) && !defined(__FreeBSD__)
46 static GElf_Verdef *gelf_getverdef(Elf_Data *data,
int offset,
49 return (GElf_Verdef *) ((
char *) data->d_buf + offset);
52 static GElf_Verdaux *gelf_getverdaux(Elf_Data *data,
int offset,
55 return (GElf_Verdaux *) ((
char *) data->d_buf + offset);
58 static GElf_Verneed *gelf_getverneed(Elf_Data *data,
int offset,
61 return (GElf_Verneed *) ((
char *) data->d_buf + offset);
64 static GElf_Vernaux *gelf_getvernaux(Elf_Data *data,
int offset,
67 return (GElf_Vernaux *) ((
char *) data->d_buf + offset);
74 #if !defined(SHT_GNU_verdef) && defined(__sun) && defined(SHT_SUNW_verdef)
75 # define SHT_GNU_verdef SHT_SUNW_verdef
76 # define SHT_GNU_verneed SHT_SUNW_verneed
81 #if !defined(DT_GNU_HASH)
82 #define DT_GNU_HASH 0x6ffffef5
85 #define _RPMIOB_INTERNAL
95 #define _RPMDS_INTERNAL
96 #define _RPMEVR_INTERNAL
97 #define _RPMPRCO_INTERNAL
105 #define _isspace(_c) \
106 ((_c) == ' ' || (_c) == '\t' || (_c) == '\r' || (_c) == '\n')
138 default: Type =
tagName(tagN);
break;
149 case 0: Type =
"Unknown";
break;
164 ds->N =
_free(ds->N);
165 ds->EVR =
_free(ds->EVR);
166 ds->Flags =
_free(ds->Flags);
171 ds->DNEVR =
_free(ds->DNEVR);
172 ds->ns.str =
_free(ds->ns.str);
173 memset(&ds->ns, 0,
sizeof(ds->ns));
174 ds->A =
_free(ds->A);
175 ds->Color =
_free(ds->Color);
176 ds->Refs =
_free(ds->Refs);
177 ds->Result =
_free(ds->Result);
178 ds->exclude =
mireFreeAll(ds->exclude, ds->nexclude);
179 ds->include =
mireFreeAll(ds->include, ds->ninclude);
191 if (_rpmdsPool == NULL) {
192 _rpmdsPool =
rpmioNewPool(
"ds",
sizeof(*ds), -1, _rpmds_debug,
210 for (ac = 0; ac < argc; ac++) {
211 assert(argv[ac] != NULL);
212 nb += strlen(argv[ac]) + 1;
214 nb += (ac + 1) *
sizeof(*av);
217 t = (
char *) (av + ac + 1);
218 for (ac = 0; ac < argc; ac++) {
220 t =
stpcpy(t, argv[ac]) + 1;
230 int scareMem = (flags & 0x1);
232 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
235 const char * Type = NULL;
240 assert(scareMem == 0);
280 delslash = (flags & 0x2) ? 0 : 1;
299 if (xx && N != NULL && Count > 0) {
313 ds->EVR = he->
p.
argv;
338 for (i = 0; i < Count; i++) {
339 (void)
urlPath(N[i], (
const char **)&dn);
345 if (len > 1 && dn[len-1] ==
'/')
350 const char ** av =
xcalloc(Count+1,
sizeof(*av));
354 for (i = 0; i < Count; i++) {
355 (void)
urlPath(ds->EVR[ds->Flags[i]], (
const char **)&dn);
361 N = ds->N =
_free(ds->N);
365 ds->EVR =
_free(ds->EVR);
366 ds->Flags =
_free(ds->Flags);
370 const char ** av =
xcalloc(Count+1,
sizeof(*av));
373 for (i = 0; i < Count; i++) {
374 if (N[i] == NULL || *N[i] ==
'\0')
376 else if (*N[i] ==
'/')
378 else if (ds->EVR != NULL && ds->Flags != NULL)
379 av[i] =
rpmGenPath(NULL, ds->EVR[ds->Flags[i]], N[i]);
386 N = ds->N =
_free(ds->N);
390 ds->EVR =
_free(ds->EVR);
391 ds->Flags =
_free(ds->Flags);
395 if (_rpmds_debug < 0)
396 fprintf(stderr,
"*** ds %p\t%s[%d]\n", ds, ds->Type, ds->Count);
404 ds =
rpmdsLink(ds, (ds ? ds->Type : NULL));
414 const char * Name = ds->N[ds->i];
417 memset(ns, 0,
sizeof(*ns));
428 const char * NS = ds->ns.NS;
429 const char * A = ds->ns.A;
434 if (dspfx) nb += strlen(dspfx) + 1;
435 if (ds->ns.str[0] ==
'!') nb++;
436 if (NS) nb += strlen(NS) +
sizeof(
"()") - 1;
437 if (N) nb += strlen(N);
444 if (ds->Flags != NULL
457 ds->ns.Flags = dsFlags;
460 if (ds->EVR != NULL && ds->EVR[ds->i] && *ds->EVR[ds->i]) {
462 nb += strlen(ds->EVR[ds->i]);
470 if (ds->ns.str[0] ==
'!')
486 if (t != tbuf) *t++ =
' ';
496 if (ds->EVR != NULL && ds->EVR[ds->i] && *ds->EVR[ds->i]) {
497 if (t != tbuf) *t++ =
' ';
498 t =
stpcpy(t, ds->EVR[ds->i]);
506 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
509 const char * Name, * V, * R;
510 #ifdef RPM_VENDOR_MANDRIVA
511 const char * D = NULL;
514 const char ** N, ** EVR;
529 #if defined(NOTYET) || defined(RPM_VENDOR_MANDRIVA)
538 t =
xmalloc(
sizeof(*N) + strlen(Name) + 1);
539 N = (
const char **) t;
546 nb =
sizeof(*EVR) + 20 + strlen(V) + strlen(R) +
sizeof(
"-");
547 #ifdef RPM_VENDOR_MANDRIVA
548 nb += (D ? strlen(D) +
sizeof(
":") : 0);
551 EVR = (
const char **) t;
555 sprintf(t,
"%d:", E);
558 #ifdef RPM_VENDOR_MANDRIVA
573 ds->Flags =
xmalloc(
sizeof(*ds->Flags)); ds->Flags[0] = Flags;
585 pre[0] = ds->Type[0];
593 return rpmdsLink(ds, (ds ? ds->Type : NULL));
604 { time_t now = time(NULL);
609 ds->N =
xcalloc(2,
sizeof(*ds->N)); ds->N[0] = N;
610 ds->EVR =
xcalloc(2,
sizeof(*ds->EVR)); ds->EVR[0] = EVR;
612 ds->Flags =
xmalloc(
sizeof(*ds->Flags)); ds->Flags[0] = Flags;
620 return rpmdsLink(ds, (ds ? ds->Type : NULL));
625 return (ds != NULL ? ds->Count : 0);
630 return (ds != NULL ? ds->i : -1);
646 const char * DNEVR = NULL;
648 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
649 if (ds->DNEVR != NULL)
657 const char * N = NULL;
659 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
661 N = (ds->ns.N ? ds->ns.N :
rpmdsNewN(ds));
669 const char * EVR = NULL;
671 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
673 EVR = ds->EVR[ds->i];
682 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
683 if (ds->Flags != NULL)
684 Flags = ds->Flags[ds->i];
700 const char * A = NULL;
710 if (ds != NULL && ds->BT > 0)
719 oBT = (time_t)ds->BT;
729 NSType = ds->ns.Type;
738 nopromote = ds->nopromote;
747 onopromote = ds->nopromote;
748 ds->nopromote = nopromote;
754 int (*EVRparse)(
const char *evrstr,
EVR_t evr))
756 void * oEVRparse = NULL;
759 oEVRparse = ds->EVRparse;
760 ds->EVRparse = EVRparse;
767 void * oEVRcmp = NULL;
770 oEVRcmp = ds->EVRcmp;
780 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
781 if (ds->Color != NULL)
782 Color = ds->Color[ds->i];
794 if (ds->Color == NULL && ds->Count > 0)
795 ds->Color =
xcalloc(ds->Count,
sizeof(*ds->Color));
797 if (ds->i >= 0 && ds->i < (
int)ds->Count) {
798 if (ds->Color != NULL) {
799 ocolor = ds->Color[ds->i];
800 ds->Color[ds->i] = color;
808 return (ds != NULL ? ds->exclude : NULL);
813 return (ds != NULL ? ds->nexclude : 0);
818 return (ds != NULL ? ds->include : NULL);
823 return (ds != NULL ? ds->ninclude : 0);
830 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
831 if (ds->Refs != NULL)
832 Refs = ds->Refs[ds->i];
844 if (ds->Refs == NULL && ds->Count > 0)
845 ds->Refs =
xcalloc(ds->Count,
sizeof(*ds->Refs));
847 if (ds->i >= 0 && ds->i < (
int)ds->Count) {
848 if (ds->Refs != NULL) {
849 orefs = ds->Refs[ds->i];
850 ds->Refs[ds->i] = refs;
860 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
861 if (ds->Result != NULL)
862 result = ds->Result[ds->i];
874 if (ds->Result == NULL && ds->Count > 0)
875 ds->Result =
xcalloc(ds->Count,
sizeof(*ds->Result));
877 if (ds->i >= 0 && ds->i < (
int)ds->Count) {
878 if (ds->Result != NULL) {
879 oresult = ds->Result[ds->i];
880 ds->Result[ds->i] = result;
888 if (!(ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count))
890 if (ds->DNEVR == NULL)
894 (!strcmp(ds->DNEVR,
"cached") ? ds->DNEVR : ds->DNEVR+2),
895 (rc ?
_(
"NO ") :
_(
"YES")),
896 (where != NULL ? where :
""));
904 if (ds != NULL && ++ds->i >= 0) {
905 if (ds->i < (
int)ds->Count) {
908 ds->DNEVR =
_free(ds->DNEVR);
909 ds->ns.str =
_free(ds->ns.str);
910 memset(&ds->ns, 0,
sizeof(ds->ns));
911 t[0] = ((ds->Type != NULL) ? ds->Type[0] :
'\0');
921 if (_rpmds_debug < 0 && i != -1)
922 fprintf(stderr,
"*** ds %p\t%s[%d]: %s\n", ds, (ds->Type ? ds->Type :
"?Type?"), i, (ds->DNEVR ? ds->DNEVR :
"?DNEVR?"));
948 ds->h = (ods->h != NULL ?
headerLink(ods->h) : NULL);
949 ds->Type = ods->Type;
951 ds->tagN = ods->tagN;
952 ds->Count = ods->Count;
957 nb = (ds->Count+1) *
sizeof(*ds->N);
958 ds->N = (ds->h != NULL
959 ? memcpy(
xmalloc(nb), ods->N, nb)
963 assert(ods->EVR != NULL);
964 assert(ods->Flags != NULL);
966 nb = (ds->Count+1) *
sizeof(*ds->EVR);
967 ds->EVR = (ds->h != NULL
968 ? memcpy(
xmalloc(nb), ods->EVR, nb)
971 nb = (ds->Count *
sizeof(*ds->Flags));
972 ds->Flags = (ds->h != NULL
974 : memcpy(
xmalloc(nb), ods->Flags, nb) );
975 ds->nopromote = ods->nopromote;
977 ds->EVRcmp = ods->EVRcmp;;
981 return rpmdsLink(ds, (ds ? ds->Type : NULL));
990 if (ds == NULL || ods == NULL)
995 while (ds->l < ds->u) {
996 ds->i = (ds->l + ds->u) / 2;
998 comparison = strcmp(ods->N[ods->i], ds->N[ds->i]);
1002 if (comparison == 0 && ods->EVR && ds->EVR)
1003 comparison = strcmp(ods->EVR[ods->i], ds->EVR[ds->i]);
1004 if (comparison == 0 && ods->Flags && ds->Flags)
1005 comparison = (ods->Flags[ods->i] - ds->Flags[ds->i]);
1010 else if (comparison > 0)
1027 if (dsp == NULL || ods == NULL)
1057 for (j = ds->Count; j > (
int)ds->u; j--)
1058 ds->N[j] = ds->N[j-1];
1059 ds->N[ds->u] = ods->N[ods->i];
1061 ds->N =
_free(ds->N);
1066 assert(ods->EVR != NULL);
1067 assert(ods->Flags != NULL);
1069 for (j = ds->Count; j > (
int)ds->u; j--)
1070 ds->EVR[j] = ds->EVR[j-1];
1071 ds->EVR[ds->u] = ods->EVR[ods->i];
1073 ds->EVR =
_free(ds->EVR);
1076 Flags =
xmalloc((ds->Count+1) *
sizeof(*Flags));
1078 memcpy(Flags, ds->Flags, ds->u *
sizeof(*Flags));
1079 if (ds->u < ds->Count)
1080 memcpy(Flags + ds->u + 1, ds->Flags + ds->u, (ds->Count - ds->u) *
sizeof(*Flags));
1081 Flags[ds->u] = ods->Flags[ods->i];
1082 ds->Flags =
_free(ds->Flags);
1101 if (ds == NULL || ods == NULL)
1111 comparison = strcmp(ods->N[ods->i], ds->N[i]);
1115 else if (comparison > 0)
1119 if (strcmp(ods->N[ods->i], ds->N[l]))
1121 while (l > 0 && !strcmp(ods->N[ods->i], ds->N[l-1]))
1124 if (u >= (
int)ds->Count || strcmp(ods->N[ods->i], ds->N[u]))
1126 while (++u < (
int)ds->Count) {
1127 if (strcmp(ods->N[ods->i], ds->N[u]))
1138 while ((l =
rpmdsNext(ds)) >= 0 && (l < u)) {
1150 if (ods->Result != NULL)
1165 const char *N,
const char *EVR,
evrFlags Flags)
1172 t =
alloca(strlen(NS)+
sizeof(
"()")+strlen(N));
1182 #if defined(WITH_CPUINFO)
1185 const char * NS =
"cpuinfo";
1186 struct cpuinfo *cip = cpuinfo_new();
1187 cpuinfo_feature_t feature;
1191 unsigned char uc[4];
1193 static union _dbswap orderedbytes = { .
ui = 0x11223344 };
1194 const char *
endian = NULL;
1196 snprintf(tmp, 19,
"%d", cpuinfo_get_frequency(cip));
1199 snprintf(tmp, 19,
"%d", cpuinfo_get_cores(cip));
1201 snprintf(tmp, 19,
"%d", cpuinfo_get_threads(cip));
1204 if(orderedbytes.
uc[0] == 0x44)
1206 else if(orderedbytes.
uc[0] == 0x11)
1208 else if(orderedbytes.
uc[0] == 0x22)
1212 for (feature = cpuinfo_feature_common; feature != cpuinfo_feature_architecture_max; feature++) {
1213 if(feature == cpuinfo_feature_common_max)
1214 feature = cpuinfo_feature_architecture;
1215 if (cpuinfo_has_feature(cip, feature)) {
1216 const char *
name = cpuinfo_string_of_feature(feature);
1218 rpmdsNSAdd(dsp, NS, name,
"", RPMSENSE_PROBE);
1221 cpuinfo_destroy(cip);
1237 {
"processor", 0, 0 },
1238 {
"vendor_id", 0, 0 },
1239 {
"cpu_family", 0, 1 },
1241 {
"model_name", 0, 0 },
1242 {
"stepping", 0, 1 },
1243 {
"cpu_MHz", 0, 1 },
1244 {
"cache_size", 0, 1 },
1245 {
"physical_id", 0, 0 },
1246 {
"siblings", 0, 0 },
1247 {
"core_id", 0, 0 },
1248 {
"cpu_cores", 0, 0 },
1249 {
"fdiv_bug", 0, 3 },
1250 {
"hlt_bug", 0, 3 },
1251 {
"f00f_bug", 0, 3 },
1252 {
"coma_bug", 0, 3 },
1254 {
"fpu_exception", 0, 3 },
1255 {
"cpuid_level", 0, 0 },
1258 {
"bogomips", 0, 1 },
1259 {
"clflush_size", 0, 1 },
1275 for (ct = ctags; ct->
name != NULL; ct++) {
1276 if (strcmp(ct->
name, name))
1287 #define _PROC_CPUINFO "/proc/cpuinfo"
1298 const char * NS =
"cpuinfo";
1300 char * f, * fe, * fend;
1307 if (_cpuinfo_path == NULL) {
1308 _cpuinfo_path =
rpmExpand(
"%{?_rpmds_cpuinfo_path}", NULL);
1310 if (!(_cpuinfo_path != NULL && *_cpuinfo_path ==
'/')) {
1312 _cpuinfo_path =
_free(_cpuinfo_path);
1323 for (ct = ctags; ct->
name != NULL; ct++)
1327 if (!(xx == 0 && iob != NULL))
1330 for (f = (
char *)iob->b; *f !=
'\0'; f = fend) {
1333 while (*fe !=
'\0' && !(*fe ==
'\n' || *fe ==
'\r'))
1336 while (*fe !=
'\0' && (*fe ==
'\n' || *fe ==
'\r'))
1350 while (*fe && *fe !=
':')
1369 for (t = f; *t !=
'\0'; t++) {
1381 for (t = g; *t !=
'\0'; t++) {
1382 if (
_isspace(*t) || *t ==
'(' || *t ==
')')
1388 for (t = g; *t !=
'\0'; t++) {
1389 if (
_isspace(*t) || *t ==
'(' || *t ==
')')
1395 if (!strcmp(g,
"yes"))
1399 {
char ** av = NULL;
1401 rc = poptParseArgvString(g, NULL, (
const char ***)&av);
1402 if (!rc && av != NULL)
1403 while ((t = av[i++]) != NULL)
1430 {
"rpmlib(VersionedDependencies)",
"3.0.3-1",
1432 N_(
"PreReq:, Provides:, and Obsoletes: dependencies support versions.") },
1433 {
"rpmlib(CompressedFileNames)",
"3.0.4-1",
1435 N_(
"file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path.")},
1436 #if defined(WITH_BZIP2)
1437 {
"rpmlib(PayloadIsBzip2)",
"3.0.5-1",
1439 N_(
"package payload can be compressed using bzip2.") },
1441 {
"rpmlib(PayloadFilesHavePrefix)",
"4.0-1",
1443 N_(
"package payload file(s) have \"./\" prefix.") },
1444 {
"rpmlib(ExplicitPackageProvide)",
"4.0-1",
1446 N_(
"package name-version-release is not implicitly provided.") },
1447 {
"rpmlib(HeaderLoadSortsTags)",
"4.0.1-1",
1449 N_(
"header tags are always sorted after being loaded.") },
1450 {
"rpmlib(ScriptletInterpreterArgs)",
"4.0.3-1",
1452 N_(
"the scriptlet interpreter can use arguments from header.") },
1453 {
"rpmlib(PartialHardlinkSets)",
"4.0.4-1",
1455 N_(
"a hardlink file set may be installed without being complete.") },
1456 {
"rpmlib(ConcurrentAccess)",
"4.1-1",
1458 N_(
"package scriptlets may access the rpm database while installing.") },
1459 #if defined(WITH_LUA)
1460 {
"rpmlib(BuiltinLuaScripts)",
"4.2.2-1",
1462 N_(
"internal embedded lua scripts.") },
1464 #if defined(WITH_FICL)
1465 {
"rpmlib(BuiltinFiclScripts)",
"5.2-1",
1467 N_(
"internal embedded FICL.") },
1469 #if defined(WITH_JS)
1470 {
"rpmlib(BuiltinJavaScript)",
"5.2-1",
1472 N_(
"internal embedded JavaScript.") },
1474 #if defined(WITH_PERLEMBED)
1475 {
"rpmlib(BuiltinPerlScripts)",
"5.2-1",
1477 N_(
"internal embedded perl scripts.") },
1479 #if defined(WITH_PYTHONEMBED)
1480 {
"rpmlib(BuiltinPythonScripts)",
"5.2-1",
1482 N_(
"internal embedded python scripts.") },
1484 #if defined(WITH_RUBYEMBED)
1485 {
"rpmlib(BuiltinRubyScripts)",
"5.2-1",
1487 N_(
"internal embedded ruby scripts.") },
1489 #if defined(WITH_TCL)
1490 {
"rpmlib(BuiltinTclScripts)",
"5.2-1",
1492 N_(
"internal embedded tcl scripts.") },
1494 {
"rpmlib(HeaderTagTypeInt64)",
"4.4.3-1",
1496 N_(
"header tag data can be of type uint64_t.") },
1497 {
"rpmlib(PayloadIsUstar)",
"4.4.4-1",
1499 N_(
"package payload can be in ustar tar archive format.") },
1500 #if defined(WITH_XZ)
1501 {
"rpmlib(PayloadIsLzma)",
"4.4.6-1",
1503 N_(
"package payload can be compressed using lzma.") },
1505 {
"rpmlib(FileDigestParameterized)",
"4.4.6-1",
1507 N_(
"file digests can be other than MD5.") },
1508 {
"rpmlib(FileDigests)",
"4.6.0-1",
1510 N_(
"file digests can be other than MD5.") },
1511 #if defined(SUPPORT_AR_PAYLOADS)
1512 {
"rpmlib(PayloadIsAr)",
"5.1-1",
1514 N_(
"package payload can be in ar archive format.") },
1516 #if defined(WITH_XZ)
1517 {
"rpmlib(PayloadIsXz)",
"5.2-1",
1519 N_(
"package payload can be compressed using xz.") },
1521 { NULL, NULL, 0, NULL }
1539 for (rlp = rltblp; rlp->
featureName != NULL; rlp++) {
1561 const char *N, *EVR;
1577 fd =
Fopen(fn,
"r.fpio");
1578 if (fd == NULL ||
Ferror(fd))
1584 while((f = fgets(buf, (
int)
sizeof(buf), fp)) != NULL) {
1588 buf[
sizeof(buf)-1] =
'\0';
1595 if (f[0] ==
'-' &&
_isspace(f[1])) {
1596 f +=
sizeof(
"- ")-1;
1602 if (*f ==
'\0' || *f ==
'#')
1610 if (!(
xisalnum(f[0]) || strchr(
"/_%!", f[0]) != NULL)) {
1611 fprintf(stderr,
_(
"%s:%d \"%s\" has invalid name. Skipping ...\n"),
1618 if (*f ==
'!') fe++;
1619 while (*fe && !
_isspace(*fe) && strchr(
"!<=>", *fe) == NULL)
1629 if (*f !=
'/' && *fe !=
'\0') {
1634 fprintf(stderr,
_(
"%s:%d \"%s\" has no comparison operator. Skipping ...\n"),
1645 fprintf(stderr,
_(
"%s:%d \"%s\" has no EVR string. Skipping ...\n"),
1662 Flags |= RPMSENSE_PROBE;
1673 if (fd != NULL) (void)
Fclose(fd);
1677 #if defined(RPM_VENDOR_WINDRIVER)
1678 #define _ETC_RPM_SYSINFO "%{_etcrpm}/sysinfo"
1680 #define _ETC_RPM_SYSINFO SYSCONFIGDIR "/sysinfo"
1703 struct stat * st = memset(
alloca(
sizeof(*st)), 0,
sizeof(*st));
1708 if (_sysinfo_path == NULL) {
1709 _sysinfo_path =
rpmExpand(
"%{?_rpmds_sysinfo_path}", NULL);
1711 if (!(_sysinfo_path != NULL && *_sysinfo_path ==
'/')) {
1713 _sysinfo_path =
_free(_sysinfo_path);
1730 if (S_ISDIR(st->st_mode)) {
1731 const char *dn = fn;
1735 for (av = _sysinfo_tags; av && *av; av++) {
1740 st = memset(st, 0,
sizeof(*st));
1742 if (xx == 0 && S_ISREG(st->st_mode))
1750 if (S_ISREG(st->st_mode))
1767 {
"LINK_MAX", _PC_LINK_MAX,
PATHCONF },
1770 {
"_POSIX_LINK_MAX", _PC_LINK_MAX,
PATHCONF },
1772 #ifdef _PC_MAX_CANON
1773 {
"MAX_CANON", _PC_MAX_CANON,
PATHCONF },
1775 #ifdef _PC_MAX_CANON
1776 {
"_POSIX_MAX_CANON", _PC_MAX_CANON,
PATHCONF },
1778 #ifdef _PC_MAX_INPUT
1779 {
"MAX_INPUT", _PC_MAX_INPUT,
PATHCONF },
1781 #ifdef _PC_MAX_INPUT
1782 {
"_POSIX_MAX_INPUT", _PC_MAX_INPUT,
PATHCONF },
1785 {
"NAME_MAX", _PC_NAME_MAX,
PATHCONF },
1788 {
"_POSIX_NAME_MAX", _PC_NAME_MAX,
PATHCONF },
1791 {
"PATH_MAX", _PC_PATH_MAX,
PATHCONF },
1794 {
"_POSIX_PATH_MAX", _PC_PATH_MAX,
PATHCONF },
1797 {
"PIPE_BUF", _PC_PIPE_BUF,
PATHCONF },
1800 {
"_POSIX_PIPE_BUF", _PC_PIPE_BUF,
PATHCONF },
1802 #ifdef _PC_SOCK_MAXBUF
1803 {
"SOCK_MAXBUF", _PC_SOCK_MAXBUF,
PATHCONF },
1806 {
"_POSIX_ASYNC_IO", _PC_ASYNC_IO,
PATHCONF },
1808 #ifdef _PC_CHOWN_RESTRICTED
1809 {
"_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED,
PATHCONF },
1812 {
"_POSIX_NO_TRUNC", _PC_NO_TRUNC,
PATHCONF },
1815 {
"_POSIX_PRIO_IO", _PC_PRIO_IO,
PATHCONF },
1818 {
"_POSIX_SYNC_IO", _PC_SYNC_IO,
PATHCONF },
1821 {
"_POSIX_VDISABLE", _PC_VDISABLE,
PATHCONF },
1825 {
"ARG_MAX", _SC_ARG_MAX,
SYSCONF },
1827 #ifdef _SC_ATEXIT_MAX
1828 {
"ATEXIT_MAX", _SC_ATEXIT_MAX,
SYSCONF },
1831 {
"CHAR_BIT", _SC_CHAR_BIT,
SYSCONF },
1834 {
"CHAR_MAX", _SC_CHAR_MAX,
SYSCONF },
1837 {
"CHAR_MIN", _SC_CHAR_MIN,
SYSCONF },
1839 #ifdef _SC_CHILD_MAX
1840 {
"CHILD_MAX", _SC_CHILD_MAX,
SYSCONF },
1843 {
"CLK_TCK", _SC_CLK_TCK,
SYSCONF },
1846 {
"INT_MAX", _SC_INT_MAX,
SYSCONF },
1849 {
"INT_MIN", _SC_INT_MIN,
SYSCONF },
1851 #ifdef _SC_UIO_MAXIOV
1852 {
"IOV_MAX", _SC_UIO_MAXIOV,
SYSCONF },
1854 #ifdef _SC_LOGIN_NAME_MAX
1855 {
"LOGNAME_MAX", _SC_LOGIN_NAME_MAX,
SYSCONF },
1858 {
"LONG_BIT", _SC_LONG_BIT,
SYSCONF },
1860 #ifdef _SC_MB_LEN_MAX
1861 {
"MB_LEN_MAX", _SC_MB_LEN_MAX,
SYSCONF },
1863 #ifdef _SC_NGROUPS_MAX
1864 {
"NGROUPS_MAX", _SC_NGROUPS_MAX,
SYSCONF },
1866 #ifdef _SC_NL_ARGMAX
1867 {
"NL_ARGMAX", _SC_NL_ARGMAX,
SYSCONF },
1869 #ifdef _SC_NL_LANGMAX
1870 {
"NL_LANGMAX", _SC_NL_LANGMAX,
SYSCONF },
1872 #ifdef _SC_NL_MSGMAX
1873 {
"NL_MSGMAX", _SC_NL_MSGMAX,
SYSCONF },
1876 {
"NL_NMAX", _SC_NL_NMAX,
SYSCONF },
1878 #ifdef _SC_NL_SETMAX
1879 {
"NL_SETMAX", _SC_NL_SETMAX,
SYSCONF },
1881 #ifdef _SC_NL_TEXTMAX
1882 {
"NL_TEXTMAX", _SC_NL_TEXTMAX,
SYSCONF },
1884 #ifdef _SC_GETGR_R_SIZE_MAX
1885 {
"NSS_BUFLEN_GROUP", _SC_GETGR_R_SIZE_MAX,
SYSCONF },
1887 #ifdef _SC_GETPW_R_SIZE_MAX
1888 {
"NSS_BUFLEN_PASSWD", _SC_GETPW_R_SIZE_MAX,
SYSCONF },
1891 {
"NZERO", _SC_NZERO,
SYSCONF },
1894 {
"OPEN_MAX", _SC_OPEN_MAX,
SYSCONF },
1897 {
"PAGESIZE", _SC_PAGESIZE,
SYSCONF },
1900 {
"PAGE_SIZE", _SC_PAGESIZE,
SYSCONF },
1903 {
"PASS_MAX", _SC_PASS_MAX,
SYSCONF },
1905 #ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
1906 {
"PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS,
SYSCONF },
1908 #ifdef _SC_THREAD_KEYS_MAX
1909 {
"PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX,
SYSCONF },
1911 #ifdef _SC_THREAD_STACK_MIN
1912 {
"PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN,
SYSCONF },
1914 #ifdef _SC_THREAD_THREADS_MAX
1915 {
"PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX,
SYSCONF },
1917 #ifdef _SC_SCHAR_MAX
1918 {
"SCHAR_MAX", _SC_SCHAR_MAX,
SYSCONF },
1920 #ifdef _SC_SCHAR_MIN
1921 {
"SCHAR_MIN", _SC_SCHAR_MIN,
SYSCONF },
1924 {
"SHRT_MAX", _SC_SHRT_MAX,
SYSCONF },
1927 {
"SHRT_MIN", _SC_SHRT_MIN,
SYSCONF },
1929 #ifdef _SC_SSIZE_MAX
1930 {
"SSIZE_MAX", _SC_SSIZE_MAX,
SYSCONF },
1932 #ifdef _SC_TTY_NAME_MAX
1933 {
"TTY_NAME_MAX", _SC_TTY_NAME_MAX,
SYSCONF },
1935 #ifdef _SC_TZNAME_MAX
1936 {
"TZNAME_MAX", _SC_TZNAME_MAX,
SYSCONF },
1938 #ifdef _SC_UCHAR_MAX
1939 {
"UCHAR_MAX", _SC_UCHAR_MAX,
SYSCONF },
1942 {
"UINT_MAX", _SC_UINT_MAX,
SYSCONF },
1944 #ifdef _SC_UIO_MAXIOV
1945 {
"UIO_MAXIOV", _SC_UIO_MAXIOV,
SYSCONF },
1947 #ifdef _SC_ULONG_MAX
1948 {
"ULONG_MAX", _SC_ULONG_MAX,
SYSCONF },
1950 #ifdef _SC_USHRT_MAX
1951 {
"USHRT_MAX", _SC_USHRT_MAX,
SYSCONF },
1954 {
"WORD_BIT", _SC_WORD_BIT,
SYSCONF },
1956 #ifdef _SC_AVPHYS_PAGES
1957 {
"_AVPHYS_PAGES", _SC_AVPHYS_PAGES,
SYSCONF },
1959 #ifdef _SC_NPROCESSORS_CONF
1960 {
"_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF,
SYSCONF },
1962 #ifdef _SC_NPROCESSORS_ONLN
1963 {
"_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN,
SYSCONF },
1965 #ifdef _SC_PHYS_PAGES
1966 {
"_PHYS_PAGES", _SC_PHYS_PAGES,
SYSCONF },
1969 {
"_POSIX_ARG_MAX", _SC_ARG_MAX,
SYSCONF },
1971 #ifdef _SC_ASYNCHRONOUS_IO
1972 {
"_POSIX_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO,
SYSCONF },
1974 #ifdef _SC_CHILD_MAX
1975 {
"_POSIX_CHILD_MAX", _SC_CHILD_MAX,
SYSCONF },
1978 {
"_POSIX_FSYNC", _SC_FSYNC,
SYSCONF },
1980 #ifdef _SC_JOB_CONTROL
1981 {
"_POSIX_JOB_CONTROL", _SC_JOB_CONTROL,
SYSCONF },
1983 #ifdef _SC_MAPPED_FILES
1984 {
"_POSIX_MAPPED_FILES", _SC_MAPPED_FILES,
SYSCONF },
1987 {
"_POSIX_MEMLOCK", _SC_MEMLOCK,
SYSCONF },
1989 #ifdef _SC_MEMLOCK_RANGE
1990 {
"_POSIX_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE,
SYSCONF },
1992 #ifdef _SC_MEMORY_PROTECTION
1993 {
"_POSIX_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION,
SYSCONF },
1995 #ifdef _SC_MESSAGE_PASSING
1996 {
"_POSIX_MESSAGE_PASSING", _SC_MESSAGE_PASSING,
SYSCONF },
1998 #ifdef _SC_NGROUPS_MAX
1999 {
"_POSIX_NGROUPS_MAX", _SC_NGROUPS_MAX,
SYSCONF },
2002 {
"_POSIX_OPEN_MAX", _SC_OPEN_MAX,
SYSCONF },
2005 {
"_POSIX_PII", _SC_PII,
SYSCONF },
2007 #ifdef _SC_PII_INTERNET
2008 {
"_POSIX_PII_INTERNET", _SC_PII_INTERNET,
SYSCONF },
2010 #ifdef _SC_PII_INTERNET_DGRAM
2011 {
"_POSIX_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM,
SYSCONF },
2013 #ifdef _SC_PII_INTERNET_STREAM
2014 {
"_POSIX_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM,
SYSCONF },
2017 {
"_POSIX_PII_OSI", _SC_PII_OSI,
SYSCONF },
2019 #ifdef _SC_PII_OSI_CLTS
2020 {
"_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS,
SYSCONF },
2022 #ifdef _SC_PII_OSI_COTS
2023 {
"_POSIX_PII_OSI_COTS", _SC_PII_OSI_COTS,
SYSCONF },
2025 #ifdef _SC_PII_OSI_M
2026 {
"_POSIX_PII_OSI_M", _SC_PII_OSI_M,
SYSCONF },
2028 #ifdef _SC_PII_SOCKET
2029 {
"_POSIX_PII_SOCKET", _SC_PII_SOCKET,
SYSCONF },
2032 {
"_POSIX_PII_XTI", _SC_PII_XTI,
SYSCONF },
2035 {
"_POSIX_POLL", _SC_POLL,
SYSCONF },
2037 #ifdef _SC_PRIORITIZED_IO
2038 {
"_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO,
SYSCONF },
2040 #ifdef _SC_PRIORITY_SCHEDULING
2041 {
"_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING,
SYSCONF },
2043 #ifdef _SC_REALTIME_SIGNALS
2044 {
"_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS,
SYSCONF },
2046 #ifdef _SC_SAVED_IDS
2047 {
"_POSIX_SAVED_IDS", _SC_SAVED_IDS,
SYSCONF },
2050 {
"_POSIX_SELECT", _SC_SELECT,
SYSCONF },
2052 #ifdef _SC_SEMAPHORES
2053 {
"_POSIX_SEMAPHORES", _SC_SEMAPHORES,
SYSCONF },
2055 #ifdef _SC_SHARED_MEMORY_OBJECTS
2056 {
"_POSIX_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS,
SYSCONF },
2058 #ifdef _SC_SSIZE_MAX
2059 {
"_POSIX_SSIZE_MAX", _SC_SSIZE_MAX,
SYSCONF },
2061 #ifdef _SC_STREAM_MAX
2062 {
"_POSIX_STREAM_MAX", _SC_STREAM_MAX,
SYSCONF },
2064 #ifdef _SC_SYNCHRONIZED_IO
2065 {
"_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO,
SYSCONF },
2068 {
"_POSIX_THREADS", _SC_THREADS,
SYSCONF },
2070 #ifdef _SC_THREAD_ATTR_STACKADDR
2071 {
"_POSIX_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR,
SYSCONF },
2073 #ifdef _SC_THREAD_ATTR_STACKSIZE
2074 {
"_POSIX_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE,
SYSCONF },
2076 #ifdef _SC_THREAD_PRIORITY_SCHEDULING
2077 {
"_POSIX_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING,
SYSCONF },
2079 #ifdef _SC_THREAD_PRIO_INHERIT
2080 {
"_POSIX_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT,
SYSCONF },
2082 #ifdef _SC_THREAD_PRIO_PROTECT
2083 {
"_POSIX_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT,
SYSCONF },
2085 #ifdef _SC_THREAD_PROCESS_SHARED
2086 {
"_POSIX_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED,
SYSCONF },
2088 #ifdef _SC_THREAD_SAFE_FUNCTIONS
2089 {
"_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS,
SYSCONF },
2092 {
"_POSIX_TIMERS", _SC_TIMERS,
SYSCONF },
2094 #ifdef _SC_TIMER_MAX
2095 {
"TIMER_MAX", _SC_TIMER_MAX,
SYSCONF },
2097 #ifdef _SC_TZNAME_MAX
2098 {
"_POSIX_TZNAME_MAX", _SC_TZNAME_MAX,
SYSCONF },
2101 {
"_POSIX_VERSION", _SC_VERSION,
SYSCONF },
2103 #ifdef _SC_T_IOV_MAX
2104 {
"_T_IOV_MAX", _SC_T_IOV_MAX,
SYSCONF },
2106 #ifdef _SC_XOPEN_CRYPT
2107 {
"_XOPEN_CRYPT", _SC_XOPEN_CRYPT,
SYSCONF },
2109 #ifdef _SC_XOPEN_ENH_I18N
2110 {
"_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N,
SYSCONF },
2112 #ifdef _SC_XOPEN_LEGACY
2113 {
"_XOPEN_LEGACY", _SC_XOPEN_LEGACY,
SYSCONF },
2115 #ifdef _SC_XOPEN_REALTIME
2116 {
"_XOPEN_REALTIME", _SC_XOPEN_REALTIME,
SYSCONF },
2118 #ifdef _SC_XOPEN_REALTIME_THREADS
2119 {
"_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS,
SYSCONF },
2121 #ifdef _SC_XOPEN_SHM
2122 {
"_XOPEN_SHM", _SC_XOPEN_SHM,
SYSCONF },
2124 #ifdef _SC_XOPEN_UNIX
2125 {
"_XOPEN_UNIX", _SC_XOPEN_UNIX,
SYSCONF },
2127 #ifdef _SC_XOPEN_VERSION
2128 {
"_XOPEN_VERSION", _SC_XOPEN_VERSION,
SYSCONF },
2130 #ifdef _SC_XOPEN_XCU_VERSION
2131 {
"_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION,
SYSCONF },
2133 #ifdef _SC_XOPEN_XPG2
2134 {
"_XOPEN_XPG2", _SC_XOPEN_XPG2,
SYSCONF },
2136 #ifdef _SC_XOPEN_XPG3
2137 {
"_XOPEN_XPG3", _SC_XOPEN_XPG3,
SYSCONF },
2139 #ifdef _SC_XOPEN_XPG4
2140 {
"_XOPEN_XPG4", _SC_XOPEN_XPG4,
SYSCONF },
2143 #ifdef _SC_BC_BASE_MAX
2144 {
"BC_BASE_MAX", _SC_BC_BASE_MAX,
SYSCONF },
2146 #ifdef _SC_BC_DIM_MAX
2147 {
"BC_DIM_MAX", _SC_BC_DIM_MAX,
SYSCONF },
2149 #ifdef _SC_BC_SCALE_MAX
2150 {
"BC_SCALE_MAX", _SC_BC_SCALE_MAX,
SYSCONF },
2152 #ifdef _SC_BC_STRING_MAX
2153 {
"BC_STRING_MAX", _SC_BC_STRING_MAX,
SYSCONF },
2155 #ifdef _SC_CHARCLASS_NAME_MAX
2156 {
"CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX,
SYSCONF },
2158 #ifdef _SC_COLL_WEIGHTS_MAX
2159 {
"COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX,
SYSCONF },
2161 #ifdef _SC_EQUIV_CLASS_MAX
2162 {
"EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX,
SYSCONF },
2164 #ifdef _SC_EXPR_NEST_MAX
2165 {
"EXPR_NEST_MAX", _SC_EXPR_NEST_MAX,
SYSCONF },
2168 {
"LINE_MAX", _SC_LINE_MAX,
SYSCONF },
2170 #ifdef _SC_BC_BASE_MAX
2171 {
"POSIX2_BC_BASE_MAX", _SC_BC_BASE_MAX,
SYSCONF },
2173 #ifdef _SC_BC_DIM_MAX
2174 {
"POSIX2_BC_DIM_MAX", _SC_BC_DIM_MAX,
SYSCONF },
2176 #ifdef _SC_BC_SCALE_MAX
2177 {
"POSIX2_BC_SCALE_MAX", _SC_BC_SCALE_MAX,
SYSCONF },
2179 #ifdef _SC_BC_STRING_MAX
2180 {
"POSIX2_BC_STRING_MAX", _SC_BC_STRING_MAX,
SYSCONF },
2182 #ifdef _SC_2_CHAR_TERM
2183 {
"POSIX2_CHAR_TERM", _SC_2_CHAR_TERM,
SYSCONF },
2185 #ifdef _SC_COLL_WEIGHTS_MAX
2186 {
"POSIX2_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX,
SYSCONF },
2189 {
"POSIX2_C_BIND", _SC_2_C_BIND,
SYSCONF },
2192 {
"POSIX2_C_DEV", _SC_2_C_DEV,
SYSCONF },
2194 #ifdef _SC_2_C_VERSION
2195 {
"POSIX2_C_VERSION", _SC_2_C_VERSION,
SYSCONF },
2197 #ifdef _SC_EXPR_NEST_MAX
2198 {
"POSIX2_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX,
SYSCONF },
2200 #ifdef _SC_2_FORT_DEV
2201 {
"POSIX2_FORT_DEV", _SC_2_FORT_DEV,
SYSCONF },
2203 #ifdef _SC_2_FORT_RUN
2204 {
"POSIX2_FORT_RUN", _SC_2_FORT_RUN,
SYSCONF },
2207 {
"_POSIX2_LINE_MAX", _SC_LINE_MAX,
SYSCONF },
2209 #ifdef _SC_2_LOCALEDEF
2210 {
"POSIX2_LOCALEDEF", _SC_2_LOCALEDEF,
SYSCONF },
2212 #ifdef _SC_RE_DUP_MAX
2213 {
"POSIX2_RE_DUP_MAX", _SC_RE_DUP_MAX,
SYSCONF },
2216 {
"POSIX2_SW_DEV", _SC_2_SW_DEV,
SYSCONF },
2219 {
"POSIX2_UPE", _SC_2_UPE,
SYSCONF },
2221 #ifdef _SC_2_VERSION
2222 {
"POSIX2_VERSION", _SC_2_VERSION,
SYSCONF },
2224 #ifdef _SC_RE_DUP_MAX
2225 {
"RE_DUP_MAX", _SC_RE_DUP_MAX,
SYSCONF },
2229 {
"PATH", _CS_PATH,
CONFSTR },
2230 {
"CS_PATH", _CS_PATH,
CONFSTR },
2234 #ifdef _CS_LFS_CFLAGS
2235 {
"LFS_CFLAGS", _CS_LFS_CFLAGS,
CONFSTR },
2237 #ifdef _CS_LFS_LDFLAGS
2238 {
"LFS_LDFLAGS", _CS_LFS_LDFLAGS,
CONFSTR },
2241 {
"LFS_LIBS", _CS_LFS_LIBS,
CONFSTR },
2243 #ifdef _CS_LFS_LINTFLAGS
2244 {
"LFS_LINTFLAGS", _CS_LFS_LINTFLAGS,
CONFSTR },
2246 #ifdef _CS_LFS64_CFLAGS
2247 {
"LFS64_CFLAGS", _CS_LFS64_CFLAGS,
CONFSTR },
2249 #ifdef _CS_LFS64_LDFLAGS
2250 {
"LFS64_LDFLAGS", _CS_LFS64_LDFLAGS,
CONFSTR },
2252 #ifdef _CS_LFS64_LIBS
2253 {
"LFS64_LIBS", _CS_LFS64_LIBS,
CONFSTR },
2255 #ifdef _CS_LFS64_LINTFLAGS
2256 {
"LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS,
CONFSTR },
2260 #ifdef _SC_XBS5_ILP32_OFF32
2261 {
"_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32,
SYSCONF },
2263 #ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
2264 {
"XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS,
CONFSTR },
2266 #ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
2267 {
"XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS,
CONFSTR },
2269 #ifdef _CS_XBS5_ILP32_OFF32_LIBS
2270 {
"XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS,
CONFSTR },
2272 #ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
2273 {
"XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS,
CONFSTR },
2276 #ifdef _SC_XBS5_ILP32_OFFBIG
2277 {
"_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG,
SYSCONF },
2279 #ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
2280 {
"XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS,
CONFSTR },
2282 #ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
2283 {
"XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS,
CONFSTR },
2285 #ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
2286 {
"XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS,
CONFSTR },
2288 #ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
2289 {
"XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS,
CONFSTR },
2292 #ifdef _SC_XBS5_LP64_OFF64
2293 {
"_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64,
SYSCONF },
2295 #ifdef _CS_XBS5_LP64_OFF64_CFLAGS
2296 {
"XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS,
CONFSTR },
2298 #ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
2299 {
"XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS,
CONFSTR },
2301 #ifdef _CS_XBS5_LP64_OFF64_LIBS
2302 {
"XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS,
CONFSTR },
2304 #ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
2305 {
"XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS,
CONFSTR },
2308 #ifdef _SC_XBS5_LPBIG_OFFBIG
2309 {
"_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG,
SYSCONF },
2311 #ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
2312 {
"XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS,
CONFSTR },
2314 #ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
2315 {
"XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,
CONFSTR },
2317 #ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
2318 {
"XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS,
CONFSTR },
2320 #ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
2321 {
"XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS,
CONFSTR },
2324 #ifdef _SC_V6_ILP32_OFF32
2325 {
"_POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32,
SYSCONF },
2327 #ifdef _CS_POSIX_V6_ILP32_OFF32_CFLAGS
2328 {
"POSIX_V6_ILP32_OFF32_CFLAGS", _CS_POSIX_V6_ILP32_OFF32_CFLAGS,
CONFSTR },
2330 #ifdef _CS_POSIX_V6_ILP32_OFF32_LDFLAGS
2331 {
"POSIX_V6_ILP32_OFF32_LDFLAGS", _CS_POSIX_V6_ILP32_OFF32_LDFLAGS,
CONFSTR },
2333 #ifdef _CS_POSIX_V6_ILP32_OFF32_LIBS
2334 {
"POSIX_V6_ILP32_OFF32_LIBS", _CS_POSIX_V6_ILP32_OFF32_LIBS,
CONFSTR },
2336 #ifdef _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS
2337 {
"POSIX_V6_ILP32_OFF32_LINTFLAGS", _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS,
CONFSTR },
2340 #ifdef _CS_V6_WIDTH_RESTRICTED_ENVS
2341 {
"_POSIX_V6_WIDTH_RESTRICTED_ENVS", _CS_V6_WIDTH_RESTRICTED_ENVS,
CONFSTR },
2344 #ifdef _SC_V6_ILP32_OFFBIG
2345 {
"_POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG,
SYSCONF },
2347 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS
2348 {
"POSIX_V6_ILP32_OFFBIG_CFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS,
CONFSTR },
2350 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS
2351 {
"POSIX_V6_ILP32_OFFBIG_LDFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS,
CONFSTR },
2353 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LIBS
2354 {
"POSIX_V6_ILP32_OFFBIG_LIBS", _CS_POSIX_V6_ILP32_OFFBIG_LIBS,
CONFSTR },
2356 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS
2357 {
"POSIX_V6_ILP32_OFFBIG_LINTFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS,
CONFSTR },
2360 #ifdef _SC_V6_LP64_OFF64
2361 {
"_POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64,
SYSCONF },
2363 #ifdef _CS_POSIX_V6_LP64_OFF64_CFLAGS
2364 {
"POSIX_V6_LP64_OFF64_CFLAGS", _CS_POSIX_V6_LP64_OFF64_CFLAGS,
CONFSTR },
2366 #ifdef _CS_POSIX_V6_LP64_OFF64_LDFLAGS
2367 {
"POSIX_V6_LP64_OFF64_LDFLAGS", _CS_POSIX_V6_LP64_OFF64_LDFLAGS,
CONFSTR },
2369 #ifdef _CS_POSIX_V6_LP64_OFF64_LIBS
2370 {
"POSIX_V6_LP64_OFF64_LIBS", _CS_POSIX_V6_LP64_OFF64_LIBS,
CONFSTR },
2372 #ifdef _CS_POSIX_V6_LP64_OFF64_LINTFLAGS
2373 {
"POSIX_V6_LP64_OFF64_LINTFLAGS", _CS_POSIX_V6_LP64_OFF64_LINTFLAGS,
CONFSTR },
2376 #ifdef _SC_V6_LPBIG_OFFBIG
2377 {
"_POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG,
SYSCONF },
2379 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS
2380 {
"POSIX_V6_LPBIG_OFFBIG_CFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS,
CONFSTR },
2382 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS
2383 {
"POSIX_V6_LPBIG_OFFBIG_LDFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS,
CONFSTR },
2385 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LIBS
2386 {
"POSIX_V6_LPBIG_OFFBIG_LIBS", _CS_POSIX_V6_LPBIG_OFFBIG_LIBS,
CONFSTR },
2388 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS
2389 {
"POSIX_V6_LPBIG_OFFBIG_LINTFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS,
CONFSTR },
2392 #ifdef _SC_ADVISORY_INFO
2393 {
"_POSIX_ADVISORY_INFO", _SC_ADVISORY_INFO,
SYSCONF },
2396 {
"_POSIX_BARRIERS", _SC_BARRIERS,
SYSCONF },
2399 {
"_POSIX_BASE", _SC_BASE,
SYSCONF },
2401 #ifdef _SC_C_LANG_SUPPORT
2402 {
"_POSIX_C_LANG_SUPPORT", _SC_C_LANG_SUPPORT,
SYSCONF },
2404 #ifdef _SC_C_LANG_SUPPORT_R
2405 {
"_POSIX_C_LANG_SUPPORT_R", _SC_C_LANG_SUPPORT_R,
SYSCONF },
2407 #ifdef _SC_CLOCK_SELECTION
2408 {
"_POSIX_CLOCK_SELECTION", _SC_CLOCK_SELECTION,
SYSCONF },
2411 {
"_POSIX_CPUTIME", _SC_CPUTIME,
SYSCONF },
2413 #ifdef _SC_THREAD_CPUTIME
2414 {
"_POSIX_THREAD_CPUTIME", _SC_THREAD_CPUTIME,
SYSCONF },
2416 #ifdef _SC_DEVICE_SPECIFIC
2417 {
"_POSIX_DEVICE_SPECIFIC", _SC_DEVICE_SPECIFIC,
SYSCONF },
2419 #ifdef _SC_DEVICE_SPECIFIC_R
2420 {
"_POSIX_DEVICE_SPECIFIC_R", _SC_DEVICE_SPECIFIC_R,
SYSCONF },
2423 {
"_POSIX_FD_MGMT", _SC_FD_MGMT,
SYSCONF },
2426 {
"_POSIX_FIFO", _SC_FIFO,
SYSCONF },
2429 {
"_POSIX_PIPE", _SC_PIPE,
SYSCONF },
2431 #ifdef _SC_FILE_ATTRIBUTES
2432 {
"_POSIX_FILE_ATTRIBUTES", _SC_FILE_ATTRIBUTES,
SYSCONF },
2434 #ifdef _SC_FILE_LOCKING
2435 {
"_POSIX_FILE_LOCKING", _SC_FILE_LOCKING,
SYSCONF },
2437 #ifdef _SC_FILE_SYSTEM
2438 {
"_POSIX_FILE_SYSTEM", _SC_FILE_SYSTEM,
SYSCONF },
2440 #ifdef _SC_MONOTONIC_CLOCK
2441 {
"_POSIX_MONOTONIC_CLOCK", _SC_MONOTONIC_CLOCK,
SYSCONF },
2443 #ifdef _SC_MULTI_PROCESS
2444 {
"_POSIX_MULTI_PROCESS", _SC_MULTI_PROCESS,
SYSCONF },
2446 #ifdef _SC_SINGLE_PROCESS
2447 {
"_POSIX_SINGLE_PROCESS", _SC_SINGLE_PROCESS,
SYSCONF },
2449 #ifdef _SC_NETWORKING
2450 {
"_POSIX_NETWORKING", _SC_NETWORKING,
SYSCONF },
2452 #ifdef _SC_READER_WRITER_LOCKS
2453 {
"_POSIX_READER_WRITER_LOCKS", _SC_READER_WRITER_LOCKS,
SYSCONF },
2455 #ifdef _SC_SPIN_LOCKS
2456 {
"_POSIX_SPIN_LOCKS", _SC_SPIN_LOCKS,
SYSCONF },
2459 {
"_POSIX_REGEXP", _SC_REGEXP,
SYSCONF },
2461 #ifdef _SC_REGEX_VERSION
2462 {
"_REGEX_VERSION", _SC_REGEX_VERSION,
SYSCONF },
2465 {
"_POSIX_SHELL", _SC_SHELL,
SYSCONF },
2468 {
"_POSIX_SIGNALS", _SC_SIGNALS,
SYSCONF },
2471 {
"_POSIX_SPAWN", _SC_SPAWN,
SYSCONF },
2473 #ifdef _SC_SPORADIC_SERVER
2474 {
"_POSIX_SPORADIC_SERVER", _SC_SPORADIC_SERVER,
SYSCONF },
2476 #ifdef _SC_THREAD_SPORADIC_SERVER
2477 {
"_POSIX_THREAD_SPORADIC_SERVER", _SC_THREAD_SPORADIC_SERVER,
SYSCONF },
2479 #ifdef _SC_SYSTEM_DATABASE
2480 {
"_POSIX_SYSTEM_DATABASE", _SC_SYSTEM_DATABASE,
SYSCONF },
2482 #ifdef _SC_SYSTEM_DATABASE_R
2483 {
"_POSIX_SYSTEM_DATABASE_R", _SC_SYSTEM_DATABASE_R,
SYSCONF },
2486 {
"_POSIX_TIMEOUTS", _SC_TIMEOUTS,
SYSCONF },
2488 #ifdef _SC_TYPED_MEMORY_OBJECTS
2489 {
"_POSIX_TYPED_MEMORY_OBJECTS", _SC_TYPED_MEMORY_OBJECTS,
SYSCONF },
2491 #ifdef _SC_USER_GROUPS
2492 {
"_POSIX_USER_GROUPS", _SC_USER_GROUPS,
SYSCONF },
2494 #ifdef _SC_USER_GROUPS_R
2495 {
"_POSIX_USER_GROUPS_R", _SC_USER_GROUPS_R,
SYSCONF },
2498 {
"POSIX2_PBS", _SC_2_PBS,
SYSCONF },
2500 #ifdef _SC_2_PBS_ACCOUNTING
2501 {
"POSIX2_PBS_ACCOUNTING", _SC_2_PBS_ACCOUNTING,
SYSCONF },
2503 #ifdef _SC_2_PBS_LOCATE
2504 {
"POSIX2_PBS_LOCATE", _SC_2_PBS_LOCATE,
SYSCONF },
2506 #ifdef _SC_2_PBS_TRACK
2507 {
"POSIX2_PBS_TRACK", _SC_2_PBS_TRACK,
SYSCONF },
2509 #ifdef _SC_2_PBS_MESSAGE
2510 {
"POSIX2_PBS_MESSAGE", _SC_2_PBS_MESSAGE,
SYSCONF },
2512 #ifdef _SC_SYMLOOP_MAX
2513 {
"SYMLOOP_MAX", _SC_SYMLOOP_MAX,
SYSCONF },
2515 #ifdef _SC_STREAM_MAX
2516 {
"STREAM_MAX", _SC_STREAM_MAX,
SYSCONF },
2518 #ifdef _SC_AIO_LISTIO_MAX
2519 {
"AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX,
SYSCONF },
2522 {
"AIO_MAX", _SC_AIO_MAX,
SYSCONF },
2524 #ifdef _SC_AIO_PRIO_DELTA_MAX
2525 {
"AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX,
SYSCONF },
2527 #ifdef _SC_DELAYTIMER_MAX
2528 {
"DELAYTIMER_MAX", _SC_DELAYTIMER_MAX,
SYSCONF },
2530 #ifdef _SC_HOST_NAME_MAX
2531 {
"HOST_NAME_MAX", _SC_HOST_NAME_MAX,
SYSCONF },
2533 #ifdef _SC_LOGIN_NAME_MAX
2534 {
"LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX,
SYSCONF },
2536 #ifdef _SC_MQ_OPEN_MAX
2537 {
"MQ_OPEN_MAX", _SC_MQ_OPEN_MAX,
SYSCONF },
2539 #ifdef _SC_MQ_PRIO_MAX
2540 {
"MQ_PRIO_MAX", _SC_MQ_PRIO_MAX,
SYSCONF },
2542 #ifdef _SC_DEVICE_IO
2543 {
"_POSIX_DEVICE_IO", _SC_DEVICE_IO,
SYSCONF },
2546 {
"_POSIX_TRACE", _SC_TRACE,
SYSCONF },
2548 #ifdef _SC_TRACE_EVENT_FILTER
2549 {
"_POSIX_TRACE_EVENT_FILTER", _SC_TRACE_EVENT_FILTER,
SYSCONF },
2551 #ifdef _SC_TRACE_INHERIT
2552 {
"_POSIX_TRACE_INHERIT", _SC_TRACE_INHERIT,
SYSCONF },
2554 #ifdef _SC_TRACE_LOG
2555 {
"_POSIX_TRACE_LOG", _SC_TRACE_LOG,
SYSCONF },
2557 #ifdef _SC_RTSIG_MAX
2558 {
"RTSIG_MAX", _SC_RTSIG_MAX,
SYSCONF },
2560 #ifdef _SC_SEM_NSEMS_MAX
2561 {
"SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX,
SYSCONF },
2563 #ifdef _SC_SEM_VALUE_MAX
2564 {
"SEM_VALUE_MAX", _SC_SEM_VALUE_MAX,
SYSCONF },
2566 #ifdef _SC_SIGQUEUE_MAX
2567 {
"SIGQUEUE_MAX", _SC_SIGQUEUE_MAX,
SYSCONF },
2569 #ifdef _PC_FILESIZEBITS
2570 {
"FILESIZEBITS", _PC_FILESIZEBITS,
PATHCONF },
2572 #ifdef _PC_ALLOC_SIZE_MIN
2573 {
"POSIX_ALLOC_SIZE_MIN", _PC_ALLOC_SIZE_MIN,
PATHCONF },
2575 #ifdef _PC_REC_INCR_XFER_SIZE
2576 {
"POSIX_REC_INCR_XFER_SIZE", _PC_REC_INCR_XFER_SIZE,
PATHCONF },
2578 #ifdef _PC_REC_MAX_XFER_SIZE
2579 {
"POSIX_REC_MAX_XFER_SIZE", _PC_REC_MAX_XFER_SIZE,
PATHCONF },
2581 #ifdef _PC_REC_MIN_XFER_SIZE
2582 {
"POSIX_REC_MIN_XFER_SIZE", _PC_REC_MIN_XFER_SIZE,
PATHCONF },
2584 #ifdef _PC_REC_XFER_ALIGN
2585 {
"POSIX_REC_XFER_ALIGN", _PC_REC_XFER_ALIGN,
PATHCONF },
2587 #ifdef _PC_SYMLINK_MAX
2588 {
"SYMLINK_MAX", _PC_SYMLINK_MAX,
PATHCONF },
2590 #ifdef _CS_GNU_LIBC_VERSION
2591 {
"GNU_LIBC_VERSION", _CS_GNU_LIBC_VERSION,
CONFSTR },
2593 #ifdef _CS_GNU_LIBPTHREAD_VERSION
2594 {
"GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION,
CONFSTR },
2596 #ifdef _PC_2_SYMLINKS
2597 {
"POSIX2_SYMLINKS", _PC_2_SYMLINKS,
PATHCONF },
2600 #ifdef _SC_LEVEL1_ICACHE_SIZE
2601 {
"LEVEL1_ICACHE_SIZE", _SC_LEVEL1_ICACHE_SIZE,
SYSCONF },
2603 #ifdef _SC_LEVEL1_ICACHE_ASSOC
2604 {
"LEVEL1_ICACHE_ASSOC", _SC_LEVEL1_ICACHE_ASSOC,
SYSCONF },
2606 #ifdef _SC_LEVEL1_ICACHE_LINESIZE
2607 {
"LEVEL1_ICACHE_LINESIZE", _SC_LEVEL1_ICACHE_LINESIZE,
SYSCONF },
2609 #ifdef _SC_LEVEL1_DCACHE_SIZE
2610 {
"LEVEL1_DCACHE_SIZE", _SC_LEVEL1_DCACHE_SIZE,
SYSCONF },
2612 #ifdef _SC_LEVEL1_DCACHE_ASSOC
2613 {
"LEVEL1_DCACHE_ASSOC", _SC_LEVEL1_DCACHE_ASSOC,
SYSCONF },
2615 #ifdef _SC_LEVEL1_DCACHE_LINESIZE
2616 {
"LEVEL1_DCACHE_LINESIZE", _SC_LEVEL1_DCACHE_LINESIZE,
SYSCONF },
2618 #ifdef _SC_LEVEL2_CACHE_SIZE
2619 {
"LEVEL2_CACHE_SIZE", _SC_LEVEL2_CACHE_SIZE,
SYSCONF },
2621 #ifdef _SC_LEVEL2_CACHE_ASSOC
2622 {
"LEVEL2_CACHE_ASSOC", _SC_LEVEL2_CACHE_ASSOC,
SYSCONF },
2624 #ifdef _SC_LEVEL2_CACHE_LINESIZE
2625 {
"LEVEL2_CACHE_LINESIZE", _SC_LEVEL2_CACHE_LINESIZE,
SYSCONF },
2627 #ifdef _SC_LEVEL3_CACHE_SIZE
2628 {
"LEVEL3_CACHE_SIZE", _SC_LEVEL3_CACHE_SIZE,
SYSCONF },
2630 #ifdef _SC_LEVEL3_CACHE_ASSOC
2631 {
"LEVEL3_CACHE_ASSOC", _SC_LEVEL3_CACHE_ASSOC,
SYSCONF },
2633 #ifdef _SC_LEVEL3_CACHE_LINESIZE
2634 {
"LEVEL3_CACHE_LINESIZE", _SC_LEVEL3_CACHE_LINESIZE,
SYSCONF },
2636 #ifdef _SC_LEVEL4_CACHE_SIZE
2637 {
"LEVEL4_CACHE_SIZE", _SC_LEVEL4_CACHE_SIZE,
SYSCONF },
2639 #ifdef _SC_LEVEL4_CACHE_ASSOC
2640 {
"LEVEL4_CACHE_ASSOC", _SC_LEVEL4_CACHE_ASSOC,
SYSCONF },
2644 {
"IPV6", _SC_IPV6,
SYSCONF },
2646 #ifdef _SC_RAW_SOCKETS
2647 {
"RAW_SOCKETS", _SC_RAW_SOCKETS,
SYSCONF },
2653 #define _GETCONF_PATH "/"
2662 const struct conf *c;
2665 const char * NS =
"getconf";
2672 if (_getconf_path == NULL) {
2673 _getconf_path =
rpmExpand(
"%{?_rpmds__getconf_path}", NULL);
2675 if (!(_getconf_path != NULL && *_getconf_path ==
'/')) {
2677 _getconf_path =
_free(_getconf_path);
2687 for (c = vars; c->
name != NULL; ++c) {
2695 sprintf(EVR,
"%ld", value);
2701 #if defined(_SC_UINT_MAX) && defined(_SC_ULONG_MAX)
2706 sprintf(EVR,
"%lu", value);
2712 sprintf(EVR,
"%ld", value);
2717 clen = confstr(c->
call_name, (
char *) NULL, 0);
2720 if (confstr (c->
call_name, EVR, clen) != clen) {
2721 fprintf(stderr,
"confstr: %s\n", strerror(
errno));
2731 for (t = EVR; *t; t++) {
2732 if (*t ==
'\n') *t =
' ';
2734 if (!strcmp(N,
"GNU_LIBC_VERSION")
2735 || !strcmp(N,
"GNU_LIBPTHREAD_VERSION"))
2737 for (t = EVR; *t; t++) {
2738 if (*t ==
' ') *t =
'-';
2742 if (*EVR ==
'\0' || strchr(EVR,
' ') != NULL
2743 || (EVR[0] ==
'-' && strchr(
"0123456789", EVR[1]) == NULL))
2762 if (_rpmds_debug < 0)
2812 memset(PRCO, 0,
sizeof(*PRCO));
2823 static int scareMem = 0;
2833 PRCO->Pdsp = &PRCO->P;
2834 PRCO->Rdsp = &PRCO->R;
2835 PRCO->Cdsp = &PRCO->C;
2836 PRCO->Odsp = &PRCO->O;
2837 PRCO->Tdsp = &PRCO->T;
2838 PRCO->Ddsp = &PRCO->D;
2839 PRCO->Ldsp = &PRCO->L;
2868 #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__)
2869 static char * sonameDep(
char * t,
const char * s,
int isElf64)
2873 #if !defined(__alpha__) && !defined(__sun)
2875 if (s[strlen(s)-1] !=
')')
2888 int (*add) (
void * context,
rpmds ds),
void * context)
2890 #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__)
2894 GElf_Ehdr ehdr_mem, * ehdr;
2895 GElf_Shdr shdr_mem, * shdr;
2896 GElf_Verdef def_mem, * def;
2897 GElf_Verneed need_mem, * need;
2898 GElf_Dyn dyn_mem, * dyn;
2899 unsigned int auxoffset;
2900 unsigned int offset;
2907 const char * soname = NULL;
2919 static int filter_GLIBC_PRIVATE = 0;
2920 static int oneshot = 0;
2923 if (_rpmds_debug < 0)
2924 fprintf(stderr,
"*** rpmdsELF(%s, %d, %p, %p)\n", fn, flags, (
void *)add, context);
2932 {
struct stat sb, * st = &sb;
2933 if (stat(fn, st) != 0)
2935 is_executable = (int)(st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH));
2938 fdno = open(fn, O_RDONLY);
2942 (void) elf_version(EV_CURRENT);
2946 if ((elf = elf_begin (fdno, ELF_C_READ, NULL)) == NULL
2947 || elf_kind(elf) != ELF_K_ELF
2948 || (ehdr = gelf_getehdr(elf, &ehdr_mem)) == NULL
2949 || !(ehdr->e_type == ET_DYN || ehdr->e_type == ET_EXEC))
2953 isElf64 = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
2954 isDSO = ehdr->e_type == ET_DYN;
2958 while ((scn = elf_nextscn(elf, scn)) != NULL) {
2959 shdr = gelf_getshdr(scn, &shdr_mem);
2963 soname =
_free(soname);
2964 switch (shdr->sh_type) {
2968 case SHT_GNU_verdef:
2971 while ((data = elf_getdata (scn, data)) != NULL) {
2973 for (cnt = (
int)shdr->sh_info; --cnt >= 0; ) {
2975 def = gelf_getverdef (data, offset, &def_mem);
2978 auxoffset = (unsigned)(offset + def->vd_aux);
2979 for (cnt2 = (
int)def->vd_cnt; --cnt2 >= 0; ) {
2980 GElf_Verdaux aux_mem, * aux;
2982 aux = gelf_getverdaux (data, auxoffset, &aux_mem);
2986 s = elf_strptr(elf, shdr->sh_link, aux->vda_name);
2990 if (def->vd_flags & VER_FLG_BASE) {
2991 soname =
_free(soname);
2995 && !(filter_GLIBC_PRIVATE != 0
2996 && !strcmp(s,
"GLIBC_PRIVATE")))
3006 sonameDep(t, buf, isElf64),
3007 "", RPMSENSE_FIND_PROVIDES);
3008 xx = add(context, ds);
3012 auxoffset += aux->vda_next;
3014 offset += def->vd_next;
3018 case SHT_GNU_verneed:
3021 if (!skipR && is_executable)
3022 while ((data = elf_getdata (scn, data)) != NULL) {
3024 for (cnt = (
int)shdr->sh_info; --cnt >= 0; ) {
3025 need = gelf_getverneed (data, offset, &need_mem);
3029 s = elf_strptr(elf, shdr->sh_link, need->vn_file);
3032 soname =
_free(soname);
3034 auxoffset = (unsigned)(offset + need->vn_aux);
3035 for (cnt2 = (
int)need->vn_cnt; --cnt2 >= 0; ) {
3036 GElf_Vernaux aux_mem, * aux;
3038 aux = gelf_getvernaux (data, auxoffset, &aux_mem);
3042 s = elf_strptr(elf, shdr->sh_link, aux->vna_name);
3048 && !(filter_GLIBC_PRIVATE != 0
3049 && !strcmp(s,
"GLIBC_PRIVATE")))
3059 sonameDep(t, buf, isElf64),
3060 "", RPMSENSE_FIND_REQUIRES);
3061 xx = add(context, ds);
3065 auxoffset += aux->vna_next;
3067 offset += need->vn_next;
3073 while ((data = elf_getdata (scn, data)) != NULL) {
3074 for (cnt = 0; cnt < (int)(shdr->sh_size / shdr->sh_entsize); ++cnt) {
3075 dyn = gelf_getdyn (data, cnt, &dyn_mem);
3079 switch (dyn->d_tag) {
3094 if (skipR || !is_executable)
3097 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
3101 sonameDep(buf, s, isElf64),
3102 "", RPMSENSE_FIND_REQUIRES);
3103 xx = add(context, ds);
3111 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
3116 sonameDep(buf, s, isElf64),
3117 "", RPMSENSE_FIND_PROVIDES);
3118 xx = add(context, ds);
3132 if (gotGNUHASH && !gotHASH) {
3134 RPMSENSE_FIND_REQUIRES);
3135 xx = add(context, ds);
3141 if (!skipP && isDSO && !gotDEBUG && !gotSONAME) {
3142 s = strrchr(fn,
'/');
3152 sonameDep(buf, s, isElf64),
"", RPMSENSE_FIND_PROVIDES);
3153 xx = add(context, ds);
3159 soname =
_free(soname);
3160 if (elf) (void) elf_end(elf);
3170 #define _SBIN_LDCONFIG_P "/sbin/ldconfig -p"
3174 #define _LD_SO_CACHE "/etc/ld.so.cache"
3184 const char *N, *EVR;
3198 if (_ldconfig_cmd == NULL) {
3199 _ldconfig_cmd =
rpmExpand(
"%{?_rpmds_ldconfig_cmd}", NULL);
3200 if (!(_ldconfig_cmd != NULL && *_ldconfig_cmd ==
'/')) {
3202 _ldconfig_cmd =
_free(_ldconfig_cmd);
3208 if (_ldconfig_cache == NULL) {
3209 _ldconfig_cache =
rpmExpand(
"%{?_rpmds_ldconfig_cache}", NULL);
3211 if (!(_ldconfig_cache != NULL && *_ldconfig_cache ==
'/')) {
3213 _ldconfig_cache =
_free(_ldconfig_cache);
3223 if (_rpmds_debug < 0)
3224 fprintf(stderr,
"*** rpmdsLdconfig(%p, %s) P %p R %p C %p O %p T %p D %p L %p\n", PRCO, fn, PRCO->Pdsp, PRCO->Rdsp, PRCO->Cdsp, PRCO->Odsp, PRCO->Tdsp, PRCO->Ddsp, PRCO->Ldsp);
3226 fp = popen(_ldconfig_cmd,
"r");
3230 while((f = fgets(buf, (
int)
sizeof(buf), fp)) != NULL) {
3243 while (*fe && !(fe[0] ==
'=' && fe[1] ==
'>'))
3258 if (fe > f && fe[-1] ==
' ') fe[-1] =
'\0';
3270 for (t = f; *t !=
'\0'; t++) {
3288 Flags |= RPMSENSE_PROBE;
3299 if (fp != NULL) (void) pclose(fp);
3305 #define _RLD_SEARCH_PATH "/lib:/usr/lib"
3307 static const char * _rld_search_path = NULL;
3310 int rpmdsRldpath(
rpmPRCO PRCO,
const char * rldp)
3315 const char *N, *EVR;
3329 if (_rld_search_path == NULL) {
3330 _rld_search_path =
rpmExpand(
"%{?_rpmds_rld_search_path}", NULL);
3332 if (!(_rld_search_path != NULL && *_rld_search_path ==
'/')) {
3334 _rld_search_path =
_free(_rld_search_path);
3336 _rld_search_path =
xstrdup(_RLD_SEARCH_PATH);
3342 rldp = _rld_search_path;
3344 if (_rpmds_debug > 0)
3345 fprintf(stderr,
"*** rpmdsRldpath(%p, %s) P %p R %p C %p O %p\n", PRCO, rldp, PRCO->Pdsp, PRCO->Rdsp, PRCO->Cdsp, PRCO->Odsp);
3358 strncpy(buf, f, g - f + 1);
3365 if ( !(strlen(buf) > 0 && buf[0] ==
'/') )
3370 strcat(buf,
"/*.so.*");
3372 if (_rpmds_debug > 0)
3373 fprintf(stderr,
"*** rpmdsRldpath(%p, %s) globbing %s\n", PRCO, rldp, buf);
3375 xx =
Glob(buf, 0, NULL, &gl);
3379 if (_rpmds_debug > 0)
3380 fprintf(stderr,
"*** rpmdsRldpath(%p, %s) glob matched %d files\n", PRCO, rldp, gl.
gl_pathc);
3393 N = DSOfn + strlen(DSOfn);
3394 while (N > DSOfn && *N !=
'/')
3397 Flags |= RPMSENSE_PROBE;
3414 #define _SOLARIS_CRLE "/usr/sbin/crle"
3416 static const char * _crle_cmd = NULL;
3418 int rpmdsCrle(
rpmPRCO PRCO,
const char * fn)
3434 if (_crle_cmd == NULL) {
3435 _crle_cmd =
rpmExpand(
"%{?_rpmds_crle_cmd}", NULL);
3436 if (!(_crle_cmd != NULL && *_crle_cmd ==
'/')) {
3438 _crle_cmd =
_free(_crle_cmd);
3440 _crle_cmd =
xstrdup(_SOLARIS_CRLE);
3445 fp = popen(_crle_cmd,
"r");
3454 while((f = fgets(buf,
sizeof(buf), fp)) != NULL) {
3458 g = strstr(f,
"(ELF):");
3463 f = g + (
sizeof(
"(ELF):")-1);
3476 rc = rpmdsRldpath(PRCO, f);
3485 static const char * NS =
"uname";
3486 struct utsname myun;
3499 if (un->sysname != NULL)
3501 if (un->nodename != NULL)
3503 if (un->release != NULL)
3506 if (un->version != NULL)
3509 if (un->machine != NULL)
3511 #if defined(__linux__)
3512 if (un->domainname != NULL && strcmp(un->domainname,
"(none)"))
3522 #define _PERL_PROVIDES "/usr/bin/find /usr/lib/perl5 | /usr/lib/rpm/perl.prov"
3531 const char *N, *EVR;
3537 const char * fn =
"pipe";
3544 if (_perldeps_cmd == NULL) {
3545 _perldeps_cmd =
rpmExpand(
"%{?_rpmds_perldeps_cmd}", NULL);
3547 if (!(_perldeps_cmd != NULL && *_perldeps_cmd ==
'/')) {
3549 _perldeps_cmd =
_free(_perldeps_cmd);
3561 fp = popen(cmd,
"r");
3567 while((f = fgets(buf, (
int)
sizeof(buf), fp)) != NULL) {
3571 buf[
sizeof(buf)-1] =
'\0';
3578 if (*f ==
'\0' || *f ==
'#')
3588 if (*f ==
'!') fe++;
3589 while (*fe && !
_isspace(*fe) && strchr(
"!<=>", *fe) == NULL)
3594 if (!(
xisalnum(f[0]) || strchr(
"/_%!", f[0]) != NULL)) {
3596 fprintf(stderr,
_(
"running \"%s\" pipe command\n"), cmd);
3597 fprintf(stderr,
_(
"%s:%d \"%s\" has invalid name. Skipping ...\n"),
3607 if (*f !=
'/' && *fe !=
'\0') {
3613 fprintf(stderr,
_(
"running \"%s\" pipe command\n"), cmd),
3614 fprintf(stderr,
_(
"%s:%d \"%s\" has no comparison operator. Skipping ...\n"),
3625 fprintf(stderr,
_(
"running \"%s\" pipe command\n"), cmd),
3627 fprintf(stderr,
_(
"\tline %d: No EVR comparison value found.\n Skipping ..."),
3629 fprintf(stderr,
_(
"%s:%d \"%s\" has no EVR string. Skipping ...\n"),
3646 Flags |= RPMSENSE_PROBE;
3655 if (fp != NULL) (void) pclose(fp);
3662 const char * AN = A->ns.N;
3663 const char * AA = A->ns.A;
3664 const char * BN = B->ns.N;
3665 const char * BA = B->ns.A;
3669 rc = strcmp(AN, BN);
3670 }
else if (AA && !BA) {
3671 rc = strncmp(AN, BN, (AA - AN)) || BN[AA - AN];
3673 rc = strcmp(AA, B->A);
3674 }
else if (!AA && BA) {
3675 rc = strncmp(AN, BN, (BA - BN)) || AN[BA - BN];
3677 rc = strcmp(BA, A->A);
3679 rc = strcmp(AN, BN);
3696 if (evr_tuple_order == NULL) {
3698 evr_tuple_order =
rpmExpand(
"%{?evr_tuple_order}", NULL);
3700 if (evr_tuple_order == NULL || evr_tuple_order[0] ==
'\0')
3701 evr_tuple_order =
xstrdup(
"EVR");
3703 assert(evr_tuple_order != NULL && evr_tuple_order[0] !=
'\0');
3711 const char *aDepend = (A->DNEVR != NULL ?
xstrdup(A->DNEVR+2) :
"");
3712 const char *bDepend = (B->DNEVR != NULL ?
xstrdup(B->DNEVR+2) :
"");
3713 EVR_t a = memset(
alloca(
sizeof(*a)), 0,
sizeof(*a));
3714 EVR_t b = memset(
alloca(
sizeof(*a)), 0,
sizeof(*a));
3717 int (*EVRcmp) (
const char *a,
const char *b);
3724 assert((
rpmdsFlags(B) & RPMSENSE_SENSEMASK) == B->ns.Flags);
3733 if (!(A->EVR && A->Flags && B->EVR && B->Flags))
3737 if (!(aFlags && bFlags))
3741 if (!(A->EVR[A->i] && *A->EVR[A->i] && B->EVR[B->i] && *B->EVR[B->i]))
3745 xx = (A->EVRparse ? A->EVRparse :
rpmEVRparse) (A->EVR[A->i], a);
3746 xx = (B->EVRparse ? B->EVRparse :
rpmEVRparse) (B->EVR[B->i], b);
3749 EVRcmp = (A->EVRcmp && B->EVRcmp && A->EVRcmp == B->EVRcmp)
3757 default:
continue;
break;
3760 if (a->F[ix] && *a->F[ix] && b->F[ix] && *b->F[ix])
3763 if (a->F[ix] && *a->F[ix] && atol(a->F[ix]) > 0) {
3764 if (!B->nopromote) {
3765 int lvl = (_rpmds_unspecified_epoch_noise
3767 rpmlog(lvl,
_(
"The \"B\" dependency needs an epoch (assuming same epoch as \"A\")\n\tA = \"%s\"\tB = \"%s\"\n"),
3773 if (b->F[ix] && *b->F[ix] && atol(b->F[ix]) > 0)
3776 case 'V': ix = RPMEVR_V;
break;
3777 case 'R': ix = RPMEVR_R;
break;
3778 case 'D': ix = RPMEVR_D;
break;
3780 if (a->F[ix] && *a->F[ix] && b->F[ix] && *b->F[ix])
3781 sense = EVRcmp(a->F[ix], b->F[ix]);
3786 a->str =
_free(a->str);
3787 b->str =
_free(b->str);
3791 result = (sense != 0);
3794 }
else if (sense > 0 && ((aFlags & RPMSENSE_LESS) || (bFlags & RPMSENSE_GREATER))) {
3796 }
else if (sense == 0 &&
3798 ((aFlags & RPMSENSE_LESS) && (bFlags & RPMSENSE_LESS)) ||
3799 ((aFlags & RPMSENSE_GREATER) && (bFlags & RPMSENSE_GREATER)))) {
3806 if (_noisy_range_comparison_debug_message)
3808 (result ?
_(
"YES") :
_(
"NO ")), aDepend, bDepend);
3809 aDepend =
_free(aDepend);
3810 bDepend =
_free(bDepend);
3827 const fnpyKey * suggestedKeys,
int adding)
3829 const char * Name =
rpmdsN(ds);
3835 if (ps == NULL)
return;
3837 if (Name == NULL) Name =
"?N?";
3838 if (EVR == NULL) EVR =
"?EVR?";
3839 if (DNEVR == NULL) DNEVR =
"? ?N? ?OP? ?EVR?";
3842 pkgNEVR, ds->Type, DNEVR+2);
3844 switch ((
unsigned)DNEVR[0]) {
3850 key = (suggestedKeys ? suggestedKeys[0] : NULL);
3851 rpmpsAppend(ps, type, pkgNEVR, key, NULL, NULL, DNEVR, adding);
3857 rpmds provides = NULL;
3863 if (req->EVR == NULL || req->Flags == NULL)
3866 switch(req->ns.Type) {
3869 if (!reqFlags || !req->EVR[req->i] || *req->EVR[req->i] ==
'\0')
3878 if (provides == NULL) {
3890 if (provides->EVR == NULL)
3895 if (provides != NULL)
3909 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
3910 const char * pkgN, * V, * R;
3911 #ifdef RPM_VENDOR_MANDRIVA
3917 const char * pkgEVR;
3927 if (req->EVR == NULL || req->Flags == NULL)
3930 if (!(reqFlags && req->EVR[req->i] && *req->EVR[req->i]))
3942 #if defined(NOTYET) || defined(RPM_VENDOR_MANDRIVA)
3945 D = (he->
p.
str ? he->
p.
str : NULL);
3949 if (V) nb += strlen(V);
3950 if (R) nb += strlen(R);
3951 #ifdef RPM_VENDOR_MANDRIVA
3952 if (gotD) nb += strlen(D) + 1;
3957 sprintf(t,
"%d:", E);
3961 #ifdef RPM_VENDOR_MANDRIVA
3985 if (ds->ns.str[0] ==
'!')