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 96 #define _RPMDS_INTERNAL 97 #define _RPMEVR_INTERNAL 98 #define _RPMPRCO_INTERNAL 113 #define _isspace(_c) \ 114 ((_c) == ' ' || (_c) == '\t' || (_c) == '\r' || (_c) == '\n') 146 default: Type =
tagName(tagN);
break;
157 case 0: Type =
"Unknown";
break;
172 ds->N =
_free(ds->N);
173 ds->EVR =
_free(ds->EVR);
174 ds->Flags =
_free(ds->Flags);
179 ds->DNEVR =
_free(ds->DNEVR);
180 ds->ns.str =
_free(ds->ns.str);
181 memset(&ds->ns, 0,
sizeof(ds->ns));
182 ds->A =
_free(ds->A);
183 ds->Color =
_free(ds->Color);
184 ds->Refs =
_free(ds->Refs);
185 ds->Result =
_free(ds->Result);
199 if (_rpmdsPool == NULL) {
200 _rpmdsPool =
rpmioNewPool(
"ds",
sizeof(*ds), -1, _rpmds_debug,
205 memset(((
char *)ds)+
sizeof(ds->_item), 0,
sizeof(*ds)-
sizeof(ds->_item));
220 for (ac = 0; ac < argc; ac++) {
221 assert(argv[ac] != NULL);
222 nb += strlen(argv[ac]) + 1;
224 nb += (ac + 1) *
sizeof(*av);
226 av = (
const char **)
xmalloc(nb);
227 t = (
char *) (av + ac + 1);
228 for (ac = 0; ac < argc; ac++) {
230 t =
stpcpy(t, argv[ac]) + 1;
240 int scareMem = (flags & 0x1);
245 const char * Type = NULL;
250 assert(scareMem == 0);
290 delslash = (flags & 0x2) ? 0 : 1;
309 if (xx && N != NULL && Count > 0) {
323 ds->EVR = he->
p.
argv;
348 for (i = 0; i < Count; i++) {
349 (void)
urlPath(N[i], (
const char **)&dn);
355 if (len > 1 && dn[len-1] ==
'/')
360 const char ** av = (
const char **)
xcalloc(Count+1,
sizeof(*av));
364 for (i = 0; i < Count; i++) {
365 (void)
urlPath(ds->EVR[ds->Flags[i]], (
const char **)&dn);
371 N = ds->N =
_free(ds->N);
375 ds->EVR =
_free(ds->EVR);
376 ds->Flags =
_free(ds->Flags);
380 const char ** av = (
const char **)
xcalloc(Count+1,
sizeof(*av));
383 for (i = 0; i < Count; i++) {
384 if (N[i] == NULL || *N[i] ==
'\0')
386 else if (*N[i] ==
'/')
388 else if (ds->EVR != NULL && ds->Flags != NULL)
389 av[i] =
rpmGenPath(NULL, ds->EVR[ds->Flags[i]], N[i]);
396 N = ds->N =
_free(ds->N);
400 ds->EVR =
_free(ds->EVR);
401 ds->Flags =
_free(ds->Flags);
405 if (_rpmds_debug < 0)
406 fprintf(stderr,
"*** ds %p\t%s[%d]\n", ds, ds->Type, ds->Count);
414 ds =
rpmdsLink(ds, (ds ? ds->Type : NULL));
424 const char * Name = ds->N[ds->i];
437 const char * NS = ds->ns.NS;
438 const char * A = ds->ns.A;
443 if (dspfx) nb += strlen(dspfx) + 1;
444 if (ds->ns.str[0] ==
'!') nb++;
445 if (NS) nb += strlen(NS) +
sizeof(
"()") - 1;
446 if (N) nb += strlen(N);
453 if (ds->Flags != NULL
466 ds->ns.Flags = dsFlags;
469 if (ds->EVR != NULL && ds->EVR[ds->i] && *ds->EVR[ds->i]) {
471 nb += strlen(ds->EVR[ds->i]);
474 t = tbuf = (
char *)
xmalloc(nb + 1);
479 if (ds->ns.str[0] ==
'!')
495 if (t != tbuf) *t++ =
' ';
505 if (ds->EVR != NULL && ds->EVR[ds->i] && *ds->EVR[ds->i]) {
506 if (t != tbuf) *t++ =
' ';
507 t =
stpcpy(t, ds->EVR[ds->i]);
518 const char * Name, * V, * R;
519 #ifdef RPM_VENDOR_MANDRIVA 520 const char * D = NULL;
523 const char ** N, ** EVR;
538 #if defined(RPM_VENDOR_MANDRIVA) 547 if (Name == NULL) Name =
xstrdup(
"N");
548 if (V == NULL) V =
xstrdup(
"V");
549 if (R == NULL) R =
xstrdup(
"R");
551 t = (
char *)
xmalloc(
sizeof(*N) + strlen(Name) + 1);
552 N = (
const char **) t;
559 nb =
sizeof(*EVR) + 20 + strlen(V) + strlen(R) +
sizeof(
"-");
560 #if defined(RPM_VENDOR_MANDRIVA) 561 nb += (D ? strlen(D) +
sizeof(
":") : 0);
564 EVR = (
const char **) t;
568 sprintf(t,
"%d:", E);
571 #if defined(RPM_VENDOR_MANDRIVA) 586 ds->Flags = (
evrFlags *)
xmalloc(
sizeof(*ds->Flags)); ds->Flags[0] = Flags;
598 pre[0] = ds->Type[0];
606 return rpmdsLink(ds, (ds ? ds->Type : NULL));
617 { time_t now = time(NULL);
622 ds->N = (
const char **)
xcalloc(2,
sizeof(*ds->N)); ds->N[0] = N;
623 ds->EVR = (
const char **)
xcalloc(2,
sizeof(*ds->EVR)); ds->EVR[0] = EVR;
625 ds->Flags = (
evrFlags *)
xmalloc(
sizeof(*ds->Flags)); ds->Flags[0] = Flags;
633 return rpmdsLink(ds, (ds ? ds->Type : NULL));
638 return (ds != NULL ? ds->Count : 0);
643 return (ds != NULL ? ds->i : -1);
659 const char * DNEVR = NULL;
661 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
662 if (ds->DNEVR != NULL)
670 const char * N = NULL;
672 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
674 N = (ds->ns.N ? ds->ns.N :
rpmdsNewN(ds));
682 const char * EVR = NULL;
684 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
686 EVR = ds->EVR[ds->i];
695 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
696 if (ds->Flags != NULL)
697 Flags = ds->Flags[ds->i];
713 const char * A = NULL;
723 if (ds != NULL && ds->BT > 0)
732 oBT = (time_t)ds->BT;
742 NSType = ds->ns.Type;
751 nopromote = ds->nopromote;
760 onopromote = ds->nopromote;
761 ds->nopromote = nopromote;
767 int (*EVRparse)(
const char *evrstr,
EVR_t evr))
769 void * oEVRparse = NULL;
772 oEVRparse = (
void *) ds->EVRparse;
773 ds->EVRparse = EVRparse;
780 void * oEVRcmp = NULL;
783 oEVRcmp = (
void *) ds->EVRcmp;
793 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
794 if (ds->Color != NULL)
795 Color = ds->Color[ds->i];
807 if (ds->Color == NULL && ds->Count > 0)
810 if (ds->i >= 0 && ds->i < (
int)ds->Count) {
811 if (ds->Color != NULL) {
812 ocolor = ds->Color[ds->i];
813 ds->Color[ds->i] = color;
821 return (ds != NULL ? ds->exclude : NULL);
826 return (ds != NULL ? ds->nexclude : 0);
831 return (ds != NULL ? ds->include : NULL);
836 return (ds != NULL ? ds->ninclude : 0);
843 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
844 if (ds->Refs != NULL)
845 Refs = ds->Refs[ds->i];
857 if (ds->Refs == NULL && ds->Count > 0)
860 if (ds->i >= 0 && ds->i < (
int)ds->Count) {
861 if (ds->Refs != NULL) {
862 orefs = ds->Refs[ds->i];
863 ds->Refs[ds->i] = refs;
873 if (ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count) {
874 if (ds->Result != NULL)
875 result = ds->Result[ds->i];
887 if (ds->Result == NULL && ds->Count > 0)
890 if (ds->i >= 0 && ds->i < (
int)ds->Count) {
891 if (ds->Result != NULL) {
892 oresult = ds->Result[ds->i];
893 ds->Result[ds->i] = result;
901 if (!(ds != NULL && ds->i >= 0 && ds->i < (
int)ds->Count))
903 if (ds->DNEVR == NULL)
907 (!strcmp(ds->DNEVR,
"cached") ? ds->DNEVR : ds->DNEVR+2),
908 (rc ?
_(
"NO ") :
_(
"YES")),
909 (where != NULL ? where :
""));
917 if (ds != NULL && ++ds->i >= 0) {
918 if (ds->i < (
int)ds->Count) {
921 ds->DNEVR =
_free(ds->DNEVR);
922 ds->ns.str =
_free(ds->ns.str);
923 memset(&ds->ns, 0,
sizeof(ds->ns));
924 t[0] = ((ds->Type != NULL) ? ds->Type[0] :
'\0');
934 if (_rpmds_debug < 0 && i != -1 && ds->DNEVR[2] !=
'\0')
935 fprintf(stderr,
"*** ds %p\t%s[%d]: %s\n", ds, (ds->Type ? ds->Type :
"?Type?"), i, (ds->DNEVR ? ds->DNEVR :
"?DNEVR?"));
961 ds->h = (ods->h != NULL ?
headerLink(ods->h) : NULL);
962 ds->Type = ods->Type;
964 ds->tagN = ods->tagN;
965 ds->Count = ods->Count;
970 nb = (ds->Count+1) *
sizeof(*ds->N);
971 ds->N = (
const char **) (ds->h != NULL
972 ? memcpy(
xmalloc(nb), ods->N, nb)
979 assert(ods->EVR != NULL);
980 assert(ods->Flags != NULL);
981 nb = (ds->Count+1) *
sizeof(*ds->EVR);
982 ds->EVR = (ds->h != NULL
983 ? memcpy(
xmalloc(nb), ods->EVR, nb)
986 nb = (ds->Count *
sizeof(*ds->Flags));
987 ds->Flags = (ds->h != NULL
989 : memcpy(
xmalloc(nb), ods->Flags, nb) );
990 ds->nopromote = ods->nopromote;
992 ds->EVRcmp = ods->EVRcmp;
997 return rpmdsLink(ds, (ds ? ds->Type : NULL));
1005 if (ds == NULL || ods == NULL)
1010 while (ds->l < ds->u) {
1011 ds->i = (ds->l + ds->u) / 2;
1013 comparison = strcmp(ods->N[ods->i], ds->N[ds->i]);
1017 if (comparison == 0 && ods->EVR && ds->EVR)
1018 comparison = strcmp(ods->EVR[ods->i], ds->EVR[ds->i]);
1019 if (comparison == 0 && ods->Flags && ds->Flags)
1020 comparison = (ods->Flags[ods->i] - ds->Flags[ds->i]);
1025 else if (comparison > 0)
1042 if (dsp == NULL || ods == NULL)
1072 for (j = ds->Count; j > (
int)ds->u; j--)
1073 ds->N[j] = ds->N[j-1];
1074 ds->N[ds->u] = ods->N[ods->i];
1076 ds->N =
_free(ds->N);
1084 assert(ods->EVR != NULL);
1085 assert(ods->Flags != NULL);
1087 for (j = ds->Count; j > (
int)ds->u; j--)
1088 ds->EVR[j] = ds->EVR[j-1];
1089 ds->EVR[ds->u] = ods->EVR[ods->i];
1091 ds->EVR =
_free(ds->EVR);
1094 Flags =
xmalloc((ds->Count+1) *
sizeof(*Flags));
1096 memcpy(Flags, ds->Flags, ds->u *
sizeof(*Flags));
1097 if (ds->u < ds->Count)
1098 memcpy(Flags + ds->u + 1, ds->Flags + ds->u, (ds->Count - ds->u) *
sizeof(*Flags));
1099 Flags[ds->u] = ods->Flags[ods->i];
1100 ds->Flags =
_free(ds->Flags);
1120 if (ds == NULL || ods == NULL)
1130 comparison = strcmp(ods->N[ods->i], ds->N[i]);
1134 else if (comparison > 0)
1138 if (strcmp(ods->N[ods->i], ds->N[l]))
1140 while (l > 0 && !strcmp(ods->N[ods->i], ds->N[l-1]))
1143 if (u >= (
int)ds->Count || strcmp(ods->N[ods->i], ds->N[u]))
1145 while (++u < (
int)ds->Count) {
1146 if (strcmp(ods->N[ods->i], ds->N[u]))
1157 while ((l =
rpmdsNext(ds)) >= 0 && (l < u)) {
1169 if (ods->Result != NULL)
1184 const char *N,
const char *EVR,
evrFlags Flags)
1191 t = (
char *)
alloca(strlen(NS)+
sizeof(
"()")+strlen(N));
1201 #if defined(WITH_CPUINFO) 1204 const char * NS =
"cpuinfo";
1205 struct cpuinfo *cip = cpuinfo_new();
1206 cpuinfo_feature_t feature;
1210 unsigned char uc[4];
1212 static union _dbswap orderedbytes = { .
ui = 0x11223344 };
1213 const char *
endian = NULL;
1215 snprintf(tmp, 19,
"%d", cpuinfo_get_frequency(cip));
1218 snprintf(tmp, 19,
"%d", cpuinfo_get_cores(cip));
1220 snprintf(tmp, 19,
"%d", cpuinfo_get_threads(cip));
1223 if(orderedbytes.
uc[0] == 0x44)
1225 else if(orderedbytes.
uc[0] == 0x11)
1227 else if(orderedbytes.
uc[0] == 0x22)
1231 for (feature = cpuinfo_feature_common; feature != cpuinfo_feature_architecture_max; feature++) {
1232 if(feature == cpuinfo_feature_common_max)
1233 feature = cpuinfo_feature_architecture;
1234 if (cpuinfo_has_feature(cip, feature)) {
1235 const char *
name = cpuinfo_string_of_feature(feature);
1237 rpmdsNSAdd(dsp, NS, name,
"", RPMSENSE_PROBE);
1240 cpuinfo_destroy(cip);
1256 {
"processor", 0, 0 },
1257 {
"Processor", 0, 1 },
1258 {
"vendor_id", 0, 0 },
1259 {
"cpu_family", 0, 1 },
1261 {
"model_name", 0, 0 },
1262 {
"stepping", 0, 1 },
1263 {
"cpu_MHz", 0, 1 },
1264 {
"CPU_implementer",0, 1 },
1265 {
"CPU_architecture",0, 1 },
1266 {
"CPU_variant", 0, 1 },
1267 {
"CPU_part", 0, 1 },
1268 {
"CPU_revision", 0, 1 },
1269 {
"Hardware", 0, 2 },
1270 {
"Revision", 0, 1 },
1272 {
"cache_size", 0, 1 },
1273 {
"physical_id", 0, 0 },
1274 {
"siblings", 0, 0 },
1275 {
"core_id", 0, 0 },
1276 {
"cpu_cores", 0, 0 },
1277 {
"fdiv_bug", 0, 3 },
1278 {
"hlt_bug", 0, 3 },
1279 {
"f00f_bug", 0, 3 },
1280 {
"coma_bug", 0, 3 },
1282 {
"fpu_exception", 0, 3 },
1283 {
"cpuid_level", 0, 0 },
1286 {
"Features", 0, 4 },
1287 {
"bogomips", 0, 1 },
1288 {
"BogoMIPS", 0, 1 },
1289 {
"clflush_size", 0, 1 },
1305 for (ct = ctags; ct->
name != NULL; ct++) {
1306 if (strcmp(ct->
name, name))
1317 #define _PROC_CPUINFO "/proc/cpuinfo" 1328 const char * NS =
"cpuinfo";
1330 char * f, * fe, * fend;
1337 if (_cpuinfo_path == NULL) {
1338 _cpuinfo_path =
rpmExpand(
"%{?_rpmds_cpuinfo_path}", NULL);
1340 if (!(_cpuinfo_path != NULL && *_cpuinfo_path ==
'/')) {
1342 _cpuinfo_path =
_free(_cpuinfo_path);
1353 for (ct = ctags; ct->
name != NULL; ct++)
1357 if (!(xx == 0 && iob != NULL))
1360 for (f = (
char *)iob->b; *f !=
'\0'; f = fend) {
1363 while (*fe !=
'\0' && !(*fe ==
'\n' || *fe ==
'\r'))
1366 while (*fe !=
'\0' && (*fe ==
'\n' || *fe ==
'\r'))
1380 while (*fe && *fe !=
':')
1399 for (t = f; *t !=
'\0'; t++) {
1411 for (t = g; *t !=
'\0'; t++) {
1412 if (
_isspace(*t) || *t ==
'(' || *t ==
')')
1418 for (t = g; *t !=
'\0'; t++) {
1419 if (
_isspace(*t) || *t ==
'(' || *t ==
')')
1425 if (!strcmp(g,
"yes"))
1429 {
char ** av = NULL;
1431 rc = poptParseArgvString(g, NULL, (
const char ***)&av);
1432 if (!rc && av != NULL)
1433 while ((t = av[i++]) != NULL)
1460 {
"rpmlib(VersionedDependencies)",
"3.0.3-1",
1462 N_(
"PreReq:, Provides:, and Obsoletes: dependencies support versions.") },
1463 {
"rpmlib(CompressedFileNames)",
"3.0.4-1",
1465 N_(
"file name(s) stored as (dirName,baseName,dirIndex) tuple, not as path.")},
1466 #if defined(WITH_BZIP2) 1467 {
"rpmlib(PayloadIsBzip2)",
"3.0.5-1",
1469 N_(
"package payload can be compressed using bzip2.") },
1471 {
"rpmlib(PayloadFilesHavePrefix)",
"4.0-1",
1473 N_(
"package payload file(s) have \"./\" prefix.") },
1474 {
"rpmlib(ExplicitPackageProvide)",
"4.0-1",
1476 N_(
"package name-version-release is not implicitly provided.") },
1477 {
"rpmlib(HeaderLoadSortsTags)",
"4.0.1-1",
1479 N_(
"header tags are always sorted after being loaded.") },
1480 {
"rpmlib(ScriptletInterpreterArgs)",
"4.0.3-1",
1482 N_(
"the scriptlet interpreter can use arguments from header.") },
1483 {
"rpmlib(PartialHardlinkSets)",
"4.0.4-1",
1485 N_(
"a hardlink file set may be installed without being complete.") },
1486 {
"rpmlib(ConcurrentAccess)",
"4.1-1",
1488 N_(
"package scriptlets may access the rpm database while installing.") },
1489 #if defined(WITH_LUA) 1490 {
"rpmlib(BuiltinLuaScripts)",
"4.2.2-1",
1492 N_(
"internal embedded lua scripts.") },
1494 #if defined(WITH_AUGEAS) 1495 {
"rpmlib(BuiltinAugeasScripts)",
"5.3-1",
1497 N_(
"internal embedded Augeas.") },
1499 #if defined(WITH_FICL) 1500 {
"rpmlib(BuiltinFiclScripts)",
"5.2-1",
1502 N_(
"internal embedded FICL.") },
1504 #if defined(WITH_GPSEE) 1505 {
"rpmlib(BuiltinJavaScript)",
"5.2-1",
1507 N_(
"internal embedded JavaScript.") },
1509 #if defined(WITH_PERLEMBED) 1510 {
"rpmlib(BuiltinPerlScripts)",
"5.2-1",
1512 N_(
"internal embedded perl scripts.") },
1514 #if defined(WITH_PYTHONEMBED) 1515 {
"rpmlib(BuiltinPythonScripts)",
"5.2-1",
1517 N_(
"internal embedded python scripts.") },
1519 #if defined(WITH_RUBYEMBED) 1520 {
"rpmlib(BuiltinRubyScripts)",
"5.2-1",
1522 N_(
"internal embedded ruby scripts.") },
1524 #if defined(WITH_SEMANAGE) 1525 {
"rpmlib(BuiltinSpookScripts)",
"5.3-1",
1527 N_(
"internal embedded Spook scripts.") },
1529 #if defined(WITH_SQLITE) 1530 {
"rpmlib(BuiltinSqlScripts)",
"5.3-1",
1532 N_(
"internal embedded sqlite3 scripts.") },
1534 #if defined(WITH_SQUIRREL) 1535 {
"rpmlib(BuiltinSquirrelScripts)",
"5.2-1",
1537 N_(
"internal embedded squirrel scripts.") },
1539 #if defined(WITH_TCL) 1540 {
"rpmlib(BuiltinTclScripts)",
"5.2-1",
1542 N_(
"internal embedded tcl scripts.") },
1544 {
"rpmlib(HeaderTagTypeInt64)",
"4.4.3-1",
1546 N_(
"header tag data can be of type uint64_t.") },
1547 {
"rpmlib(PayloadIsUstar)",
"4.4.4-1",
1549 N_(
"package payload can be in ustar tar archive format.") },
1550 #if defined(WITH_XZ) 1551 {
"rpmlib(PayloadIsLzma)",
"4.4.2-1",
1553 N_(
"package payload can be compressed using lzma.") },
1555 {
"rpmlib(FileDigestParameterized)",
"4.4.6-1",
1557 N_(
"file digests can be other than MD5.") },
1558 {
"rpmlib(FileDigests)",
"4.6.0-1",
1560 N_(
"file digests can be other than MD5.") },
1561 #if defined(SUPPORT_AR_PAYLOADS) 1562 {
"rpmlib(PayloadIsAr)",
"5.1-1",
1564 N_(
"package payload can be in ar archive format.") },
1566 #if defined(WITH_XZ) 1567 {
"rpmlib(PayloadIsXz)",
"5.2-1",
1569 N_(
"package payload can be compressed using xz.") },
1572 {
"rpmlib(SetVersions)",
"4.0.4-alt98",
1574 N_(
"dependencies support set/subset versions.") },
1575 #if defined(RPM_VENDOR_MANDRIVA) 1576 {
"rpmlib(DistEpoch)",
"5.4.7-1",
1578 N_(
"package has distepoch.") },
1598 for (rlp = rltblp; rlp->
featureName != NULL; rlp++) {
1620 const char *N, *EVR;
1636 fd =
Fopen(fn,
"r.fpio");
1637 if (fd == NULL ||
Ferror(fd))
1643 while((f = fgets(buf, (
int)
sizeof(buf), fp)) != NULL) {
1647 buf[
sizeof(buf)-1] =
'\0';
1654 if (f[0] ==
'-' &&
_isspace(f[1])) {
1655 f +=
sizeof(
"- ")-1;
1661 if (*f ==
'\0' || *f ==
'#')
1669 if (!(
xisalnum(f[0]) || strchr(
"/_%!", f[0]) != NULL)) {
1670 fprintf(stderr,
_(
"%s:%d \"%s\" has invalid name. Skipping ...\n"),
1677 if (*f ==
'!') fe++;
1678 while (*fe && !
_isspace(*fe) && strchr(
"!<=>", *fe) == NULL)
1688 if (*f !=
'/' && *fe !=
'\0') {
1693 fprintf(stderr,
_(
"%s:%d \"%s\" has no comparison operator. Skipping ...\n"),
1704 fprintf(stderr,
_(
"%s:%d \"%s\" has no EVR string. Skipping ...\n"),
1721 Flags = (
evrFlags) (Flags | RPMSENSE_PROBE);
1732 if (fd != NULL) (void)
Fclose(fd);
1736 #if defined(RPM_VENDOR_WINDRIVER) 1737 #define _ETC_RPM_SYSINFO "%{_etcrpm}/sysinfo" 1739 #define _ETC_RPM_SYSINFO SYSCONFIGDIR "/sysinfo" 1762 struct stat * st = (
struct stat *) memset(
alloca(
sizeof(*st)), 0,
sizeof(*st));
1767 if (_sysinfo_path == NULL) {
1768 _sysinfo_path =
rpmExpand(
"%{?_rpmds_sysinfo_path}", NULL);
1770 if (!(_sysinfo_path != NULL && *_sysinfo_path ==
'/')) {
1772 _sysinfo_path =
_free(_sysinfo_path);
1789 if (S_ISDIR(st->st_mode)) {
1790 const char *dn = fn;
1794 for (av = _sysinfo_tags; av && *av; av++) {
1799 st = (
struct stat *) memset(st, 0,
sizeof(*st));
1801 if (xx == 0 && S_ISREG(st->st_mode))
1809 if (S_ISREG(st->st_mode))
1827 {
"LINK_MAX", _PC_LINK_MAX,
PATHCONF },
1830 {
"_POSIX_LINK_MAX", _PC_LINK_MAX, PATHCONF },
1832 #ifdef _PC_MAX_CANON 1833 {
"MAX_CANON", _PC_MAX_CANON, PATHCONF },
1835 #ifdef _PC_MAX_CANON 1836 {
"_POSIX_MAX_CANON", _PC_MAX_CANON, PATHCONF },
1838 #ifdef _PC_MAX_INPUT 1839 {
"MAX_INPUT", _PC_MAX_INPUT, PATHCONF },
1841 #ifdef _PC_MAX_INPUT 1842 {
"_POSIX_MAX_INPUT", _PC_MAX_INPUT, PATHCONF },
1845 {
"NAME_MAX", _PC_NAME_MAX, PATHCONF },
1848 {
"_POSIX_NAME_MAX", _PC_NAME_MAX, PATHCONF },
1851 {
"PATH_MAX", _PC_PATH_MAX, PATHCONF },
1854 {
"_POSIX_PATH_MAX", _PC_PATH_MAX, PATHCONF },
1857 {
"PIPE_BUF", _PC_PIPE_BUF, PATHCONF },
1860 {
"_POSIX_PIPE_BUF", _PC_PIPE_BUF, PATHCONF },
1862 #ifdef _PC_SOCK_MAXBUF 1863 {
"SOCK_MAXBUF", _PC_SOCK_MAXBUF, PATHCONF },
1866 {
"_POSIX_ASYNC_IO", _PC_ASYNC_IO, PATHCONF },
1868 #ifdef _PC_CHOWN_RESTRICTED 1869 {
"_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED, PATHCONF },
1872 {
"_POSIX_NO_TRUNC", _PC_NO_TRUNC, PATHCONF },
1875 {
"_POSIX_PRIO_IO", _PC_PRIO_IO, PATHCONF },
1878 {
"_POSIX_SYNC_IO", _PC_SYNC_IO, PATHCONF },
1881 {
"_POSIX_VDISABLE", _PC_VDISABLE, PATHCONF },
1885 {
"ARG_MAX", _SC_ARG_MAX,
SYSCONF },
1887 #ifdef _SC_ATEXIT_MAX 1888 {
"ATEXIT_MAX", _SC_ATEXIT_MAX, SYSCONF },
1891 {
"CHAR_BIT", _SC_CHAR_BIT, SYSCONF },
1894 {
"CHAR_MAX", _SC_CHAR_MAX, SYSCONF },
1897 {
"CHAR_MIN", _SC_CHAR_MIN, SYSCONF },
1899 #ifdef _SC_CHILD_MAX 1900 {
"CHILD_MAX", _SC_CHILD_MAX, SYSCONF },
1903 {
"CLK_TCK", _SC_CLK_TCK, SYSCONF },
1906 {
"INT_MAX", _SC_INT_MAX, SYSCONF },
1909 {
"INT_MIN", _SC_INT_MIN, SYSCONF },
1911 #ifdef _SC_UIO_MAXIOV 1912 {
"IOV_MAX", _SC_UIO_MAXIOV, SYSCONF },
1914 #ifdef _SC_LOGIN_NAME_MAX 1915 {
"LOGNAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF },
1918 {
"LONG_BIT", _SC_LONG_BIT, SYSCONF },
1920 #ifdef _SC_MB_LEN_MAX 1921 {
"MB_LEN_MAX", _SC_MB_LEN_MAX, SYSCONF },
1923 #ifdef _SC_NGROUPS_MAX 1924 {
"NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF },
1926 #ifdef _SC_NL_ARGMAX 1927 {
"NL_ARGMAX", _SC_NL_ARGMAX, SYSCONF },
1929 #ifdef _SC_NL_LANGMAX 1930 {
"NL_LANGMAX", _SC_NL_LANGMAX, SYSCONF },
1932 #ifdef _SC_NL_MSGMAX 1933 {
"NL_MSGMAX", _SC_NL_MSGMAX, SYSCONF },
1936 {
"NL_NMAX", _SC_NL_NMAX, SYSCONF },
1938 #ifdef _SC_NL_SETMAX 1939 {
"NL_SETMAX", _SC_NL_SETMAX, SYSCONF },
1941 #ifdef _SC_NL_TEXTMAX 1942 {
"NL_TEXTMAX", _SC_NL_TEXTMAX, SYSCONF },
1944 #ifdef _SC_GETGR_R_SIZE_MAX 1945 {
"NSS_BUFLEN_GROUP", _SC_GETGR_R_SIZE_MAX, SYSCONF },
1947 #ifdef _SC_GETPW_R_SIZE_MAX 1948 {
"NSS_BUFLEN_PASSWD", _SC_GETPW_R_SIZE_MAX, SYSCONF },
1951 {
"NZERO", _SC_NZERO, SYSCONF },
1954 {
"OPEN_MAX", _SC_OPEN_MAX, SYSCONF },
1957 {
"PAGESIZE", _SC_PAGESIZE, SYSCONF },
1960 {
"PAGE_SIZE", _SC_PAGESIZE, SYSCONF },
1963 {
"PASS_MAX", _SC_PASS_MAX, SYSCONF },
1965 #ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS 1966 {
"PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS, SYSCONF },
1968 #ifdef _SC_THREAD_KEYS_MAX 1969 {
"PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX, SYSCONF },
1971 #ifdef _SC_THREAD_STACK_MIN 1972 {
"PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN, SYSCONF },
1974 #ifdef _SC_THREAD_THREADS_MAX 1975 {
"PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX, SYSCONF },
1977 #ifdef _SC_SCHAR_MAX 1978 {
"SCHAR_MAX", _SC_SCHAR_MAX, SYSCONF },
1980 #ifdef _SC_SCHAR_MIN 1981 {
"SCHAR_MIN", _SC_SCHAR_MIN, SYSCONF },
1984 {
"SHRT_MAX", _SC_SHRT_MAX, SYSCONF },
1987 {
"SHRT_MIN", _SC_SHRT_MIN, SYSCONF },
1989 #ifdef _SC_SSIZE_MAX 1990 {
"SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF },
1992 #ifdef _SC_TTY_NAME_MAX 1993 {
"TTY_NAME_MAX", _SC_TTY_NAME_MAX, SYSCONF },
1995 #ifdef _SC_TZNAME_MAX 1996 {
"TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF },
1998 #ifdef _SC_UCHAR_MAX 1999 {
"UCHAR_MAX", _SC_UCHAR_MAX, SYSCONF },
2002 {
"UINT_MAX", _SC_UINT_MAX, SYSCONF },
2004 #ifdef _SC_UIO_MAXIOV 2005 {
"UIO_MAXIOV", _SC_UIO_MAXIOV, SYSCONF },
2007 #ifdef _SC_ULONG_MAX 2008 {
"ULONG_MAX", _SC_ULONG_MAX, SYSCONF },
2010 #ifdef _SC_USHRT_MAX 2011 {
"USHRT_MAX", _SC_USHRT_MAX, SYSCONF },
2014 {
"WORD_BIT", _SC_WORD_BIT, SYSCONF },
2016 #ifdef _SC_AVPHYS_PAGES 2017 {
"_AVPHYS_PAGES", _SC_AVPHYS_PAGES, SYSCONF },
2019 #ifdef _SC_NPROCESSORS_CONF 2020 {
"_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF, SYSCONF },
2022 #ifdef _SC_NPROCESSORS_ONLN 2023 {
"_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN, SYSCONF },
2025 #ifdef _SC_PHYS_PAGES 2026 {
"_PHYS_PAGES", _SC_PHYS_PAGES, SYSCONF },
2029 {
"_POSIX_ARG_MAX", _SC_ARG_MAX, SYSCONF },
2031 #ifdef _SC_ASYNCHRONOUS_IO 2032 {
"_POSIX_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO, SYSCONF },
2034 #ifdef _SC_CHILD_MAX 2035 {
"_POSIX_CHILD_MAX", _SC_CHILD_MAX, SYSCONF },
2038 {
"_POSIX_FSYNC", _SC_FSYNC, SYSCONF },
2040 #ifdef _SC_JOB_CONTROL 2041 {
"_POSIX_JOB_CONTROL", _SC_JOB_CONTROL, SYSCONF },
2043 #ifdef _SC_MAPPED_FILES 2044 {
"_POSIX_MAPPED_FILES", _SC_MAPPED_FILES, SYSCONF },
2047 {
"_POSIX_MEMLOCK", _SC_MEMLOCK, SYSCONF },
2049 #ifdef _SC_MEMLOCK_RANGE 2050 {
"_POSIX_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE, SYSCONF },
2052 #ifdef _SC_MEMORY_PROTECTION 2053 {
"_POSIX_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION, SYSCONF },
2055 #ifdef _SC_MESSAGE_PASSING 2056 {
"_POSIX_MESSAGE_PASSING", _SC_MESSAGE_PASSING, SYSCONF },
2058 #ifdef _SC_NGROUPS_MAX 2059 {
"_POSIX_NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF },
2062 {
"_POSIX_OPEN_MAX", _SC_OPEN_MAX, SYSCONF },
2065 {
"_POSIX_PII", _SC_PII, SYSCONF },
2067 #ifdef _SC_PII_INTERNET 2068 {
"_POSIX_PII_INTERNET", _SC_PII_INTERNET, SYSCONF },
2070 #ifdef _SC_PII_INTERNET_DGRAM 2071 {
"_POSIX_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM, SYSCONF },
2073 #ifdef _SC_PII_INTERNET_STREAM 2074 {
"_POSIX_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM, SYSCONF },
2077 {
"_POSIX_PII_OSI", _SC_PII_OSI, SYSCONF },
2079 #ifdef _SC_PII_OSI_CLTS 2080 {
"_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF },
2082 #ifdef _SC_PII_OSI_COTS 2083 {
"_POSIX_PII_OSI_COTS", _SC_PII_OSI_COTS, SYSCONF },
2085 #ifdef _SC_PII_OSI_M 2086 {
"_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF },
2088 #ifdef _SC_PII_SOCKET 2089 {
"_POSIX_PII_SOCKET", _SC_PII_SOCKET, SYSCONF },
2092 {
"_POSIX_PII_XTI", _SC_PII_XTI, SYSCONF },
2095 {
"_POSIX_POLL", _SC_POLL, SYSCONF },
2097 #ifdef _SC_PRIORITIZED_IO 2098 {
"_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO, SYSCONF },
2100 #ifdef _SC_PRIORITY_SCHEDULING 2101 {
"_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING, SYSCONF },
2103 #ifdef _SC_REALTIME_SIGNALS 2104 {
"_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS, SYSCONF },
2106 #ifdef _SC_SAVED_IDS 2107 {
"_POSIX_SAVED_IDS", _SC_SAVED_IDS, SYSCONF },
2110 {
"_POSIX_SELECT", _SC_SELECT, SYSCONF },
2112 #ifdef _SC_SEMAPHORES 2113 {
"_POSIX_SEMAPHORES", _SC_SEMAPHORES, SYSCONF },
2115 #ifdef _SC_SHARED_MEMORY_OBJECTS 2116 {
"_POSIX_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS, SYSCONF },
2118 #ifdef _SC_SSIZE_MAX 2119 {
"_POSIX_SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF },
2121 #ifdef _SC_STREAM_MAX 2122 {
"_POSIX_STREAM_MAX", _SC_STREAM_MAX, SYSCONF },
2124 #ifdef _SC_SYNCHRONIZED_IO 2125 {
"_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO, SYSCONF },
2128 {
"_POSIX_THREADS", _SC_THREADS, SYSCONF },
2130 #ifdef _SC_THREAD_ATTR_STACKADDR 2131 {
"_POSIX_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR, SYSCONF },
2133 #ifdef _SC_THREAD_ATTR_STACKSIZE 2134 {
"_POSIX_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE, SYSCONF },
2136 #ifdef _SC_THREAD_PRIORITY_SCHEDULING 2137 {
"_POSIX_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING, SYSCONF },
2139 #ifdef _SC_THREAD_PRIO_INHERIT 2140 {
"_POSIX_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT, SYSCONF },
2142 #ifdef _SC_THREAD_PRIO_PROTECT 2143 {
"_POSIX_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT, SYSCONF },
2145 #ifdef _SC_THREAD_PROCESS_SHARED 2146 {
"_POSIX_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED, SYSCONF },
2148 #ifdef _SC_THREAD_SAFE_FUNCTIONS 2149 {
"_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS, SYSCONF },
2152 {
"_POSIX_TIMERS", _SC_TIMERS, SYSCONF },
2154 #ifdef _SC_TIMER_MAX 2155 {
"TIMER_MAX", _SC_TIMER_MAX, SYSCONF },
2157 #ifdef _SC_TZNAME_MAX 2158 {
"_POSIX_TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF },
2161 {
"_POSIX_VERSION", _SC_VERSION, SYSCONF },
2163 #ifdef _SC_T_IOV_MAX 2164 {
"_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF },
2166 #ifdef _SC_XOPEN_CRYPT 2167 {
"_XOPEN_CRYPT", _SC_XOPEN_CRYPT, SYSCONF },
2169 #ifdef _SC_XOPEN_ENH_I18N 2170 {
"_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N, SYSCONF },
2172 #ifdef _SC_XOPEN_LEGACY 2173 {
"_XOPEN_LEGACY", _SC_XOPEN_LEGACY, SYSCONF },
2175 #ifdef _SC_XOPEN_REALTIME 2176 {
"_XOPEN_REALTIME", _SC_XOPEN_REALTIME, SYSCONF },
2178 #ifdef _SC_XOPEN_REALTIME_THREADS 2179 {
"_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS, SYSCONF },
2181 #ifdef _SC_XOPEN_SHM 2182 {
"_XOPEN_SHM", _SC_XOPEN_SHM, SYSCONF },
2184 #ifdef _SC_XOPEN_UNIX 2185 {
"_XOPEN_UNIX", _SC_XOPEN_UNIX, SYSCONF },
2187 #ifdef _SC_XOPEN_VERSION 2188 {
"_XOPEN_VERSION", _SC_XOPEN_VERSION, SYSCONF },
2190 #ifdef _SC_XOPEN_XCU_VERSION 2191 {
"_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION, SYSCONF },
2193 #ifdef _SC_XOPEN_XPG2 2194 {
"_XOPEN_XPG2", _SC_XOPEN_XPG2, SYSCONF },
2196 #ifdef _SC_XOPEN_XPG3 2197 {
"_XOPEN_XPG3", _SC_XOPEN_XPG3, SYSCONF },
2199 #ifdef _SC_XOPEN_XPG4 2200 {
"_XOPEN_XPG4", _SC_XOPEN_XPG4, SYSCONF },
2203 #ifdef _SC_BC_BASE_MAX 2204 {
"BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF },
2206 #ifdef _SC_BC_DIM_MAX 2207 {
"BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF },
2209 #ifdef _SC_BC_SCALE_MAX 2210 {
"BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF },
2212 #ifdef _SC_BC_STRING_MAX 2213 {
"BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF },
2215 #ifdef _SC_CHARCLASS_NAME_MAX 2216 {
"CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX, SYSCONF },
2218 #ifdef _SC_COLL_WEIGHTS_MAX 2219 {
"COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF },
2221 #ifdef _SC_EQUIV_CLASS_MAX 2222 {
"EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX, SYSCONF },
2224 #ifdef _SC_EXPR_NEST_MAX 2225 {
"EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF },
2228 {
"LINE_MAX", _SC_LINE_MAX, SYSCONF },
2230 #ifdef _SC_BC_BASE_MAX 2231 {
"POSIX2_BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF },
2233 #ifdef _SC_BC_DIM_MAX 2234 {
"POSIX2_BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF },
2236 #ifdef _SC_BC_SCALE_MAX 2237 {
"POSIX2_BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF },
2239 #ifdef _SC_BC_STRING_MAX 2240 {
"POSIX2_BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF },
2242 #ifdef _SC_2_CHAR_TERM 2243 {
"POSIX2_CHAR_TERM", _SC_2_CHAR_TERM, SYSCONF },
2245 #ifdef _SC_COLL_WEIGHTS_MAX 2246 {
"POSIX2_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF },
2249 {
"POSIX2_C_BIND", _SC_2_C_BIND, SYSCONF },
2252 {
"POSIX2_C_DEV", _SC_2_C_DEV, SYSCONF },
2254 #ifdef _SC_2_C_VERSION 2255 {
"POSIX2_C_VERSION", _SC_2_C_VERSION, SYSCONF },
2257 #ifdef _SC_EXPR_NEST_MAX 2258 {
"POSIX2_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF },
2260 #ifdef _SC_2_FORT_DEV 2261 {
"POSIX2_FORT_DEV", _SC_2_FORT_DEV, SYSCONF },
2263 #ifdef _SC_2_FORT_RUN 2264 {
"POSIX2_FORT_RUN", _SC_2_FORT_RUN, SYSCONF },
2267 {
"_POSIX2_LINE_MAX", _SC_LINE_MAX, SYSCONF },
2269 #ifdef _SC_2_LOCALEDEF 2270 {
"POSIX2_LOCALEDEF", _SC_2_LOCALEDEF, SYSCONF },
2272 #ifdef _SC_RE_DUP_MAX 2273 {
"POSIX2_RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF },
2276 {
"POSIX2_SW_DEV", _SC_2_SW_DEV, SYSCONF },
2279 {
"POSIX2_UPE", _SC_2_UPE, SYSCONF },
2281 #ifdef _SC_2_VERSION 2282 {
"POSIX2_VERSION", _SC_2_VERSION, SYSCONF },
2284 #ifdef _SC_RE_DUP_MAX 2285 {
"RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF },
2289 {
"PATH", _CS_PATH,
CONFSTR },
2290 {
"CS_PATH", _CS_PATH, CONFSTR },
2294 #ifdef _CS_LFS_CFLAGS 2295 {
"LFS_CFLAGS", _CS_LFS_CFLAGS, CONFSTR },
2297 #ifdef _CS_LFS_LDFLAGS 2298 {
"LFS_LDFLAGS", _CS_LFS_LDFLAGS, CONFSTR },
2301 {
"LFS_LIBS", _CS_LFS_LIBS, CONFSTR },
2303 #ifdef _CS_LFS_LINTFLAGS 2304 {
"LFS_LINTFLAGS", _CS_LFS_LINTFLAGS, CONFSTR },
2306 #ifdef _CS_LFS64_CFLAGS 2307 {
"LFS64_CFLAGS", _CS_LFS64_CFLAGS, CONFSTR },
2309 #ifdef _CS_LFS64_LDFLAGS 2310 {
"LFS64_LDFLAGS", _CS_LFS64_LDFLAGS, CONFSTR },
2312 #ifdef _CS_LFS64_LIBS 2313 {
"LFS64_LIBS", _CS_LFS64_LIBS, CONFSTR },
2315 #ifdef _CS_LFS64_LINTFLAGS 2316 {
"LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS, CONFSTR },
2320 #ifdef _SC_XBS5_ILP32_OFF32 2321 {
"_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32, SYSCONF },
2323 #ifdef _CS_XBS5_ILP32_OFF32_CFLAGS 2324 {
"XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS, CONFSTR },
2326 #ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS 2327 {
"XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS, CONFSTR },
2329 #ifdef _CS_XBS5_ILP32_OFF32_LIBS 2330 {
"XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS, CONFSTR },
2332 #ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS 2333 {
"XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS, CONFSTR },
2336 #ifdef _SC_XBS5_ILP32_OFFBIG 2337 {
"_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG, SYSCONF },
2339 #ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS 2340 {
"XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS, CONFSTR },
2342 #ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS 2343 {
"XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS, CONFSTR },
2345 #ifdef _CS_XBS5_ILP32_OFFBIG_LIBS 2346 {
"XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS, CONFSTR },
2348 #ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS 2349 {
"XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, CONFSTR },
2352 #ifdef _SC_XBS5_LP64_OFF64 2353 {
"_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64, SYSCONF },
2355 #ifdef _CS_XBS5_LP64_OFF64_CFLAGS 2356 {
"XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS, CONFSTR },
2358 #ifdef _CS_XBS5_LP64_OFF64_LDFLAGS 2359 {
"XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS, CONFSTR },
2361 #ifdef _CS_XBS5_LP64_OFF64_LIBS 2362 {
"XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS, CONFSTR },
2364 #ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS 2365 {
"XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS, CONFSTR },
2368 #ifdef _SC_XBS5_LPBIG_OFFBIG 2369 {
"_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG, SYSCONF },
2371 #ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS 2372 {
"XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS, CONFSTR },
2374 #ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS 2375 {
"XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS, CONFSTR },
2377 #ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS 2378 {
"XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS, CONFSTR },
2380 #ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS 2381 {
"XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, CONFSTR },
2384 #ifdef _SC_V6_ILP32_OFF32 2385 {
"_POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32, SYSCONF },
2387 #ifdef _CS_POSIX_V6_ILP32_OFF32_CFLAGS 2388 {
"POSIX_V6_ILP32_OFF32_CFLAGS", _CS_POSIX_V6_ILP32_OFF32_CFLAGS, CONFSTR },
2390 #ifdef _CS_POSIX_V6_ILP32_OFF32_LDFLAGS 2391 {
"POSIX_V6_ILP32_OFF32_LDFLAGS", _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, CONFSTR },
2393 #ifdef _CS_POSIX_V6_ILP32_OFF32_LIBS 2394 {
"POSIX_V6_ILP32_OFF32_LIBS", _CS_POSIX_V6_ILP32_OFF32_LIBS, CONFSTR },
2396 #ifdef _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS 2397 {
"POSIX_V6_ILP32_OFF32_LINTFLAGS", _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS, CONFSTR },
2400 #ifdef _CS_V6_WIDTH_RESTRICTED_ENVS 2401 {
"_POSIX_V6_WIDTH_RESTRICTED_ENVS", _CS_V6_WIDTH_RESTRICTED_ENVS, CONFSTR },
2404 #ifdef _SC_V6_ILP32_OFFBIG 2405 {
"_POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG, SYSCONF },
2407 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS 2408 {
"POSIX_V6_ILP32_OFFBIG_CFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, CONFSTR },
2410 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS 2411 {
"POSIX_V6_ILP32_OFFBIG_LDFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, CONFSTR },
2413 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LIBS 2414 {
"POSIX_V6_ILP32_OFFBIG_LIBS", _CS_POSIX_V6_ILP32_OFFBIG_LIBS, CONFSTR },
2416 #ifdef _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS 2417 {
"POSIX_V6_ILP32_OFFBIG_LINTFLAGS", _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS, CONFSTR },
2420 #ifdef _SC_V6_LP64_OFF64 2421 {
"_POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64, SYSCONF },
2423 #ifdef _CS_POSIX_V6_LP64_OFF64_CFLAGS 2424 {
"POSIX_V6_LP64_OFF64_CFLAGS", _CS_POSIX_V6_LP64_OFF64_CFLAGS, CONFSTR },
2426 #ifdef _CS_POSIX_V6_LP64_OFF64_LDFLAGS 2427 {
"POSIX_V6_LP64_OFF64_LDFLAGS", _CS_POSIX_V6_LP64_OFF64_LDFLAGS, CONFSTR },
2429 #ifdef _CS_POSIX_V6_LP64_OFF64_LIBS 2430 {
"POSIX_V6_LP64_OFF64_LIBS", _CS_POSIX_V6_LP64_OFF64_LIBS, CONFSTR },
2432 #ifdef _CS_POSIX_V6_LP64_OFF64_LINTFLAGS 2433 {
"POSIX_V6_LP64_OFF64_LINTFLAGS", _CS_POSIX_V6_LP64_OFF64_LINTFLAGS, CONFSTR },
2436 #ifdef _SC_V6_LPBIG_OFFBIG 2437 {
"_POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG, SYSCONF },
2439 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS 2440 {
"POSIX_V6_LPBIG_OFFBIG_CFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, CONFSTR },
2442 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS 2443 {
"POSIX_V6_LPBIG_OFFBIG_LDFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, CONFSTR },
2445 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LIBS 2446 {
"POSIX_V6_LPBIG_OFFBIG_LIBS", _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, CONFSTR },
2448 #ifdef _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS 2449 {
"POSIX_V6_LPBIG_OFFBIG_LINTFLAGS", _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS, CONFSTR },
2452 #ifdef _SC_ADVISORY_INFO 2453 {
"_POSIX_ADVISORY_INFO", _SC_ADVISORY_INFO, SYSCONF },
2456 {
"_POSIX_BARRIERS", _SC_BARRIERS, SYSCONF },
2459 {
"_POSIX_BASE", _SC_BASE, SYSCONF },
2461 #ifdef _SC_C_LANG_SUPPORT 2462 {
"_POSIX_C_LANG_SUPPORT", _SC_C_LANG_SUPPORT, SYSCONF },
2464 #ifdef _SC_C_LANG_SUPPORT_R 2465 {
"_POSIX_C_LANG_SUPPORT_R", _SC_C_LANG_SUPPORT_R, SYSCONF },
2467 #ifdef _SC_CLOCK_SELECTION 2468 {
"_POSIX_CLOCK_SELECTION", _SC_CLOCK_SELECTION, SYSCONF },
2471 {
"_POSIX_CPUTIME", _SC_CPUTIME, SYSCONF },
2473 #ifdef _SC_THREAD_CPUTIME 2474 {
"_POSIX_THREAD_CPUTIME", _SC_THREAD_CPUTIME, SYSCONF },
2476 #ifdef _SC_DEVICE_SPECIFIC 2477 {
"_POSIX_DEVICE_SPECIFIC", _SC_DEVICE_SPECIFIC, SYSCONF },
2479 #ifdef _SC_DEVICE_SPECIFIC_R 2480 {
"_POSIX_DEVICE_SPECIFIC_R", _SC_DEVICE_SPECIFIC_R, SYSCONF },
2483 {
"_POSIX_FD_MGMT", _SC_FD_MGMT, SYSCONF },
2486 {
"_POSIX_FIFO", _SC_FIFO, SYSCONF },
2489 {
"_POSIX_PIPE", _SC_PIPE, SYSCONF },
2491 #ifdef _SC_FILE_ATTRIBUTES 2492 {
"_POSIX_FILE_ATTRIBUTES", _SC_FILE_ATTRIBUTES, SYSCONF },
2494 #ifdef _SC_FILE_LOCKING 2495 {
"_POSIX_FILE_LOCKING", _SC_FILE_LOCKING, SYSCONF },
2497 #ifdef _SC_FILE_SYSTEM 2498 {
"_POSIX_FILE_SYSTEM", _SC_FILE_SYSTEM, SYSCONF },
2500 #ifdef _SC_MONOTONIC_CLOCK 2501 {
"_POSIX_MONOTONIC_CLOCK", _SC_MONOTONIC_CLOCK, SYSCONF },
2503 #ifdef _SC_MULTI_PROCESS 2504 {
"_POSIX_MULTI_PROCESS", _SC_MULTI_PROCESS, SYSCONF },
2506 #ifdef _SC_SINGLE_PROCESS 2507 {
"_POSIX_SINGLE_PROCESS", _SC_SINGLE_PROCESS, SYSCONF },
2509 #ifdef _SC_NETWORKING 2510 {
"_POSIX_NETWORKING", _SC_NETWORKING, SYSCONF },
2512 #ifdef _SC_READER_WRITER_LOCKS 2513 {
"_POSIX_READER_WRITER_LOCKS", _SC_READER_WRITER_LOCKS, SYSCONF },
2515 #ifdef _SC_SPIN_LOCKS 2516 {
"_POSIX_SPIN_LOCKS", _SC_SPIN_LOCKS, SYSCONF },
2519 {
"_POSIX_REGEXP", _SC_REGEXP, SYSCONF },
2521 #ifdef _SC_REGEX_VERSION 2522 {
"_REGEX_VERSION", _SC_REGEX_VERSION, SYSCONF },
2525 {
"_POSIX_SHELL", _SC_SHELL, SYSCONF },
2528 {
"_POSIX_SIGNALS", _SC_SIGNALS, SYSCONF },
2531 {
"_POSIX_SPAWN", _SC_SPAWN, SYSCONF },
2533 #ifdef _SC_SPORADIC_SERVER 2534 {
"_POSIX_SPORADIC_SERVER", _SC_SPORADIC_SERVER, SYSCONF },
2536 #ifdef _SC_THREAD_SPORADIC_SERVER 2537 {
"_POSIX_THREAD_SPORADIC_SERVER", _SC_THREAD_SPORADIC_SERVER, SYSCONF },
2539 #ifdef _SC_SYSTEM_DATABASE 2540 {
"_POSIX_SYSTEM_DATABASE", _SC_SYSTEM_DATABASE, SYSCONF },
2542 #ifdef _SC_SYSTEM_DATABASE_R 2543 {
"_POSIX_SYSTEM_DATABASE_R", _SC_SYSTEM_DATABASE_R, SYSCONF },
2546 {
"_POSIX_TIMEOUTS", _SC_TIMEOUTS, SYSCONF },
2548 #ifdef _SC_TYPED_MEMORY_OBJECTS 2549 {
"_POSIX_TYPED_MEMORY_OBJECTS", _SC_TYPED_MEMORY_OBJECTS, SYSCONF },
2551 #ifdef _SC_USER_GROUPS 2552 {
"_POSIX_USER_GROUPS", _SC_USER_GROUPS, SYSCONF },
2554 #ifdef _SC_USER_GROUPS_R 2555 {
"_POSIX_USER_GROUPS_R", _SC_USER_GROUPS_R, SYSCONF },
2558 {
"POSIX2_PBS", _SC_2_PBS, SYSCONF },
2560 #ifdef _SC_2_PBS_ACCOUNTING 2561 {
"POSIX2_PBS_ACCOUNTING", _SC_2_PBS_ACCOUNTING, SYSCONF },
2563 #ifdef _SC_2_PBS_LOCATE 2564 {
"POSIX2_PBS_LOCATE", _SC_2_PBS_LOCATE, SYSCONF },
2566 #ifdef _SC_2_PBS_TRACK 2567 {
"POSIX2_PBS_TRACK", _SC_2_PBS_TRACK, SYSCONF },
2569 #ifdef _SC_2_PBS_MESSAGE 2570 {
"POSIX2_PBS_MESSAGE", _SC_2_PBS_MESSAGE, SYSCONF },
2572 #ifdef _SC_SYMLOOP_MAX 2573 {
"SYMLOOP_MAX", _SC_SYMLOOP_MAX, SYSCONF },
2575 #ifdef _SC_STREAM_MAX 2576 {
"STREAM_MAX", _SC_STREAM_MAX, SYSCONF },
2578 #ifdef _SC_AIO_LISTIO_MAX 2579 {
"AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX, SYSCONF },
2582 {
"AIO_MAX", _SC_AIO_MAX, SYSCONF },
2584 #ifdef _SC_AIO_PRIO_DELTA_MAX 2585 {
"AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX, SYSCONF },
2587 #ifdef _SC_DELAYTIMER_MAX 2588 {
"DELAYTIMER_MAX", _SC_DELAYTIMER_MAX, SYSCONF },
2590 #ifdef _SC_HOST_NAME_MAX 2591 {
"HOST_NAME_MAX", _SC_HOST_NAME_MAX, SYSCONF },
2593 #ifdef _SC_LOGIN_NAME_MAX 2594 {
"LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF },
2596 #ifdef _SC_MQ_OPEN_MAX 2597 {
"MQ_OPEN_MAX", _SC_MQ_OPEN_MAX, SYSCONF },
2599 #ifdef _SC_MQ_PRIO_MAX 2600 {
"MQ_PRIO_MAX", _SC_MQ_PRIO_MAX, SYSCONF },
2602 #ifdef _SC_DEVICE_IO 2603 {
"_POSIX_DEVICE_IO", _SC_DEVICE_IO, SYSCONF },
2606 {
"_POSIX_TRACE", _SC_TRACE, SYSCONF },
2608 #ifdef _SC_TRACE_EVENT_FILTER 2609 {
"_POSIX_TRACE_EVENT_FILTER", _SC_TRACE_EVENT_FILTER, SYSCONF },
2611 #ifdef _SC_TRACE_INHERIT 2612 {
"_POSIX_TRACE_INHERIT", _SC_TRACE_INHERIT, SYSCONF },
2614 #ifdef _SC_TRACE_LOG 2615 {
"_POSIX_TRACE_LOG", _SC_TRACE_LOG, SYSCONF },
2617 #ifdef _SC_RTSIG_MAX 2618 {
"RTSIG_MAX", _SC_RTSIG_MAX, SYSCONF },
2620 #ifdef _SC_SEM_NSEMS_MAX 2621 {
"SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX, SYSCONF },
2623 #ifdef _SC_SEM_VALUE_MAX 2624 {
"SEM_VALUE_MAX", _SC_SEM_VALUE_MAX, SYSCONF },
2626 #ifdef _SC_SIGQUEUE_MAX 2627 {
"SIGQUEUE_MAX", _SC_SIGQUEUE_MAX, SYSCONF },
2629 #ifdef _PC_FILESIZEBITS 2630 {
"FILESIZEBITS", _PC_FILESIZEBITS, PATHCONF },
2632 #ifdef _PC_ALLOC_SIZE_MIN 2633 {
"POSIX_ALLOC_SIZE_MIN", _PC_ALLOC_SIZE_MIN, PATHCONF },
2635 #ifdef _PC_REC_INCR_XFER_SIZE 2636 {
"POSIX_REC_INCR_XFER_SIZE", _PC_REC_INCR_XFER_SIZE, PATHCONF },
2638 #ifdef _PC_REC_MAX_XFER_SIZE 2639 {
"POSIX_REC_MAX_XFER_SIZE", _PC_REC_MAX_XFER_SIZE, PATHCONF },
2641 #ifdef _PC_REC_MIN_XFER_SIZE 2642 {
"POSIX_REC_MIN_XFER_SIZE", _PC_REC_MIN_XFER_SIZE, PATHCONF },
2644 #ifdef _PC_REC_XFER_ALIGN 2645 {
"POSIX_REC_XFER_ALIGN", _PC_REC_XFER_ALIGN, PATHCONF },
2647 #ifdef _PC_SYMLINK_MAX 2648 {
"SYMLINK_MAX", _PC_SYMLINK_MAX, PATHCONF },
2650 #ifdef _CS_GNU_LIBC_VERSION 2651 {
"GNU_LIBC_VERSION", _CS_GNU_LIBC_VERSION, CONFSTR },
2653 #ifdef _CS_GNU_LIBPTHREAD_VERSION 2654 {
"GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION, CONFSTR },
2656 #ifdef _PC_2_SYMLINKS 2657 {
"POSIX2_SYMLINKS", _PC_2_SYMLINKS, PATHCONF },
2660 #ifdef _SC_LEVEL1_ICACHE_SIZE 2661 {
"LEVEL1_ICACHE_SIZE", _SC_LEVEL1_ICACHE_SIZE, SYSCONF },
2663 #ifdef _SC_LEVEL1_ICACHE_ASSOC 2664 {
"LEVEL1_ICACHE_ASSOC", _SC_LEVEL1_ICACHE_ASSOC, SYSCONF },
2666 #ifdef _SC_LEVEL1_ICACHE_LINESIZE 2667 {
"LEVEL1_ICACHE_LINESIZE", _SC_LEVEL1_ICACHE_LINESIZE, SYSCONF },
2669 #ifdef _SC_LEVEL1_DCACHE_SIZE 2670 {
"LEVEL1_DCACHE_SIZE", _SC_LEVEL1_DCACHE_SIZE, SYSCONF },
2672 #ifdef _SC_LEVEL1_DCACHE_ASSOC 2673 {
"LEVEL1_DCACHE_ASSOC", _SC_LEVEL1_DCACHE_ASSOC, SYSCONF },
2675 #ifdef _SC_LEVEL1_DCACHE_LINESIZE 2676 {
"LEVEL1_DCACHE_LINESIZE", _SC_LEVEL1_DCACHE_LINESIZE, SYSCONF },
2678 #ifdef _SC_LEVEL2_CACHE_SIZE 2679 {
"LEVEL2_CACHE_SIZE", _SC_LEVEL2_CACHE_SIZE, SYSCONF },
2681 #ifdef _SC_LEVEL2_CACHE_ASSOC 2682 {
"LEVEL2_CACHE_ASSOC", _SC_LEVEL2_CACHE_ASSOC, SYSCONF },
2684 #ifdef _SC_LEVEL2_CACHE_LINESIZE 2685 {
"LEVEL2_CACHE_LINESIZE", _SC_LEVEL2_CACHE_LINESIZE, SYSCONF },
2687 #ifdef _SC_LEVEL3_CACHE_SIZE 2688 {
"LEVEL3_CACHE_SIZE", _SC_LEVEL3_CACHE_SIZE, SYSCONF },
2690 #ifdef _SC_LEVEL3_CACHE_ASSOC 2691 {
"LEVEL3_CACHE_ASSOC", _SC_LEVEL3_CACHE_ASSOC, SYSCONF },
2693 #ifdef _SC_LEVEL3_CACHE_LINESIZE 2694 {
"LEVEL3_CACHE_LINESIZE", _SC_LEVEL3_CACHE_LINESIZE, SYSCONF },
2696 #ifdef _SC_LEVEL4_CACHE_SIZE 2697 {
"LEVEL4_CACHE_SIZE", _SC_LEVEL4_CACHE_SIZE, SYSCONF },
2699 #ifdef _SC_LEVEL4_CACHE_ASSOC 2700 {
"LEVEL4_CACHE_ASSOC", _SC_LEVEL4_CACHE_ASSOC, SYSCONF },
2704 {
"IPV6", _SC_IPV6, SYSCONF },
2706 #ifdef _SC_RAW_SOCKETS 2707 {
"RAW_SOCKETS", _SC_RAW_SOCKETS, SYSCONF },
2710 { NULL, 0, SYSCONF }
2713 #define _GETCONF_PATH "/" 2725 const char * NS =
"getconf";
2732 if (_getconf_path == NULL) {
2733 _getconf_path =
rpmExpand(
"%{?_rpmds__getconf_path}", NULL);
2735 if (!(_getconf_path != NULL && *_getconf_path ==
'/')) {
2737 _getconf_path =
_free(_getconf_path);
2747 for (c = vars; c->
name != NULL; ++c) {
2755 sprintf(EVR,
"%ld", value);
2761 #if defined(_SC_UINT_MAX) && defined(_SC_ULONG_MAX) 2766 sprintf(EVR,
"%lu", value);
2772 sprintf(EVR,
"%ld", value);
2777 clen = confstr(c->
call_name, (
char *) NULL, 0);
2778 EVR = (
char *)
xmalloc(clen+1);
2780 if (confstr (c->
call_name, EVR, clen) != clen) {
2781 fprintf(stderr,
"confstr: %s\n", strerror(
errno));
2791 for (t = EVR; *t; t++) {
2792 if (*t ==
'\n') *t =
' ';
2794 if (!strcmp(N,
"GNU_LIBC_VERSION")
2795 || !strcmp(N,
"GNU_LIBPTHREAD_VERSION"))
2797 for (t = EVR; *t; t++) {
2798 if (*t ==
' ') *t =
'-';
2802 if (*EVR ==
'\0' || strchr(EVR,
' ') != NULL
2803 || (EVR[0] ==
'-' && strchr(
"0123456789", EVR[1]) == NULL))
2822 if (_rpmds_debug < 0)
2872 memset(PRCO, 0,
sizeof(*PRCO));
2883 static int scareMem = 0;
2893 PRCO->Pdsp = &PRCO->P;
2894 PRCO->Rdsp = &PRCO->R;
2895 PRCO->Cdsp = &PRCO->C;
2896 PRCO->Odsp = &PRCO->O;
2897 PRCO->Tdsp = &PRCO->T;
2898 PRCO->Ddsp = &PRCO->D;
2899 PRCO->Ldsp = &PRCO->L;
2928 #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__) 2929 #if defined(RPM_VENDOR_MANDRIVA) 2930 static char * sonameDep(
char * t,
const char * s,
int isElf64,
int devel,
int uClibc)
2936 tmp =
stpcpy(tmp,
"uClibc(");
2938 tmp =
stpcpy(tmp,
"devel(");
2940 #if !defined(__alpha__) && !defined(__sun) 2943 if (!devel && s[strlen(s)-1] !=
')')
2948 tmp = strstr(t,
".so");
2949 tmp =
stpcpy(tmp,
"(64bit)");
2955 char *
suffix = strstr(t,
".so");
2966 static char *find_elf_interpreter(GElf_Ehdr *ehdr, Elf *elf,
char *filename,
char *prev)
2969 struct stat statbuf;
2971 GElf_Shdr shdr_mem, *shdr;
2972 GElf_Phdr phdr_mem, *phdr;
2973 GElf_Dyn dyn_mem, *dyn;
2975 Elf_Scn *scn = NULL;
2977 char *interp_name = NULL;
2978 char *libpath = NULL;
2986 if (!(fp = fopen(filename,
"r"))) {
2990 if (fstat((fdno = fileno(fp)), &statbuf) < 0) {
2994 if ((
size_t) statbuf.st_size <
sizeof(Elf64_Ehdr) || !S_ISREG(statbuf.st_mode))
2997 (void) elf_version(EV_CURRENT);
2999 if ((elf = elf_begin (fdno, ELF_C_READ, NULL)) == NULL
3000 || elf_kind(elf) != ELF_K_ELF
3001 || (ehdr = gelf_getehdr(elf, &ehdr_mem)) == NULL
3002 || !(ehdr->e_type == ET_DYN || ehdr->e_type == ET_EXEC))
3007 if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) {
3008 fprintf(stderr,
"%s: not a dynamic executable\n", filename);
3011 class = gelf_getclass(elf);
3013 for (cnt = 0; cnt < ehdr->e_phnum; cnt++) {
3014 phdr = gelf_getphdr (elf, cnt, &phdr_mem);
3015 if (phdr->p_type == PT_INTERP)
3020 Elf_Data *data = NULL;
3022 scn = gelf_offscn (elf, phdr->p_offset);
3023 shdr = gelf_getshdr(scn, &shdr_mem);
3024 data = elf_getdata (scn, data);
3025 if (data && data->d_buf) {
3026 interp_name = strdup(data->d_buf);
3032 if (elf_getshdrstrndx (elf, &shstrndx) >= 0)
3033 while ((scn = elf_nextscn(elf, scn)) != NULL) {
3034 shdr = gelf_getshdr(scn, &shdr_mem);
3035 if (shdr->sh_type == SHT_DYNAMIC) {
3037 for (cnt = 0; cnt < ehdr->e_phnum; cnt++) {
3038 phdr = gelf_getphdr (elf, cnt, &phdr_mem);
3039 if (phdr->p_type == PT_LOAD)
3044 while ((data = elf_getdata (scn, data)) != NULL) {
3045 int dynsize = (int)(shdr->sh_size / shdr->sh_entsize)-1;
3046 for (cnt = dynsize; cnt >= 0; --cnt) {
3047 dyn = gelf_getdyn (data, cnt, &dyn_mem);
3049 if (dyn->d_tag == DT_RPATH || dyn->d_tag == DT_RUNPATH) {
3050 rpath = elf_strptr (elf, shdr->sh_link, dyn->d_un.d_val);
3054 for (cnt = 0; cnt <= dynsize; ++cnt) {
3055 dyn = gelf_getdyn (data, cnt, &dyn_mem);
3060 if (phdr && dyn->d_tag == DT_SONAME) {
3061 interp_name = strdup(elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val));
3064 if (dyn->d_tag == DT_NEEDED) {
3071 libpath = elf_strptr (elf, shdr->sh_link, dyn->d_un.d_val);
3072 if (prev && *prev && libpath && !strcmp(basename(prev), libpath))
3075 if (!libpath || !strlen(libpath))
3086 if (stat(libpath, &statbuf) == 0)
3090 if (rpath && *rpath) {
3091 tmp2 =
stpcpy(buf, rpath);
3093 tmp =
getenv(
"LD_LIBRARY_PATH");
3095 tmp2 =
stpcpy(tmp2, tmp);
3096 if ((rpath && *rpath) || tmp)
3097 tmp2 =
stpcpy(tmp2,
":");
3099 tmp2 =
stpcpy(tmp2, (
class == ELFCLASS64) ?
"/lib64:/usr/lib64" :
"/lib:/usr/lib");
3101 buildroot =
rpmExpand(
"%{buildroot}", NULL);
3102 if (stat(buildroot, &statbuf) == 0) {
3104 for (tmp2 = buf, tmp = path;
3107 tmp =
stpcpy(tmp, buildroot);
3108 tmp3 = strchr(tmp2,
':');
3129 while ((path_n = strstr(path_n,
"//"))) {
3131 memmove(path_n, path_n + 1, i - 1);
3132 *(path_n + i - 1) =
'\0';
3136 for (i = strlen(path); i > 0; i--) {
3137 if (path[i] ==
':') {
3143 for (i = 0; i < count; i++) {
3144 strcpy(tmp, path_n);
3146 strcat(tmp, libpath);
3148 if (stat(tmp, &statbuf) == 0 && statbuf.st_mode & S_IRUSR) {
3152 path_n += (strlen(path_n) + 1);
3167 if (elf) (void) elf_end(elf);
3170 if (!interp_name && libpath)
3171 return find_elf_interpreter(NULL, NULL, libpath, filename);
3175 static int checkuClibc(GElf_Ehdr *ehdr, Elf *elf) {
3177 char *interp = find_elf_interpreter(ehdr, elf, NULL, NULL);
3180 char *tmp = basename(interp);
3181 if (tmp[0] ==
'l' && tmp[1] ==
'd') {
3182 tmp += ((tmp[2] ==
'3' && tmp[3] ==
'2') ||
3183 (tmp[2] ==
'6' && tmp[3] ==
'4')) ?
3185 if (!strncasecmp(tmp,
"uClibc.so",
sizeof(
"uClibc.so")-1))
3193 static char * sonameDep(
char * t,
const char * s,
int isElf64,
int devel,
int uClibc)
3197 #if !defined(__alpha__) && !defined(__sun) 3199 if (s[strlen(s)-1] !=
')')
3213 int (*add) (
void * context,
rpmds ds),
void * context)
3215 #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__) 3219 GElf_Ehdr ehdr_mem, * ehdr;
3220 GElf_Shdr shdr_mem, * shdr;
3221 GElf_Verdef def_mem, * def;
3222 GElf_Verneed need_mem, * need;
3223 GElf_Dyn dyn_mem, * dyn;
3224 unsigned int auxoffset;
3225 unsigned int offset;
3232 const char * soname = NULL;
3245 static int filter_GLIBC_PRIVATE = 0;
3246 static int oneshot = 0;
3249 if (_rpmds_debug < 0)
3250 fprintf(stderr,
"*** rpmdsELF(%s, %d, %p, %p)\n", fn, flags, (
void *)add, context);
3258 {
struct stat sb, * st = &sb;
3259 if (stat(fn, st) != 0)
3261 is_executable = (int)(st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH));
3264 fdno = open(fn, O_RDONLY);
3268 (void) elf_version(EV_CURRENT);
3272 if ((elf = elf_begin (fdno, ELF_C_READ, NULL)) == NULL
3273 || elf_kind(elf) != ELF_K_ELF
3274 || (ehdr = gelf_getehdr(elf, &ehdr_mem)) == NULL
3275 || !(ehdr->e_type == ET_DYN || ehdr->e_type == ET_EXEC))
3279 isElf64 = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
3280 isDSO = ehdr->e_type == ET_DYN;
3281 #if defined(RPM_VENDOR_MANDRIVA) 3282 isuClibc = checkuClibc(ehdr, elf);
3289 while ((scn = elf_nextscn(elf, scn)) != NULL) {
3290 shdr = gelf_getshdr(scn, &shdr_mem);
3294 soname =
_free(soname);
3295 switch (shdr->sh_type) {
3300 #if defined(HAVE_GELF_GETNOTE) && !defined(RPM_VENDOR_MANDRIVA) 3301 if (!(shdr->sh_flags & SHF_ALLOC))
3304 while ((data = elf_getdata(scn, data)) != NULL) {
3309 while (offset < data->d_size
3310 && (offset = gelf_getnote(data, offset,
3311 &nhdr, &name_offset, &desc_offset)) > 0)
3313 const char *
name = ((
char *)data->d_buf) + name_offset;
3314 const char *desc = ((
char *)data->d_buf) + desc_offset;
3315 if (
memchr(name,
'\0', nhdr.n_namesz) == NULL)
3317 switch (nhdr.n_type) {
3319 #if !defined(NT_GNU_BUILD_ID) 3320 #define NT_GNU_BUILD_ID 3 3322 case NT_GNU_BUILD_ID:
3323 if (strcmp(name,
"GNU") == 0 && nhdr.n_descsz > 0) {
3324 static const char hex[] =
"0123456789abcdef";
3330 for (i = 0; i < nhdr.n_descsz; ++i) {
3331 *t++ = hex[ (((unsigned)desc[i] >> 4) & 0x0f) ];
3332 *t++ = hex[ (((unsigned)desc[i] ) & 0x0f) ];
3338 xx = add(context, ds);
3348 case SHT_GNU_verdef:
3351 while ((data = elf_getdata (scn, data)) != NULL) {
3353 for (cnt = (
int)shdr->sh_info; --cnt >= 0; ) {
3355 def = gelf_getverdef (data, offset, &def_mem);
3358 auxoffset = (unsigned)(offset + def->vd_aux);
3359 for (cnt2 = (
int)def->vd_cnt; --cnt2 >= 0; ) {
3360 GElf_Verdaux aux_mem, * aux;
3362 aux = gelf_getverdaux (data, auxoffset, &aux_mem);
3366 s = elf_strptr(elf, shdr->sh_link, aux->vda_name);
3370 if (def->vd_flags & VER_FLG_BASE) {
3371 soname =
_free(soname);
3375 && !(filter_GLIBC_PRIVATE != 0
3376 && !strcmp(s,
"GLIBC_PRIVATE")))
3386 sonameDep(t, buf, isElf64, 0, isuClibc),
3387 "", RPMSENSE_FIND_PROVIDES);
3388 xx = add(context, ds);
3392 auxoffset += aux->vda_next;
3394 offset += def->vd_next;
3398 case SHT_GNU_verneed:
3401 if (!skipR && is_executable)
3402 while ((data = elf_getdata (scn, data)) != NULL) {
3404 for (cnt = (
int)shdr->sh_info; --cnt >= 0; ) {
3405 need = gelf_getverneed (data, offset, &need_mem);
3409 s = elf_strptr(elf, shdr->sh_link, need->vn_file);
3412 soname =
_free(soname);
3414 auxoffset = (unsigned)(offset + need->vn_aux);
3415 for (cnt2 = (
int)need->vn_cnt; --cnt2 >= 0; ) {
3416 GElf_Vernaux aux_mem, * aux;
3418 aux = gelf_getvernaux (data, auxoffset, &aux_mem);
3422 s = elf_strptr(elf, shdr->sh_link, aux->vna_name);
3428 && !(filter_GLIBC_PRIVATE != 0
3429 && !strcmp(s,
"GLIBC_PRIVATE")))
3439 sonameDep(t, buf, isElf64, 0, isuClibc),
3440 "", RPMSENSE_FIND_REQUIRES);
3441 xx = add(context, ds);
3445 auxoffset += aux->vna_next;
3447 offset += need->vn_next;
3453 while ((data = elf_getdata (scn, data)) != NULL) {
3454 for (cnt = 0; cnt < (int)(shdr->sh_size / shdr->sh_entsize); ++cnt) {
3455 dyn = gelf_getdyn (data, cnt, &dyn_mem);
3459 switch (dyn->d_tag) {
3474 if (skipR || !is_executable)
3477 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
3481 sonameDep(buf, s, isElf64, 0, isuClibc),
3482 "", RPMSENSE_FIND_REQUIRES);
3483 xx = add(context, ds);
3491 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
3496 sonameDep(buf, s, isElf64, 0, isuClibc),
3497 "", RPMSENSE_FIND_PROVIDES);
3498 xx = add(context, ds);
3510 #if !defined(RPM_VENDOR_MANDRIVA) 3513 if (gotGNUHASH && !gotHASH) {
3515 RPMSENSE_FIND_REQUIRES);
3516 xx = add(context, ds);
3523 if (!skipP && isDSO && !gotDEBUG && !gotSONAME) {
3524 s = strrchr(fn,
'/');
3534 sonameDep(buf, s, isElf64, 0, isuClibc),
"", RPMSENSE_FIND_PROVIDES);
3535 xx = add(context, ds);
3541 soname =
_free(soname);
3542 if (elf) (void) elf_end(elf);
3553 #if defined(RPM_VENDOR_MANDRIVA) 3563 int rpmdsSymlink(
const char * fn,
int flags,
3564 int (*add) (
void * context,
rpmds ds),
void * context)
3567 int rpmdsSymlink(
const char * fn,
int flags,
3568 int (*add) (
void * context,
rpmds ds),
void * context)
3570 #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__) 3574 GElf_Ehdr ehdr_mem, * ehdr;
3575 GElf_Shdr shdr_mem, * shdr;
3576 GElf_Dyn dyn_mem, * dyn;
3581 const char * s, * bn;
3584 const char * soname = NULL;
3598 const char *filterRequires[] = {
"ld-linux",
"ld64-linux" "libBrokenLocale.so",
3599 "libanl.so",
"libc.so",
"libcidn.so",
"libcrypt.so",
"libdl.so",
"libm.so",
3600 "libnsl.so",
"libnss_compat.so",
"libnss_dns.so",
"libnss_files.so",
3601 "libnss_hesiod.so",
"libnss_nis.so",
"libnss_nisplus.so",
"libpthread.so",
3602 "libresolv.so",
"librt.so",
"libutil.so",
"libthread_db.so"};
3606 bn = basename((
char*)fn);
3616 if (!
mireRegcomp(mire,
"^.*/(usr/)?lib(64)?/lib.*\\.so$"))
3624 if (_rpmds_debug < 0)
3625 fprintf(stderr,
"*** rpmdsELF(%s, %d, %p, %p)\n", fn, flags, (
void *)add, context);
3629 {
struct stat sb, * st = &sb;
3630 if (lstat(fn, st) != 0)
3632 is_executable = (int)(st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH));
3633 is_symlink =
S_ISLNK(st->st_mode);
3638 if ((lnklen = readlink(fn, path,
MAXPATHLEN - 1)) == -1) {
3643 path[lnklen] =
'\0';
3648 bn = basename((
char*)fn);
3649 if (strncmp(bn, basename(path), (
size_t)(strstr(bn,
".so") - bn)))
3652 FILE *fp = fopen(fn,
"r");
3657 if (fp == NULL || ferror(fp)) {
3658 if (fp) (void) fclose(fp);
3665 while ((in = fgets(buf,
sizeof(buf) - 1, fp))) {
3666 in[
sizeof(buf)-1] =
'\0';
3667 if ((in = strstr(in,
"GROUP")) &&
3668 (in = strchr(in,
'(')) &&
3669 (fn = strchr(in,
'/')) &&
3670 (in = strchr(fn,
' '))) {
3674 if (ferror(fp) || feof(fp))
3682 struct stat sb, * st = &sb;
3684 while((in = strrchr(path,
'/'))) {
3686 if (stat(path, st) == 0) {
3697 fdno = open(fn, O_RDONLY);
3701 (void) elf_version(EV_CURRENT);
3705 if ((elf = elf_begin (fdno, ELF_C_READ, NULL)) == NULL
3706 || elf_kind(elf) != ELF_K_ELF
3707 || (ehdr = gelf_getehdr(elf, &ehdr_mem)) == NULL
3708 || !(ehdr->e_type == ET_DYN || ehdr->e_type == ET_EXEC))
3712 isElf64 = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
3713 #if defined(RPM_VENDOR_MANDRIVA) 3714 isuClibc = checkuClibc(ehdr, elf);
3721 while ((scn = elf_nextscn(elf, scn)) != NULL) {
3722 shdr = gelf_getshdr(scn, &shdr_mem);
3726 soname =
_free(soname);
3727 switch (shdr->sh_type) {
3733 while ((data = elf_getdata (scn, data)) != NULL) {
3734 for (cnt = 0; cnt < (int)(shdr->sh_size / shdr->sh_entsize); ++cnt) {
3735 dyn = gelf_getdyn (data, cnt, &dyn_mem);
3739 switch (dyn->d_tag) {
3745 if (skipR || !is_executable)
3748 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
3752 for (i = 0; i < (int)(
sizeof(filterRequires)/
sizeof(filterRequires[0])); i++)
3753 if (!strncmp(s, filterRequires[i], strlen(filterRequires[i])) && !isuClibc)
3756 if (
sizeof(filterRequires)/
sizeof(filterRequires[0]) == i)
3761 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
3768 sonameDep(buf, s, isElf64, 1, isuClibc),
3769 "", RPMSENSE_FIND_PROVIDES);
3770 xx = add(context, ds);
3784 if (gotSONAME && !skipR) {
3785 for (i = 0, cnt =
argvCount(deps); i < cnt; i++) {
3786 if (deps[i][0] ==
'l' && deps[i][1] ==
'd')
3789 sonameDep(buf, deps[i], isElf64, 1, isuClibc),
3790 "", RPMSENSE_FIND_REQUIRES);
3791 xx = add(context, ds);
3798 if (elf) (void) elf_end(elf);
3808 #define _SBIN_LDCONFIG_P "/sbin/ldconfig -p" 3812 #define _LD_SO_CACHE "/etc/ld.so.cache" 3822 const char *N, *EVR;
3836 if (_ldconfig_cmd == NULL) {
3837 _ldconfig_cmd =
rpmExpand(
"%{?_rpmds_ldconfig_cmd}", NULL);
3838 if (!(_ldconfig_cmd != NULL && *_ldconfig_cmd ==
'/')) {
3840 _ldconfig_cmd =
_free(_ldconfig_cmd);
3846 if (_ldconfig_cache == NULL) {
3847 _ldconfig_cache =
rpmExpand(
"%{?_rpmds_ldconfig_cache}", NULL);
3849 if (!(_ldconfig_cache != NULL && *_ldconfig_cache ==
'/')) {
3851 _ldconfig_cache =
_free(_ldconfig_cache);
3861 if (_rpmds_debug < 0)
3862 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);
3864 fp = popen(_ldconfig_cmd,
"r");
3868 while((f = fgets(buf, (
int)
sizeof(buf), fp)) != NULL) {
3881 while (*fe && !(fe[0] ==
'=' && fe[1] ==
'>'))
3896 if (fe > f && fe[-1] ==
' ') fe[-1] =
'\0';
3908 for (t = f; *t !=
'\0'; t++) {
3926 Flags = (
evrFlags) (Flags | RPMSENSE_PROBE);
3937 if (fp != NULL) (void) pclose(fp);
3943 #define _RLD_SEARCH_PATH "/lib:/usr/lib" 3945 static const char * _rld_search_path = NULL;
3948 int rpmdsRldpath(
rpmPRCO PRCO,
const char * rldp)
3953 const char *N, *EVR;
3967 if (_rld_search_path == NULL) {
3968 _rld_search_path =
rpmExpand(
"%{?_rpmds_rld_search_path}", NULL);
3970 if (!(_rld_search_path != NULL && *_rld_search_path ==
'/')) {
3972 _rld_search_path =
_free(_rld_search_path);
3974 _rld_search_path =
xstrdup(_RLD_SEARCH_PATH);
3980 rldp = _rld_search_path;
3982 if (_rpmds_debug > 0)
3983 fprintf(stderr,
"*** rpmdsRldpath(%p, %s) P %p R %p C %p O %p\n", PRCO, rldp, PRCO->Pdsp, PRCO->Rdsp, PRCO->Cdsp, PRCO->Odsp);
3996 strncpy(buf, f, g - f + 1);
4003 if ( !(strlen(buf) > 0 && buf[0] ==
'/') )
4008 strcat(buf,
"/*.so.*");
4010 if (_rpmds_debug > 0)
4011 fprintf(stderr,
"*** rpmdsRldpath(%p, %s) globbing %s\n", PRCO, rldp, buf);
4013 xx =
Glob(buf, 0, NULL, &gl);
4017 if (_rpmds_debug > 0)
4018 fprintf(stderr,
"*** rpmdsRldpath(%p, %s) glob matched %d files\n", PRCO, rldp, gl.
gl_pathc);
4031 N = DSOfn + strlen(DSOfn);
4032 while (N > DSOfn && *N !=
'/')
4035 Flags |= RPMSENSE_PROBE;
4052 #define _SOLARIS_CRLE "/usr/sbin/crle" 4054 static const char * _crle_cmd = NULL;
4056 int rpmdsCrle(
rpmPRCO PRCO,
const char * fn)
4072 if (_crle_cmd == NULL) {
4073 _crle_cmd =
rpmExpand(
"%{?_rpmds_crle_cmd}", NULL);
4074 if (!(_crle_cmd != NULL && *_crle_cmd ==
'/')) {
4076 _crle_cmd =
_free(_crle_cmd);
4078 _crle_cmd =
xstrdup(_SOLARIS_CRLE);
4083 fp = popen(_crle_cmd,
"r");
4092 while((f = fgets(buf,
sizeof(buf), fp)) != NULL) {
4096 g = strstr(f,
"(ELF):");
4101 f = g + (
sizeof(
"(ELF):")-1);
4114 rc = rpmdsRldpath(PRCO, f);
4123 static const char * NS =
"uname";
4124 struct utsname myun;
4137 if (un->sysname != NULL)
4139 if (un->nodename != NULL)
4141 if (un->release != NULL)
4144 if (un->version != NULL)
4147 if (un->machine != NULL)
4149 #if defined(__linux__) 4150 if (un->domainname != NULL && strcmp(un->domainname,
"(none)"))
4160 #define _PERL_PROVIDES "/usr/bin/find /usr/lib/perl5 | /usr/lib/rpm/perl.prov" 4169 const char *N, *EVR;
4175 const char * fn =
"pipe";
4182 if (_perldeps_cmd == NULL) {
4183 _perldeps_cmd =
rpmExpand(
"%{?_rpmds_perldeps_cmd}", NULL);
4185 if (!(_perldeps_cmd != NULL && *_perldeps_cmd ==
'/')) {
4187 _perldeps_cmd =
_free(_perldeps_cmd);
4199 fp = popen(cmd,
"r");
4205 while((f = fgets(buf, (
int)
sizeof(buf), fp)) != NULL) {
4209 buf[
sizeof(buf)-1] =
'\0';
4216 if (*f ==
'\0' || *f ==
'#')
4226 if (*f ==
'!') fe++;
4227 while (*fe && !
_isspace(*fe) && strchr(
"!<=>", *fe) == NULL)
4232 if (!(
xisalnum(f[0]) || strchr(
"/_%!", f[0]) != NULL)) {
4234 fprintf(stderr,
_(
"running \"%s\" pipe command\n"), cmd);
4235 fprintf(stderr,
_(
"%s:%d \"%s\" has invalid name. Skipping ...\n"),
4245 if (*f !=
'/' && *fe !=
'\0') {
4251 fprintf(stderr,
_(
"running \"%s\" pipe command\n"), cmd),
4252 fprintf(stderr,
_(
"%s:%d \"%s\" has no comparison operator. Skipping ...\n"),
4263 fprintf(stderr,
_(
"running \"%s\" pipe command\n"), cmd),
4265 fprintf(stderr,
_(
"\tline %d: No EVR comparison value found.\n Skipping ..."),
4267 fprintf(stderr,
_(
"%s:%d \"%s\" has no EVR string. Skipping ...\n"),
4284 Flags = (
evrFlags) (Flags | RPMSENSE_PROBE);
4293 if (fp != NULL) (void) pclose(fp);
4300 const char * AN = A->ns.N;
4301 const char * AA = A->ns.A;
4302 const char * BN = B->ns.N;
4303 const char * BA = B->ns.A;
4307 rc = strcmp(AN, BN);
4308 }
else if (AA && !BA) {
4309 rc = strncmp(AN, BN, (AA - AN)) || BN[AA - AN];
4311 rc = strcmp(AA, B->A);
4312 }
else if (!AA && BA) {
4313 rc = strncmp(AN, BN, (BA - BN)) || AN[BA - BN];
4315 rc = strcmp(BA, A->A);
4317 rc = strcmp(AN, BN);
4334 if (evr_tuple_order == NULL) {
4336 evr_tuple_order =
rpmExpand(
"%{?evr_tuple_order}", NULL);
4338 if (evr_tuple_order == NULL || evr_tuple_order[0] ==
'\0')
4339 evr_tuple_order =
xstrdup(
"EVR");
4341 assert(evr_tuple_order != NULL && evr_tuple_order[0] !=
'\0');
4349 const char *aDepend = (A->DNEVR != NULL ?
xstrdup(A->DNEVR+2) :
"");
4350 const char *bDepend = (B->DNEVR != NULL ?
xstrdup(B->DNEVR+2) :
"");
4355 int (*EVRcmp) (
const char *a,
const char *b);
4358 int set_version = 0;
4363 assert((
rpmdsFlags(B) & RPMSENSE_SENSEMASK) == B->ns.Flags);
4372 if (!(A->EVR && A->Flags && B->EVR && B->Flags))
4376 if (!(aFlags && bFlags))
4380 if (!(A->EVR[A->i] && *A->EVR[A->i] && B->EVR[B->i] && *B->EVR[B->i]))
4384 xx = (A->EVRparse ? A->EVRparse :
rpmEVRparse) (A->EVR[A->i], a);
4385 xx = (B->EVRparse ? B->EVRparse :
rpmEVRparse) (B->EVR[B->i], b);
4388 EVRcmp = (A->EVRcmp && B->EVRcmp && A->EVRcmp == B->EVRcmp)
4396 default:
continue;
break;
4399 if (a->F[ix] && *a->F[ix] && b->F[ix] && *b->F[ix]) {
4401 if (!strcmp(a->F[ix],
"set") && !strcmp(b->F[ix],
"set"))
4407 if (a->F[ix] && *a->F[ix] && atol(a->F[ix]) > 0) {
4408 if (!B->nopromote) {
4409 int lvl = (_rpmds_unspecified_epoch_noise
4411 rpmlog(lvl,
_(
"The \"B\" dependency needs an epoch (assuming same epoch as \"A\")\n\tA = \"%s\"\tB = \"%s\"\n"),
4417 if (b->F[ix] && *b->F[ix] && atol(b->F[ix]) > 0)
4420 case 'V': ix = RPMEVR_V;
break;
4421 case 'T': ix = RPMEVR_T;
break;
4422 case 'R': ix = RPMEVR_R;
break;
4423 case 'D': ix = RPMEVR_D;
break;
4425 #if defined(RPM_VENDOR_MANDRIVA) 4428 && *(b->F[ix]) ==
'\0')
4430 if (a->F[ix] && b->F[ix])
4432 if (a->F[ix] && *a->F[ix] && b->F[ix] && *b->F[ix])
4436 if (ix == RPMEVR_V && set_version) {
4438 sense = rpmsetCmp(a->F[ix], b->F[ix]);
4449 sense = -EVRcmp(a->F[ix], b->F[ix]);
4451 sense = EVRcmp(a->F[ix], b->F[ix]);
4457 a->str =
_free(a->str);
4458 b->str =
_free(b->str);
4462 result = (sense != 0);
4465 }
else if (sense > 0 && ((aFlags & RPMSENSE_LESS) || (bFlags & RPMSENSE_GREATER))) {
4467 }
else if (sense == 0 &&
4469 ((aFlags & RPMSENSE_LESS) && (bFlags & RPMSENSE_LESS)) ||
4470 ((aFlags & RPMSENSE_GREATER) && (bFlags & RPMSENSE_GREATER)))) {
4477 if (_noisy_range_comparison_debug_message)
4479 (result ?
_(
"YES") :
_(
"NO ")), aDepend, bDepend);
4480 aDepend =
_free(aDepend);
4481 bDepend =
_free(bDepend);
4498 const fnpyKey * suggestedKeys,
int adding)
4500 const char * Name =
rpmdsN(ds);
4506 if (ps == NULL)
return;
4508 if (Name == NULL) Name =
"?N?";
4509 if (EVR == NULL) EVR =
"?EVR?";
4510 if (DNEVR == NULL) DNEVR =
"? ?N? ?OP? ?EVR?";
4513 pkgNEVR, ds->Type, DNEVR+2);
4515 switch ((
unsigned)DNEVR[0]) {
4521 key = (suggestedKeys ? suggestedKeys[0] : NULL);
4522 rpmpsAppend(ps, type, pkgNEVR, key, NULL, NULL, DNEVR, adding);
4528 rpmds provides = NULL;
4534 if (req->EVR == NULL || req->Flags == NULL)
4537 switch(req->ns.Type) {
4540 if (!reqFlags || !req->EVR[req->i] || *req->EVR[req->i] ==
'\0')
4549 if (provides == NULL) {
4561 if (provides->EVR == NULL)
4566 if (provides != NULL)
4581 const char * pkgN, * V, * R;
4582 #ifdef RPM_VENDOR_MANDRIVA 4588 const char * pkgEVR;
4598 if (req->EVR == NULL || req->Flags == NULL)
4601 if (!(reqFlags && req->EVR[req->i] && *req->EVR[req->i]))
4609 if (pkgN == NULL) pkgN =
xstrdup(
"N");
4610 if (V == NULL) V =
xstrdup(
"V");
4611 if (R == NULL) R =
xstrdup(
"R");
4617 #if defined(RPM_VENDOR_MANDRIVA) 4620 D = (he->
p.
str ? he->
p.
str : NULL);
4624 if (V) nb += strlen(V);
4625 if (R) nb += strlen(R);
4626 #if defined(RPM_VENDOR_MANDRIVA) 4627 if (gotD) nb += strlen(D) + 1;
4629 pkgEVR = t = (
char *)
alloca(nb);
4632 sprintf(t,
"%d:", E);
4636 #if defined(RPM_VENDOR_MANDRIVA) 4660 if (ds->ns.str[0] ==
'!')
rpmds rpmdsSingle(rpmTag tagN, const char *N, const char *EVR, evrFlags Flags)
Create, load and initialize a dependency set of size 1.
static const char * suffix[]
evrFlags rpmdsFlags(const rpmds ds)
Return current dependency flags.
rpmds rpmdsInit(rpmds ds)
Initialize dependency set iterator.
rpmPRCO rpmdsFreePRCO(rpmPRCO PRCO)
Free dependency set(s) container.
miRE mireNew(rpmMireMode mode, int tag)
Create pattern container.
nsType rpmdsNSType(const rpmds ds)
Return dependency class type.
const char * rpmdsType(const rpmds ds)
Return current dependency type name.
enum nsType_e nsType
Dependency types.
static const char * rpmdsTagName(rpmTag tagN)
Return dependency set type string.
void rpmdsProblem(rpmps ps, const char *pkgNEVR, const rpmds ds, const fnpyKey *suggestedKeys, int adding)
Report a Requires: or Conflicts: dependency problem.
int rpmdsNoPromote(const rpmds ds)
Return current "Don't promote Epoch:" flag.
char * getenv(const char *name)
#define RPMELF_FLAG_SKIPREQUIRES
#define RPMSENSE_SENSEMASK
void * mireFreeAll(miRE mire, int nmire)
Destroy compiled patterns.
static void rpmdsFini(void *_ds)
void rpmpsAppend(rpmps ps, rpmProblemType type, const char *pkgNEVR, fnpyKey key, const char *dn, const char *bn, const char *altNEVR, rpmuint64_t ulong1)
Append a problem to current set of problems.
static int rpmdsSysinfoFile(rpmPRCO PRCO, const char *fn, rpmTag tagN)
Merge contents of a sysinfo tag file into sysinfo dependencies.
static int xisalnum(int c)
char * xstrdup(const char *str)
FD_t Fopen(const char *path, const char *_fmode)
fopen(3) clone.
int rpmdsNExclude(const rpmds ds)
Return no.
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
int rpmdsGetconf(rpmds *dsp, const char *path)
Load getconf provides into a dependency set.
void * rpmdsInclude(const rpmds ds)
Return dependency include patterns.
int mireRegcomp(miRE mire, const char *pattern)
Compile pattern match.
enum rpmProblemType_e rpmProblemType
Enumerate transaction set problem types.
const char * rpmdsNewN(rpmds ds)
Return N string, expanded if necessary.
const char * evr_tuple_order
int Stat(const char *path, struct stat *st)
stat(2) clone.
void * rpmdsExclude(const rpmds ds)
Return dependency exclude patterns.
void Globfree(void *_pglob)
globfree(3) clone.
rpmuint32_t rpmdsSetColor(const rpmds ds, rpmuint32_t color)
Set current dependency color.
rpmTag rpmdsTagN(const rpmds ds)
Return current dependency type.
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
int rpmEVRparse(const char *evrstr, EVR_t evr)
Split EVR string into epoch, version, and release components.
const char * rpmdsA(const rpmds ds)
Return current dependency arch.
static void rpmlog(int code, const char *fmt,...)
struct rpmps_s * rpmps
Transaction problems found while processing a transaction set/.
const char * rpmdsDNEVR(const rpmds ds)
Return current formatted dependency string.
int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote)
Compare package name-version-release from header with a single dependency.
struct rpmds_s * rpmds
Dependency tag sets from a header, so that a header can be discarded early.
struct rpmPRCO_s * rpmPRCO
Container for commonly extracted dependency set(s).
time_t rpmdsSetBT(const rpmds ds, time_t BT)
Set dependency build time.
rpmds rpmdsFree(rpmds ds)
Destroy a dependency set.
rpmsenseFlags rpmEVRflags(const char *op, const char **end)
Return comparison operator sense flags.
rpmTag tagValue(const char *tagstr)
Return tag value from name.
int rpmiobSlurp(const char *fn, rpmiob *iobp)
void * rpmdsSetEVRcmp(rpmds ds, int(*EVRcmp)(const char *a, const char *b))
Set EVR comparison function.
static const char * _sysinfo_tags[]
static void rpmdsNSAdd(rpmds *dsp, const char *NS, const char *N, const char *EVR, evrFlags Flags)
Merge a single provides, wrapping N as "NS(N)".
int rpmdsPipe(rpmds *dsp, rpmTag tagN, const char *cmd)
Load provides from a pipe into a dependency set.
enum evrFlags_e evrFlags
Dependency Attributes.
rpmPRCO rpmdsNewPRCO(Header h)
Create dependency set(s) container.
#define RPMSENSE_NOTEQUAL
miRE mireFree(miRE mire)
Free pattern container.
void * xcalloc(size_t nmemb, size_t size)
static const char * _getconf_path
rpmint32_t rpmdsResult(const rpmds ds)
Return current dependency comparison result.
int rpmdsSysinfo(rpmPRCO PRCO, const char *fn)
Load sysinfo dependencies into a dependency set.
time_t rpmdsBT(const rpmds ds)
Return dependency build time.
static const union _dbswap endian
int Glob(const char *pattern, int flags, int errfunc(const char *epath, int eerrno), void *_pglob)
glob(3) clone.
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
int rpmdsRpmlib(rpmds *dsp, void *tblp)
Load rpmlib provides into a dependency set.
int rpmdsCompare(const rpmds A, const rpmds B)
Compare two versioned dependency ranges, looking for overlap.
int argvCount(const ARGV_t argv)
Return no.
int rpmdsFind(rpmds ds, const rpmds ods)
Find a dependency set element using binary search.
void * rpmdsSetEVRparse(rpmds ds, int(*EVRparse)(const char *evrstr, EVR_t evr))
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
void rpmdsNotify(rpmds ds, const char *where, int rc)
Notify of results of dependency match.
const char * rpmdsEVR(const rpmds ds)
Return current dependency epoch-version-release.
const char * tagName(rpmTag tag)
Return tag name from value.
static int rpmdsCpuinfoCtagFlags(const char *name)
Return dependency format to use for a cpuinfo line.
static const char * _ldconfig_cache
int rpmdsNext(rpmds ds)
Return next dependency set iterator index.
Structure(s) used for dependency tag sets.
static const char * _perldeps_cmd
The FD_t File Handle data structure.
static int rpmdsNAcmp(rpmds A, rpmds B)
const char * rpmGenPath(const char *urlroot, const char *urlmdir, const char *urlfile)
Merge 3 args into path, any or all of which may be a url.
static struct rpmlibProvides_s rpmlibProvides[]
int argvAdd(ARGV_t *argvp, ARGstr_t val)
Add a string to an argv array.
rpmuint32_t rpmdsSetRefs(const rpmds ds, rpmuint32_t refs)
Set current dependency file refs.
int mireRegexec(miRE mire, const char *val, size_t vallen)
Execute pattern match.
Header headerFree(Header h)
Dereference a header instance.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
int rpmdsCount(const rpmds ds)
Return dependency set count.
static struct cpuinfo_s ctags[]
int rpmdsAnyMatchesDep(const Header h, const rpmds req, int nopromote)
Compare package provides dependencies from header with a single dependency.
char * rpmdsNewDNEVR(const char *dspfx, rpmds ds)
Return new formatted dependency string.
static rpmds rpmdsDup(const rpmds ods)
const char * rpmdsN(const rpmds ds)
Return current dependency name.
int Fclose(FD_t fd)
fclose(3) clone.
Header headerLink(Header h)
Reference a header instance.
static const struct _conf_s vars[]
const char * _sysinfo_path
int Ferror(FD_t fd)
ferror(3) clone.
const char * _cpuinfo_path
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
static int snprintf(char *buf, int nb, const char *fmt,...)
rpmds rpmdsLink(rpmds ds, const char *msg)
Reference a dependency set instance.
const char * featureDescription
int _rpmds_unspecified_epoch_noise
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
int rpmdsMerge(rpmds *dsp, rpmds ods)
Merge a dependency set maintaining (N,EVR,Flags) sorted order.
char * stpcpy(char *dest, const char *src)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
int headerNEVRA(Header h, const char **np, const char **ep, const char **vp, const char **rp, const char **ap)
Return name, epoch, version, release, arch strings from header.
int rpmdsCpuinfo(rpmds *dsp, const char *fn)
Load /proc/cpuinfo provides into a dependency set.
int rpmdsLdconfig(rpmPRCO PRCO, const char *fn)
Load /etc/ld.so.cache provides into a dependency set.
int(* rpmvercmp)(const char *a, const char *b)
Segmented string compare vector.
int rpmdsUname(rpmds *dsp, const struct utsname *un)
static const char * _ldconfig_cmd
int rpmdsSearch(rpmds ds, rpmds ods)
Search a sorted dependency set for an element that overlaps.
int rpmdsIx(const rpmds ds)
Return dependency set index.
int rpmdsMergePRCO(void *context, rpmds ds)
Merge provides/requires/conflicts/obsoletes dependencies.
int rpmdsMatch(const rpmds A, rpmds B)
Compare A against every member of B, looking for 1st match.
rpmuint32_t rpmdsColor(const rpmds ds)
Return current dependency color.
static int _noisy_range_comparison_debug_message
Enable noisy range comparison debugging message?
int rpmnsParse(const char *s, rpmns ns)
Expand and split NS(N).A string into namespace, name and arch components.
int rpmdsELF(const char *fn, int flags, int(*add)(void *context, rpmds ds), void *context)
Return a soname dependency constructed from an elf string.
static const char * rpmdsEVRorder(void)
Return precedence permutation string.
#define RPMELF_FLAG_SKIPPROVIDES
int rpmdsNInclude(const rpmds ds)
Return no.
rpmuint32_t rpmdsRefs(const rpmds ds)
Return current dependency file refs.
rpmds rpmdsNew(Header h, rpmTag tagN, int flags)
Create and load a dependency set.
int rpmdsSetNoPromote(rpmds ds, int nopromote)
Set "Don't promote Epoch:" flag.
int rpmdsSetIx(rpmds ds, int ix)
Set dependency set index.
static rpmds rpmdsGetPool(rpmioPool pool)
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
rpmds rpmdsThis(Header h, rpmTag tagN, evrFlags Flags)
Create, load and initialize a dependency for this header.
const char * _rpmns_N_at_A
static const char ** rpmdsDupArgv(const char **argv, int argc)
int rpmdsNegateRC(const rpmds ds, int rc)
Negate return code for negated comparisons.
rpmint32_t rpmdsSetResult(const rpmds ds, rpmint32_t result)
Set current dependency comparison result.
rpmds rpmdsFromPRCO(rpmPRCO PRCO, rpmTag tagN)
Retrieve a dependency set from container.