solv_chksum_add($self, &stb.st_size, sizeof(stb.st_size));
solv_chksum_add($self, &stb.st_mtime, sizeof(stb.st_mtime));
}
+ void add_fstat(int fd) {
+ struct stat stb;
+ if (fstat(fd, &stb))
+ memset(&stb, 0, sizeof(stb));
+ solv_chksum_add($self, &stb.st_dev, sizeof(stb.st_dev));
+ solv_chksum_add($self, &stb.st_ino, sizeof(stb.st_ino));
+ solv_chksum_add($self, &stb.st_size, sizeof(stb.st_size));
+ solv_chksum_add($self, &stb.st_mtime, sizeof(stb.st_mtime));
+ }
SWIGCDATA raw() {
int l;
const unsigned char *b;
sub calc_cookie_fp {
my ($self, $fp) = @_;
my $chksum = solv::Chksum->new($solv::REPOKEY_TYPE_SHA256);
+ $chksum->add("1.1");
$chksum->add_fp($fp);
return $chksum->raw();
}
return $chksum->raw();
}
+sub calc_cookie_ext {
+ my ($self, $f, $cookie) = @_;
+ my $chksum = solv::Chksum->new($solv::REPOKEY_TYPE_SHA256);
+ $chksum->add("1.1");
+ $chksum->add($cookie);
+ $chksum->add_fstat(fileno($f)) if $f;
+ my $extcookie = $chksum->raw();
+ substr($extcookie, 0, 1) = chr(1) if ord(substr($extcookie, 0, 1)) == 0;
+ return $extcookie;
+}
+
sub cachepath {
my ($self, $ext) = @_;
my $path = $self->{'alias'};
return undef;
}
-sub genextcookie {
- my ($self, $f) = @_;
- my $chksum = solv::Chksum->new($solv::REPOKEY_TYPE_SHA256);
- $chksum->add($self->{'cookie'});
- if ($f) {
- my @s = stat($f);
- $chksum->add("@s");
- }
- my $extcookie = $chksum->raw();
- substr($extcookie, 0, 1) = chr(1) if ord(substr($extcookie, 0, 1)) == 0;
- $self->{'extcookie'} = $extcookie;
-}
-
sub writecachedrepo {
my ($self, $ext, $info) = @_;
mkdir("/var/cache/solv", 0755) unless -d "/var/cache/solv";
}
solv::xfclose($ff);
if ($self->{'type'} ne 'system' && !$ext) {
- $self->genextcookie($f) unless $self->{'extcookie'};
+ $self->{'extcookie'} ||= $self->calc_cookie_ext($f, $self->{'cookie'});
syswrite($f, $self->{'extcookie'});
}
syswrite($f, $ext ? $self->{'extcookie'} : $self->{'cookie'});
def calc_cookie_fp(fp):
chksum = solv.Chksum(solv.REPOKEY_TYPE_SHA256)
+ chksum.add("1.1");
chksum.add_fp(fp)
return chksum.raw()
+def calc_cookie_ext(f, cookie):
+ chksum = solv.Chksum(solv.REPOKEY_TYPE_SHA256)
+ chksum.add("1.1");
+ chksum.add(cookie)
+ if f:
+ chksum.add_fstat(f.fileno())
+ extcookie = chksum.raw()
+ # compatibility to c code
+ if ord(extcookie[0]) == 0:
+ extcookie[0] = chr(1)
+ return extcookie
+
class repo_generic(dict):
def __init__(self, name, type, attribs = {}):
for k in attribs:
return False
return True
- def genextcookie(self, f):
- chksum = solv.Chksum(solv.REPOKEY_TYPE_SHA256)
- chksum.add(self['cookie'])
- if f:
- stat = os.fstat(f.fileno())
- chksum.add(str(stat[ST_DEV]))
- chksum.add(str(stat[ST_INO]))
- chksum.add(str(stat[ST_SIZE]))
- chksum.add(str(stat[ST_MTIME]))
- extcookie = chksum.raw()
- # compatibility to c code
- if ord(extcookie[0]) == 0:
- extcookie[0] = chr(1)
- self['extcookie'] = extcookie
-
def writecachedrepo(self, ext, info=None):
try:
if not os.path.isdir("/var/cache/solv"):
self.handle.write_first_repodata(f)
if self.type != 'system' and not ext:
if 'extcookie' not in self:
- self.genextcookie(f)
+ self['extcookie'] = calc_cookie_ext(f, self['cookie'])
f.write(self['extcookie'])
if not ext:
f.write(self['cookie'])
def calc_cookie_fp(f)
chksum = Solv::Chksum.new(Solv::REPOKEY_TYPE_SHA256)
+ chksum.add("1.1")
chksum.add_fp(f)
return chksum.raw
end
return chksum.raw
end
+ def calc_cookie_ext(f, cookie)
+ chksum = Solv::Chksum.new(Solv::REPOKEY_TYPE_SHA256)
+ chksum.add("1.1")
+ chksum.add(cookie)
+ chksum.add_fstat(f.fileno) if f
+ extcookie = chksum.raw()
+ extcookie[0] = 1 if extcookie[0] == 0
+ return extcookie
+ end
+
def cachepath(ext = nil)
path = @name.sub(/^\./, '_')
path += ext ? "_#{ext}.solvx" : '.solv'
return true
end
- def genextcookie(f)
- chksum = Solv::Chksum.new(Solv::REPOKEY_TYPE_SHA256)
- chksum.add(@cookie)
- if f
- s = f.stat()
- chksum.add(s.dev.to_s)
- chksum.add(s.ino.to_s)
- chksum.add(s.size.to_s)
- chksum.add(s.mtime.to_s)
- end
- @extcookie = chksum.raw()
- @extcookie[0] = 1 if @extcookie[0] == 0
- end
-
def writecachedrepo(ext, info = nil)
begin
Dir::mkdir("/var/cache/solv", 0755) unless FileTest.directory?("/var/cache/solv")
Solv::xfclose(sf)
f.sysseek(0, IO::SEEK_END)
if @type != 'system' && !ext
- genextcookie(f) unless @extcookie
+ @extcookie = calc_cookie_ext(f, @cookie) unless @extcookie
f.syswrite(@extcookie)
end
f.syswrite(ext ? @extcookie : @cookie)
}
void
-calc_checksum_stat(struct stat *stb, Id chktype, unsigned char *out)
+calc_checksum_stat(struct stat *stb, Id chktype, unsigned *cookie, unsigned char *out)
{
void *h = solv_chksum_create(chktype);
solv_chksum_add(h, CHKSUM_IDENT, strlen(CHKSUM_IDENT));
+ if (cookie)
+ solv_chksum_add(h, cookie, 32);
solv_chksum_add(h, &stb->st_dev, sizeof(stb->st_dev));
solv_chksum_add(h, &stb->st_ino, sizeof(stb->st_ino));
solv_chksum_add(h, &stb->st_size, sizeof(stb->st_size));
/* we just need some unique ID */
struct stat stb;
if (!fstat(fileno(fp), &stb))
- {
- int i;
-
- calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, cinfo->extcookie);
- for (i = 0; i < 32; i++)
- cinfo->extcookie[i] ^= cookie[i];
- }
+ memset(&stb, 0, sizeof(stb));
+ calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, cookie, cinfo->extcookie);
if (cinfo->extcookie[0] == 0)
cinfo->extcookie[0] = 1;
}
printf("no installed database:");
memset(&stb, 0, sizeof(&stb));
#endif
- calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, installedcookie);
+ calc_checksum_stat(&stb, REPOKEY_TYPE_SHA256, 0, installedcookie);
if (usecachedrepo(repo, 0, installedcookie, 0))
printf(" cached\n");
else