]> git.saurik.com Git - apt.git/blob - apt-pkg/prettyprinters.cc
Fix buffer overflow in debListParser::VersionHash()
[apt.git] / apt-pkg / prettyprinters.cc
1 // Description /*{{{*/
2 /* ######################################################################
3
4 Provide pretty printers for pkgCache structs like PkgIterator
5
6 ##################################################################### */
7 /*}}}*/
8 // Include Files /*{{{*/
9 #include <config.h>
10
11 #include <apt-pkg/depcache.h>
12 #include <apt-pkg/prettyprinters.h>
13
14 #include <ostream>
15 #include <string>
16
17 /*}}}*/
18
19 std::ostream& operator<<(std::ostream& os, const APT::PrettyPkg& pp) /*{{{*/
20 {
21 if (pp.Pkg.end() == true)
22 return os << "invalid package";
23
24 auto state = (*pp.DepCache)[pp.Pkg];
25 std::string const current = (pp.Pkg.CurVersion() == 0 ? "none" : pp.Pkg.CurVersion());
26 std::string candidate = state.CandVersion;
27 if (candidate.empty())
28 candidate = "none";
29 std::string install = "none";
30 if (state.InstallVer != nullptr)
31 install = state.InstVerIter(*pp.DepCache).VerStr();
32
33 os << pp.Pkg.FullName(false) << " < " << current;
34 if (current != install && install != "none")
35 os << " -> " << install;
36 if (install != candidate && current != candidate)
37 os << " | " << candidate;
38 os << " @";
39 switch (pp.Pkg->SelectedState)
40 {
41 case pkgCache::State::Unknown: os << 'u'; break;
42 case pkgCache::State::Install: os << 'i'; break;
43 case pkgCache::State::Hold: os << 'h'; break;
44 case pkgCache::State::DeInstall: os << 'r'; break;
45 case pkgCache::State::Purge: os << 'p'; break;
46 default: os << 'X';
47 }
48 switch (pp.Pkg->InstState)
49 {
50 case pkgCache::State::Ok: break;
51 case pkgCache::State::ReInstReq: os << 'R'; break;
52 case pkgCache::State::HoldInst: os << 'H'; break;
53 case pkgCache::State::HoldReInstReq: os << "HR"; break;
54 default: os << 'X';
55 }
56 switch (pp.Pkg->CurrentState)
57 {
58 case pkgCache::State::NotInstalled: os << 'n'; break;
59 case pkgCache::State::ConfigFiles: os << 'c'; break;
60 case pkgCache::State::HalfInstalled: os << 'H'; break;
61 case pkgCache::State::UnPacked: os << 'U'; break;
62 case pkgCache::State::HalfConfigured: os << 'F'; break;
63 case pkgCache::State::TriggersAwaited: os << 'W'; break;
64 case pkgCache::State::TriggersPending: os << 'T'; break;
65 case pkgCache::State::Installed: os << 'i'; break;
66 default: os << 'X';
67 }
68 os << ' ';
69 if (state.Protect())
70 os << "p";
71 if (state.ReInstall())
72 os << "r";
73 if (state.Upgradable())
74 os << "u";
75 if (state.Marked)
76 os << "m";
77 if (state.Garbage)
78 os << "g";
79 if (state.NewInstall())
80 os << "N";
81 else if (state.Upgrade())
82 os << "U";
83 else if (state.Downgrade())
84 os << "D";
85 else if (state.Install())
86 os << "I";
87 else if (state.Purge())
88 os << "P";
89 else if (state.Delete())
90 os << "R";
91 else if (state.Held())
92 os << "H";
93 else if (state.Keep())
94 os << "K";
95 if (state.NowBroken())
96 os << " Nb";
97 else if (state.NowPolicyBroken())
98 os << " NPb";
99 if (state.InstBroken())
100 os << " Ib";
101 else if (state.InstPolicyBroken())
102 os << " IPb";
103 os << " >";
104 return os;
105 }
106 /*}}}*/
107 std::ostream& operator<<(std::ostream& os, const APT::PrettyDep& pd) /*{{{*/
108 {
109 if (unlikely(pd.Dep.end() == true))
110 return os << "invalid dependency";
111
112 pkgCache::PkgIterator P = pd.Dep.ParentPkg();
113 pkgCache::PkgIterator T = pd.Dep.TargetPkg();
114
115 os << (P.end() ? "invalid pkg" : P.FullName(false)) << " " << pd.Dep.DepType()
116 << " on " << APT::PrettyPkg(pd.DepCache, T);
117
118 if (pd.Dep->Version != 0)
119 os << " (" << pd.Dep.CompType() << " " << pd.Dep.TargetVer() << ")";
120
121 return os;
122 }
123 /*}}}*/