1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/target/rpm/RpmHeader.cc
18 #include "zypp/base/Logger.h"
19 #include "zypp/PathInfo.h"
21 #include "zypp/target/rpm/RpmHeader.h"
22 #include "zypp/CapFactory.h"
24 #warning FIXME this include
26 #include <y2pm/PkgDu.h>
35 ///////////////////////////////////////////////////////////////////
37 ///////////////////////////////////////////////////////////////////
40 // METHOD NAME : RpmHeader::RpmHeader
41 // METHOD TYPE : Constructor
45 RpmHeader::RpmHeader( Header h_r )
50 ///////////////////////////////////////////////////////////////////
53 // METHOD NAME : RpmHeader::RpmHeader
54 // METHOD TYPE : Constructor
56 RpmHeader::RpmHeader( BinHeader::Ptr & rhs )
61 ///////////////////////////////////////////////////////////////////
64 // METHOD NAME : RpmHeader::~RpmHeader
65 // METHOD TYPE : Destructor
69 RpmHeader::~RpmHeader()
73 ///////////////////////////////////////////////////////////////////
76 // METHOD NAME : RpmHeader::readPackage
77 // METHOD TYPE : constRpmHeaderPtr
79 RpmHeader::constPtr RpmHeader::readPackage( const Pathname & path_r,
80 VERIFICATION verification_r )
82 PathInfo file( path_r );
83 if ( ! file.isFile() ) {
84 ERR << "Not a file: " << file << endl;
88 FD_t fd = ::Fopen( file.asString().c_str(), "r.ufdio" );
89 if ( fd == 0 || ::Ferror(fd) ) {
90 ERR << "Can't open file for reading: " << file << " (" << ::Fstrerror(fd) << ")" << endl;
96 rpmts ts = ::rpmtsCreate();
97 unsigned vsflag = RPMVSF_DEFAULT;
98 if ( verification_r & NODIGEST )
99 vsflag |= _RPMVSF_NODIGESTS;
100 if ( verification_r & NOSIGNATURE )
101 vsflag |= _RPMVSF_NOSIGNATURES;
102 ::rpmtsSetVSFlags( ts, rpmVSFlags(vsflag) );
105 int res = ::rpmReadPackageFile( ts, fd, path_r.asString().c_str(), &nh );
107 ts = ::rpmtsFree(ts);
112 WAR << "Error reading header from " << path_r << " error(" << res << ")" << endl;
113 return (RpmHeader*)0;
116 RpmHeader::constPtr h( new RpmHeader( nh ) );
117 headerFree( nh ); // clear the reference set in ReadPackageFile
119 MIL << h << " from " << path_r << endl;
123 ///////////////////////////////////////////////////////////////////
126 // METHOD NAME : RpmHeader::dumpOn
127 // METHOD TYPE : ostream &
131 ostream & RpmHeader::dumpOn( ostream & str ) const
133 return BinHeader::dumpOn( str ) << '{' << tag_name() << "-" << tag_edition() << ( isSrc() ? ".src}" : "}");
137 ///////////////////////////////////////////////////////////////////
140 // METHOD NAME : RpmHeader::isSrc
141 // METHOD TYPE : bool
143 bool RpmHeader::isSrc() const
145 return has_tag( RPMTAG_SOURCEPACKAGE );
148 ///////////////////////////////////////////////////////////////////
151 // METHOD NAME : RpmHeader::tag_name
152 // METHOD TYPE : string
156 string RpmHeader::tag_name() const
158 return string( string_val( RPMTAG_NAME ) );
161 ///////////////////////////////////////////////////////////////////
164 // METHOD NAME : RpmHeader::tag_edition
165 // METHOD TYPE : Edition
169 Edition RpmHeader::tag_edition() const
171 return Edition( string_val( RPMTAG_VERSION ),
172 string_val( RPMTAG_RELEASE ),
173 string_val ( RPMTAG_EPOCH ));
176 ///////////////////////////////////////////////////////////////////
179 // METHOD NAME : RpmHeader::tag_arch
180 // METHOD TYPE : Arch
184 Arch RpmHeader::tag_arch() const
186 return Arch( string_val( RPMTAG_ARCH ) );
189 ///////////////////////////////////////////////////////////////////
192 // METHOD NAME : RpmHeader::tag_installtime
193 // METHOD TYPE : Date
197 Date RpmHeader::tag_installtime() const
199 return int_val( RPMTAG_INSTALLTIME );
202 ///////////////////////////////////////////////////////////////////
205 // METHOD NAME : RpmHeader::tag_buildtime
206 // METHOD TYPE : Date
210 Date RpmHeader::tag_buildtime() const
212 return int_val( RPMTAG_BUILDTIME );
215 ///////////////////////////////////////////////////////////////////
218 // METHOD NAME : RpmHeader::PkgRelList_val
219 // METHOD TYPE : unsigned
223 CapSet RpmHeader::PkgRelList_val( tag tag_r, bool pre, set<string> * freq_r ) const
227 int_32 kindFlags = 0;
228 int_32 kindVersion = 0;
231 case RPMTAG_REQUIRENAME:
232 kindFlags = RPMTAG_REQUIREFLAGS;
233 kindVersion = RPMTAG_REQUIREVERSION;
235 case RPMTAG_PROVIDENAME:
236 kindFlags = RPMTAG_PROVIDEFLAGS;
237 kindVersion = RPMTAG_PROVIDEVERSION;
239 case RPMTAG_OBSOLETENAME:
240 kindFlags = RPMTAG_OBSOLETEFLAGS;
241 kindVersion = RPMTAG_OBSOLETEVERSION;
243 case RPMTAG_CONFLICTNAME:
244 kindFlags = RPMTAG_CONFLICTFLAGS;
245 kindVersion = RPMTAG_CONFLICTVERSION;
248 INT << "Illegal RPMTAG_dependencyNAME " << tag_r << endl;
254 unsigned count = string_list( tag_r, names );
259 int_list( kindFlags, flags );
262 string_list( kindVersion, versions );
264 for ( unsigned i = 0; i < count; ++i ) {
266 string n( names[i] );
270 string v = versions[i];
278 switch ( f & RPMSENSE_SENSEMASK ) {
282 case RPMSENSE_LESS|RPMSENSE_EQUAL:
285 case RPMSENSE_GREATER:
288 case RPMSENSE_GREATER|RPMSENSE_EQUAL:
297 if ((pre && (f & RPMSENSE_PREREQ))
298 || ((! pre) && !(f & RPMSENSE_PREREQ)))
301 Capability cap = _f.parse(
302 ResTraits<Package>::kind,
314 ///////////////////////////////////////////////////////////////////
317 // METHOD NAME : RpmHeader::tag_provides
318 // METHOD TYPE : CapSet
322 CapSet RpmHeader::tag_provides( set<string> * freq_r ) const
324 return PkgRelList_val( RPMTAG_PROVIDENAME, false, freq_r );
327 ///////////////////////////////////////////////////////////////////
330 // METHOD NAME : RpmHeader::tag_requires
331 // METHOD TYPE : CapSet
335 CapSet RpmHeader::tag_requires( set<string> * freq_r ) const
337 return PkgRelList_val( RPMTAG_REQUIRENAME, false, freq_r );
340 ///////////////////////////////////////////////////////////////////
343 // METHOD NAME : RpmHeader::tag_requires
344 // METHOD TYPE : CapSet
348 CapSet RpmHeader::tag_prerequires( set<string> * freq_r ) const
350 return PkgRelList_val( RPMTAG_REQUIRENAME, true, freq_r );
353 ///////////////////////////////////////////////////////////////////
356 // METHOD NAME : RpmHeader::tag_conflicts
357 // METHOD TYPE : CapSet
361 CapSet RpmHeader::tag_conflicts( set<string> * freq_r ) const
363 return PkgRelList_val( RPMTAG_CONFLICTNAME, false, freq_r );
366 ///////////////////////////////////////////////////////////////////
369 // METHOD NAME : RpmHeader::tag_obsoletes
370 // METHOD TYPE : CapSet
374 CapSet RpmHeader::tag_obsoletes( set<string> * freq_r ) const
376 return PkgRelList_val( RPMTAG_OBSOLETENAME, false, freq_r );
379 ///////////////////////////////////////////////////////////////////
382 // METHOD NAME : RpmHeader::tag_size
383 // METHOD TYPE : ByteCount
387 ByteCount RpmHeader::tag_size() const
389 return int_val( RPMTAG_SIZE );
392 ///////////////////////////////////////////////////////////////////
395 // METHOD NAME : RpmHeader::tag_archivesize
396 // METHOD TYPE : ByteCount
400 ByteCount RpmHeader::tag_archivesize() const
402 return int_val( RPMTAG_ARCHIVESIZE );
405 ///////////////////////////////////////////////////////////////////
408 // METHOD NAME : RpmHeader::tag_summary
409 // METHOD TYPE : std::string
413 std::string RpmHeader::tag_summary() const
415 return string_val( RPMTAG_SUMMARY );
418 ///////////////////////////////////////////////////////////////////
421 // METHOD NAME : RpmHeader::tag_description
422 // METHOD TYPE : std::string
426 std::string RpmHeader::tag_description() const
428 return string_val( RPMTAG_DESCRIPTION );
431 ///////////////////////////////////////////////////////////////////
434 // METHOD NAME : RpmHeader::tag_group
435 // METHOD TYPE : std::string
439 std::string RpmHeader::tag_group() const
441 return string_val( RPMTAG_GROUP );
444 ///////////////////////////////////////////////////////////////////
447 // METHOD NAME : RpmHeader::tag_vendor
448 // METHOD TYPE : std::string
452 std::string RpmHeader::tag_vendor() const
454 return string_val( RPMTAG_VENDOR );
457 ///////////////////////////////////////////////////////////////////
460 // METHOD NAME : RpmHeader::tag_distribution
461 // METHOD TYPE : std::string
465 std::string RpmHeader::tag_distribution() const
467 return string_val( RPMTAG_DISTRIBUTION );
470 ///////////////////////////////////////////////////////////////////
473 // METHOD NAME : RpmHeader::tag_license
474 // METHOD TYPE : std::string
478 std::string RpmHeader::tag_license() const
480 return string_val( RPMTAG_LICENSE );
483 ///////////////////////////////////////////////////////////////////
486 // METHOD NAME : RpmHeader::tag_buildhost
487 // METHOD TYPE : std::string
491 std::string RpmHeader::tag_buildhost() const
493 return string_val( RPMTAG_BUILDHOST );
496 ///////////////////////////////////////////////////////////////////
499 // METHOD NAME : RpmHeader::tag_packager
500 // METHOD TYPE : std::string
504 std::string RpmHeader::tag_packager() const
506 return string_val( RPMTAG_PACKAGER );
509 ///////////////////////////////////////////////////////////////////
512 // METHOD NAME : RpmHeader::tag_url
513 // METHOD TYPE : std::string
517 std::string RpmHeader::tag_url() const
519 return string_val( RPMTAG_URL );
522 ///////////////////////////////////////////////////////////////////
525 // METHOD NAME : RpmHeader::tag_os
526 // METHOD TYPE : std::string
530 std::string RpmHeader::tag_os() const
532 return string_val( RPMTAG_OS );
535 ///////////////////////////////////////////////////////////////////
538 // METHOD NAME : RpmHeader::tag_prein
539 // METHOD TYPE : std::string
543 std::string RpmHeader::tag_prein() const
545 return string_val( RPMTAG_PREIN );
548 ///////////////////////////////////////////////////////////////////
551 // METHOD NAME : RpmHeader::tag_postin
552 // METHOD TYPE : std::string
556 std::string RpmHeader::tag_postin() const
558 return string_val( RPMTAG_POSTIN );
561 ///////////////////////////////////////////////////////////////////
564 // METHOD NAME : RpmHeader::tag_preun
565 // METHOD TYPE : std::string
569 std::string RpmHeader::tag_preun() const
571 return string_val( RPMTAG_PREUN );
574 ///////////////////////////////////////////////////////////////////
577 // METHOD NAME : RpmHeader::tag_postun
578 // METHOD TYPE : std::string
582 std::string RpmHeader::tag_postun() const
584 return string_val( RPMTAG_POSTUN );
587 ///////////////////////////////////////////////////////////////////
590 // METHOD NAME : RpmHeader::tag_sourcerpm
591 // METHOD TYPE : std::string
595 std::string RpmHeader::tag_sourcerpm() const
597 return string_val( RPMTAG_SOURCERPM );
600 ///////////////////////////////////////////////////////////////////
603 // METHOD NAME : RpmHeader::tag_filenames
604 // METHOD TYPE : std::list<std::string>
608 std::list<std::string> RpmHeader::tag_filenames() const
610 std::list<std::string> ret;
612 stringList basenames;
613 if ( string_list( RPMTAG_BASENAMES, basenames ) ) {
615 string_list( RPMTAG_DIRNAMES, dirnames );
617 int_list( RPMTAG_DIRINDEXES, dirindexes );
618 for ( unsigned i = 0; i < basenames.size(); ++ i ) {
619 ret.push_back( dirnames[dirindexes[i]] + basenames[i] );
626 ///////////////////////////////////////////////////////////////////
629 // METHOD NAME : RpmHeader::tag_changelog
630 // METHOD TYPE : Changelog
634 Changelog RpmHeader::tag_changelog() const
639 if ( int_list( RPMTAG_CHANGELOGTIME, times ) ) {
641 string_list( RPMTAG_CHANGELOGNAME, names );
643 string_list( RPMTAG_CHANGELOGTEXT, texts );
644 for ( unsigned i = 0; i < times.size(); ++ i ) {
645 ret.push_back( ChangelogEntry( times[i], names[i], texts[i] ) );
652 #warning FIXME disk usage data
654 ///////////////////////////////////////////////////////////////////
657 // METHOD NAME : RpmHeader::tag_du
658 // METHOD TYPE : PkgDu &
662 PkgDu & RpmHeader::tag_du( PkgDu & dudata_r ) const
665 stringList basenames;
666 if ( string_list( RPMTAG_BASENAMES, basenames ) ) {
668 string_list( RPMTAG_DIRNAMES, dirnames );
670 int_list( RPMTAG_DIRINDEXES, dirindexes );
673 int_list( RPMTAG_FILEDEVICES, filedevices );
675 int_list( RPMTAG_FILEINODES, fileinodes );
677 int_list( RPMTAG_FILESIZES, filesizes );
679 int_list( RPMTAG_FILEMODES, filemodes );
681 ///////////////////////////////////////////////////////////////////
682 // Create and collect Entries by index. devino_cache is used to
683 // filter out hardliks ( different name but same device and inode ).
684 ///////////////////////////////////////////////////////////////////
685 PathInfo::devino_cache trace;
686 vector<PkgDu::Entry> entries;
687 entries.resize( dirnames.size() );
688 for ( unsigned i = 0; i < dirnames.size(); ++i ) {
689 entries[i] = dirnames[i];
692 for ( unsigned i = 0; i < basenames.size(); ++ i ) {
693 PathInfo::stat_mode mode( filemodes[i] );
694 if ( mode.isFile() ) {
695 if ( trace.insert( filedevices[i], fileinodes[i] ) ) {
696 // Count full 1K blocks
697 entries[dirindexes[i]]._size += ByteCount( filesizes[i] ).fillBlock();
698 ++(entries[dirindexes[i]]._files);
700 // else: hardlink; already counted this device/inode
704 ///////////////////////////////////////////////////////////////////
705 // Crreate and collect by index Entries. DevInoTrace is used to
706 // filter out hardliks ( different name but same device and inode ).
707 ///////////////////////////////////////////////////////////////////
708 for ( unsigned i = 0; i < entries.size(); ++i ) {
709 if ( entries[i]._size ) {
710 dudata_r.add( entries[i] );
719 } // namespace target