37 #define REPODATA_BLOCK 255
44 memset(data, 0,
sizeof (*data));
83 for (i = 0; i < data->
end - data->
start; i++)
87 for (i = 0; i < data->
nxattrs; i++)
113 if (i < repo->nrepodata - 1)
122 int state = data->
state;
141 for (keyid = 1; keyid < data->
nkeys; keyid++)
144 if ((key->
type == REPOKEY_TYPE_CONSTANT || key->
type == REPOKEY_TYPE_CONSTANTID) && key->
size != data->
keys[keyid].
size)
148 if (keyid == data->
nkeys)
170 #define SCHEMATA_BLOCK 31
171 #define SCHEMATADATA_BLOCK 255
196 for (sp = schema, len = 0, h = 0; *sp; len++)
201 cid = schematahash[h];
207 for (cid = 1; cid < data->
nschemata; cid++)
222 fprintf(stderr,
"schema2id: new schema\n");
241 #ifndef HAVE_STRCHRNUL
242 static inline const char *
strchrnul(
const char *str,
char x)
244 const char *p = strchr(str, x);
245 return p ? p : str + strlen(str);
256 while (*dir ==
'/' && dir[1] ==
'/')
258 if (*dir ==
'/' && !dir[1])
295 return suf ? suf :
"";
307 l += strlen(suf) + 1;
323 strncpy(p, comps, l);
336 static inline unsigned char *
340 for (; *keyp; keyp++)
345 static unsigned char *
348 int nentries, schema;
351 case REPOKEY_TYPE_FIXARRAY:
359 case REPOKEY_TYPE_FLEXARRAY:
379 static unsigned char *
389 for (i = 0; (k = *keyp++) != 0; i++)
394 while ((k = *keyp++) != 0)
411 static unsigned char *
424 if (off + len > key->
size)
435 static inline unsigned char *
438 unsigned char *dp = *dpp;
484 for (i = 0; i < data->
nkeys; i++)
487 if (i == data->
nkeys)
502 static inline unsigned char *
522 if (solvid < data->start || solvid >= data->
end)
533 static inline unsigned char *
537 Id schema, *keyp, *kp;
546 for (kp = keyp; *kp; kp++)
547 if (data->
keys[*kp].
name == keyname)
551 *keypp = key = data->
keys + *kp;
552 if (key->
type == REPOKEY_TYPE_DELETED)
554 if (key->
type == REPOKEY_TYPE_VOID || key->
type == REPOKEY_TYPE_CONSTANT || key->
type == REPOKEY_TYPE_CONSTANTID)
565 Id schema, *keyp, *kp;
571 for (kp = keyp; *kp; kp++)
572 if (data->
keys[*kp].
name == keyname)
587 if (key->
type == REPOKEY_TYPE_CONSTANTID)
589 if (key->
type != REPOKEY_TYPE_ID)
605 if (key->
type == REPOKEY_TYPE_STR)
606 return (
const char *)dp;
607 if (key->
type == REPOKEY_TYPE_CONSTANTID)
609 else if (key->
type == REPOKEY_TYPE_ID)
629 if (key->
type == REPOKEY_TYPE_NUM
630 || key->
type == REPOKEY_TYPE_U32
631 || key->
type == REPOKEY_TYPE_CONSTANT)
655 if (data->
keys[*keyp].
name == keyname && data->
keys[*keyp].
type == REPOKEY_TYPE_VOID)
660 const unsigned char *
685 if (key->
type != REPOKEY_TYPE_IDARRAY && key->
type != REPOKEY_TYPE_REL_IDARRAY)
724 case REPOKEY_TYPE_ID:
725 case REPOKEY_TYPE_CONSTANTID:
726 case REPOKEY_TYPE_IDARRAY:
734 for (s = kv->
str; *s >=
'a' && *s <=
'z'; s++)
736 if (*s ==
':' && s > kv->
str)
740 case REPOKEY_TYPE_STR:
742 case REPOKEY_TYPE_DIRSTRARRAY:
752 case REPOKEY_TYPE_MD5:
753 case REPOKEY_TYPE_SHA1:
754 case REPOKEY_TYPE_SHA256:
777 Id keyid, *kp, *keyp;
778 unsigned char *dp, *ddp;
808 for (kp = keyp; *kp; kp++)
809 if (data->
keys[*kp].
name == keyname)
819 while ((keyid = *keyp++) != 0)
822 key = data->
keys + keyid;
823 ddp =
get_data(data, key, &dp, *keyp ? 1 : 0);
825 if (key->
type == REPOKEY_TYPE_DELETED)
827 if (key->
type == REPOKEY_TYPE_FLEXARRAY || key->
type == REPOKEY_TYPE_FIXARRAY)
840 while (ddp && nentries > 0)
844 if (key->
type == REPOKEY_TYPE_FLEXARRAY || !kv.
entry)
847 kv.
str = (
char *)ddp;
848 stop = callback(cbdata, s, data, key, &kv);
862 kv.
str = (
char *)ddp;
863 stop = callback(cbdata, s, data, key, &kv);
877 stop = callback(cbdata, s, data, key, &kv);
880 while (!kv.
eof && !stop);
936 case SOLVABLE_VENDOR:
939 case SOLVABLE_PROVIDES:
942 case SOLVABLE_OBSOLETES:
945 case SOLVABLE_CONFLICTS:
948 case SOLVABLE_REQUIRES:
951 case SOLVABLE_RECOMMENDS:
954 case SOLVABLE_SUPPLEMENTS:
957 case SOLVABLE_SUGGESTS:
960 case SOLVABLE_ENHANCES:
981 ma->
error = regcomp((regex_t *)ma->
matchdata, match, REG_EXTENDED | REG_NOSUB | REG_NEWLINE | ((flags &
SEARCH_NOCASE) ? REG_ICASE : 0));
1010 if (!strcasestr(str, ma->
match))
1015 if (!strstr(str, ma->
match))
1022 if (strcasecmp(ma->
match, str))
1027 if (strcmp(ma->
match, str))
1034 if (strncasecmp(ma->
match, str, strlen(ma->
match)))
1039 if (strncmp(ma->
match, str, strlen(ma->
match)))
1044 l = strlen(str) - strlen(ma->
match);
1049 if (strcasecmp(ma->
match, str + l))
1054 if (strcmp(ma->
match, str + l))
1063 if (regexec((
const regex_t *)ma->
matchdata, str, 0, NULL, 0))
1077 if (strstr(str,
"bin/"))
1079 if (!strncmp(str,
"/etc/", 5))
1081 if (!strcmp(str,
"/usr/lib/sendmail"))
1117 memset(di, 0,
sizeof(*di));
1120 if (!pool || (repo && repo->
pool != pool))
1230 static inline unsigned char *
1237 for (keyp = di->
keyp; *keyp; keyp++)
1238 if (keys[*keyp].name == keyname)
1253 int needcomplete = 0;
1263 return needcomplete ? 1 : 0;
1264 for (j = 1; j < data->
nkeys; j++)
1265 if (data->
keys[j].
name != REPOSITORY_SOLVABLES && data->
keys[j].
name != SOLVABLE_FILELIST)
1267 return j == data->
nkeys && !needcomplete ? 0 : 1;
1327 if (!di->
dp || !*di->
keyp)
1341 if (di->
key->
type == REPOKEY_TYPE_DELETED)
1343 if (di->
key->
type == REPOKEY_TYPE_FIXARRAY || di->
key->
type == REPOKEY_TYPE_FLEXARRAY)
1403 if (di->
key->
name == REPOSITORY_SOLVABLES)
1444 di->
dp = (
unsigned char *)di->
kv.
str;
1446 memset(&di->
kv, 0,
sizeof(di->
kv));
1460 di->
ddp = (
unsigned char *)di->
kv.
str;
1484 if (!di->
idp || !di->
idp[0])
1510 if (di->
keyname && (di->
key->
type == REPOKEY_TYPE_FIXARRAY || di->
key->
type == REPOKEY_TYPE_FLEXARRAY))
1532 if (di->
kv.
eof == 2)
1594 switch (whence & ~DI_SEEK_STAY)
1599 if ((whence & DI_SEEK_STAY) != 0)
1616 di->
ddp = (
unsigned char *)di->
kv.
str;
1692 else if (di->
repoid >= 0)
1746 int new = p - data->
end + 1;
1750 memset(data->
attrs + old, 0,
new *
sizeof(
Id *));
1756 if (p < data->start)
1759 int new = data->
start - p;
1763 memmove(data->
attrs +
new, data->
attrs, old *
sizeof(
Id *));
1764 memset(data->
attrs, 0,
new *
sizeof(
Id *));
1779 if (data->
end <= end)
1781 if (data->
start >= end)
1785 for (i = 0; i < data->
end - data->
start; i++)
1795 for (i = end; i < data->
end; i++)
1813 data->
start = start;
1814 data->
end = start + num;
1825 #define REPODATA_ATTRS_BLOCK 31
1826 #define REPODATA_ATTRDATA_BLOCK 1023
1827 #define REPODATA_ATTRIDDATA_BLOCK 63
1853 return data->
xattrs - handle;
1855 if (handle < data->start || handle >= data->
end)
1876 for (pp = ap; *pp; pp += 2)
1881 if (overwrite || data->
keys[*pp].
type == REPOKEY_TYPE_DELETED)
1913 key.
type = REPOKEY_TYPE_ID;
1924 key.
type = REPOKEY_TYPE_NUM;
1940 key.
type = REPOKEY_TYPE_ID;
1951 key.
type = REPOKEY_TYPE_CONSTANT;
1952 key.
size = constant;
1962 key.
type = REPOKEY_TYPE_CONSTANTID;
1973 key.
type = REPOKEY_TYPE_VOID;
1985 l = strlen(str) + 1;
1987 key.
type = REPOKEY_TYPE_STR;
2003 key.
type = REPOKEY_TYPE_BINARY;
2008 if (len >= (1 << 14))
2010 if (len >= (1 << 28))
2011 *dp++ = (len >> 28) | 128;
2012 if (len >= (1 << 21))
2013 *dp++ = (len >> 21) | 128;
2014 *dp++ = (len >> 14) | 128;
2016 if (len >= (1 << 7))
2017 *dp++ = (len >> 7) | 128;
2020 memcpy(dp, buf, len);
2031 Id *ida, *pp, **ppp;
2047 for (; *pp; pp += 2)
2048 if (data->
keys[*pp].
name == keyname)
2051 if (!pp || !*pp || data->
keys[*pp].
type != keytype)
2069 for (ida = data->
attriddata + pp[1]; *ida; ida += entrysize)
2070 oldsize += entrysize;
2092 const unsigned char *str)
2113 unsigned char buf[64];
2118 if (l >
sizeof(buf) ||
sat_hex2bin(&str, buf, l) != l)
2134 static inline const char *
2137 const char *p, *evr =
id2str(pool, evrid);
2140 for (p = evr; *p >=
'0' && *p <=
'9'; p++)
2142 return p != evr && *p ==
':' ? p + 1 : evr;
2150 const char *str, *fp;
2157 if ((dir = strrchr(file,
'/')) != 0)
2168 if (l >= 2 && dir[0] ==
'.' && dir[1] ==
'/' && (l == 2 || dir[2] !=
'/'))
2173 if (l == 1 && dir[0] ==
'.')
2179 if (!strncmp(dir, str, l) && !str[l])
2185 char *dir2 = strdup(dir);
2194 if ((!l || !strncmp(fp, str, l)) && fp[l] ==
'-')
2199 if ((!l || !strncmp(fp, str, l)) && fp[l] ==
'.')
2204 if ((!l || !strncmp(fp, str, l)) && !strcmp(fp + l,
".rpm"))
2221 key.
type = REPOKEY_TYPE_IDARRAY;
2226 for (i = 0; i < q->
count; i++)
2236 fprintf(stderr,
"repodata_add_dirnumnum %d %d %d %d (%d)\n", solvid, dir, num, num2, data->
attriddatalen);
2252 l = strlen(str) + 1;
2259 fprintf(stderr,
"repodata_add_dirstr %d %d %s (%d)\n", solvid, dir, str, data->
attriddatalen);
2271 fprintf(stderr,
"repodata_add_idarray %d %d (%d)\n", solvid,
id, data->
attriddatalen);
2314 for (; *ap; ap += 2)
2315 if (data->
keys[*ap].
name == keyname)
2321 for (; *ap; ap += 2)
2323 if (data->
keys[*ap].
name == keyname)
2337 key.
type = REPOKEY_TYPE_DELETED;
2348 if (dest == src || !(keyp = data->
attrs[src - data->
start]))
2350 for (; *keyp; keyp += 2)
2359 if (dest == src || !(keyp = data->
attrs[src - data->
start]))
2361 for (; *keyp; keyp += 2)
2362 if (!keyidmap ||
MAPTST(keyidmap, keyp[0]))
2372 #define EXTDATA_BLOCK 1023
2390 *dp++ = (x >> 28) | 128;
2392 *dp++ = (x >> 21) | 128;
2393 *dp++ = (x >> 14) | 128;
2396 *dp++ = (x >> 7) | 128;
2405 x = (x & 63) | ((x & ~63) << 1);
2413 memcpy(xd->
buf + xd->
len, blob, len);
2429 unsigned int oldvincorelen = 0;
2436 oldvincorelen = xd->
len;
2440 case REPOKEY_TYPE_VOID:
2441 case REPOKEY_TYPE_CONSTANT:
2442 case REPOKEY_TYPE_CONSTANTID:
2444 case REPOKEY_TYPE_STR:
2447 case REPOKEY_TYPE_MD5:
2450 case REPOKEY_TYPE_SHA1:
2453 case REPOKEY_TYPE_SHA256:
2456 case REPOKEY_TYPE_ID:
2457 case REPOKEY_TYPE_NUM:
2458 case REPOKEY_TYPE_DIR:
2461 case REPOKEY_TYPE_BINARY:
2469 case REPOKEY_TYPE_IDARRAY:
2470 for (ida = data->
attriddata + val; *ida; ida++)
2473 case REPOKEY_TYPE_DIRNUMNUMARRAY:
2474 for (ida = data->
attriddata + val; *ida; ida += 3)
2481 case REPOKEY_TYPE_DIRSTRARRAY:
2482 for (ida = data->
attriddata + val; *ida; ida += 2)
2488 case REPOKEY_TYPE_FIXARRAY:
2492 for (ida = data->
attriddata + val; *ida; ida++)
2514 for (ida = data->
attriddata + val; *ida; ida++)
2524 case REPOKEY_TYPE_FLEXARRAY:
2527 for (ida = data->
attriddata + val; *ida; ida++)
2530 for (ida = data->
attriddata + val; *ida; ida++)
2544 kp = data->
xattrs[-*ida];
2558 oldvincorelen = xd->
len - oldvincorelen;
2568 Id schemaid, *schema, *sp, oldschema, *keyp, *keypstart, *seen;
2569 unsigned char *dp, *ndp;
2570 int newschema, oldcount;
2582 memset(&solvkey, 0,
sizeof(solvkey));
2583 solvkey.
name = REPOSITORY_SOLVABLES;
2584 solvkey.
type = REPOKEY_TYPE_FLEXARRAY;
2595 memset(&newincore, 0,
sizeof(newincore));
2603 for (entry = -1; entry < nentry; entry++)
2605 memset(seen, 0, data->
nkeys *
sizeof(
Id));
2614 fprintf(stderr,
"oldschema %d\n", oldschema);
2615 fprintf(stderr,
"schemata %d\n", data->
schemata[oldschema]);
2616 fprintf(stderr,
"schemadata %p\n", data->
schemadata);
2639 for (sp = keyp = schema; *sp; sp++)
2640 if (*sp != solvkeyid)
2645 seen[solvkeyid] = 0;
2649 for (; *keyp; keyp += 2)
2656 seen[*keyp] = keyp[1] + 1;
2658 if (entry < 0 && data->end != data->
start)
2672 schemaid = oldschema;
2691 for (keyp = keypstart; *keyp; keyp++)
2695 if (*keyp == solvkeyid)
2701 key = data->
keys + *keyp;
2718 if (seen[*keyp] == -1)
2727 else if (seen[*keyp])
2732 schema, key, seen[*keyp] - 1);
2736 if (entry >= 0 && data->
attrs && data->
attrs[entry])
2740 for (entry = 0; entry < data->
nxattrs; entry++)
2816 int datastart, dataend;
2818 repodataid = data - repo->
repodata;
2819 datastart = data->
start;
2820 dataend = data->
end;
2831 stubdataids =
sat_calloc(cnt,
sizeof(*stubdataids));
2832 for (i = 0; i < cnt; i++)
2835 if (dataend > datastart)
2837 stubdataids[i] = sdata - repo->
repodata;
2851 sdata = repo->
repodata + stubdataids[i++];
2857 case REPOKEY_TYPE_ID:
2860 case REPOKEY_TYPE_CONSTANTID:
2863 case REPOKEY_TYPE_STR:
2866 case REPOKEY_TYPE_VOID:
2869 case REPOKEY_TYPE_NUM:
2872 case REPOKEY_TYPE_MD5:
2873 case REPOKEY_TYPE_SHA1:
2874 case REPOKEY_TYPE_SHA256:
2877 case REPOKEY_TYPE_IDARRAY:
2879 if (di.
key->
name == REPOSITORY_KEYS)
2886 xkeyname = di.
kv.
id;
2889 xkey.
name = xkeyname;
2901 for (i = 0; i < cnt; i++)