Woops
[ntk/apt.git] / methods / cdrom.cc
CommitLineData
f46e7681
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
9e0349cc 3// $Id: cdrom.cc,v 1.6 1998/12/22 07:52:05 jgg Exp $
f46e7681
AL
4/* ######################################################################
5
6 CDROM URI method for APT
7
8 ##################################################################### */
9 /*}}}*/
10// Include Files /*{{{*/
11#include <apt-pkg/acquire-method.h>
12#include <apt-pkg/cdromutl.h>
13#include <apt-pkg/error.h>
14#include <apt-pkg/configuration.h>
15#include <apt-pkg/fileutl.h>
16
17#include <sys/stat.h>
18#include <unistd.h>
19 /*}}}*/
20
21class CDROMMethod : public pkgAcqMethod
22{
23 Configuration Database;
f631d1ba 24 bool DatabaseLoaded;
f46e7681
AL
25 string CurrentID;
26
27 virtual bool Fetch(FetchItem *Itm);
28 string GetID(string Name);
29
30 public:
31
32 CDROMMethod();
33};
34
35// CDROMMethod::CDROMethod - Constructor /*{{{*/
36// ---------------------------------------------------------------------
37/* */
76d97c26 38CDROMMethod::CDROMMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly |
f631d1ba 39 SendConfig), DatabaseLoaded(false)
f46e7681 40{
f46e7681
AL
41};
42 /*}}}*/
43// CDROMMethod::GetID - Get the ID hash for /*{{{*/
44// ---------------------------------------------------------------------
45/* We search the configuration space for the name and then return the ID
46 tag associated with it. */
47string CDROMMethod::GetID(string Name)
48{
f631d1ba
AL
49 if (DatabaseLoaded == false)
50 {
51 // Read the database
52 string DFile = _config->FindFile("Dir::State::cdroms");
53 if (FileExists(DFile) == true)
54 {
55 if (ReadConfigFile(Database,DFile) == false)
56 {
57 _error->Error("Unable to read the cdrom database %s",
58 DFile.c_str());
33abc0e5 59 return string();
f631d1ba
AL
60 }
61 }
62 DatabaseLoaded = true;
63 }
64
65 const Configuration::Item *Top = Database.Tree("CD");
f46e7681
AL
66 for (; Top != 0;)
67 {
68 if (Top->Value == Name)
69 return Top->Tag;
70
71 Top = Top->Next;
72 }
73
74 return string();
75}
76 /*}}}*/
77// CDROMMethod::Fetch - Fetch a file /*{{{*/
78// ---------------------------------------------------------------------
79/* */
80bool CDROMMethod::Fetch(FetchItem *Itm)
81{
82 URI Get = Itm->Uri;
83 string File = Get.Path;
84 FetchResult Res;
85
86 /* All IMS queries are returned as a hit, CDROMs are readonly so
87 time stamps never change */
88 if (Itm->LastModified != 0)
89 {
90 Res.LastModified = Itm->LastModified;
91 Res.IMSHit = true;
92 URIDone(Res);
93 return true;
94 }
95
96 string ID = GetID(Get.Host);
9e0349cc
AL
97 if (_error->PendingError() == true)
98 return false;
f46e7681
AL
99
100 // All non IMS queries for package files fail.
f631d1ba 101 if (Itm->IndexFile == true || ID.empty() == true)
f46e7681
AL
102 {
103 Fail("Please use apt-cdrom to make this CD recognized by APT."
104 " apt-get update cannot be used to add new CDs");
9e0349cc 105 return true;
f46e7681
AL
106 }
107
108 // We already have a CD inserted, but it is the wrong one
109 if (CurrentID.empty() == false && ID != CurrentID)
110 {
111 Fail("Wrong CD",true);
9e0349cc 112 return true;
f46e7681
AL
113 }
114
115 string CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/");
76d97c26
AL
116 if (CDROM[0] == '.')
117 CDROM= SafeGetCWD() + '/' + CDROM;
f46e7681
AL
118 string NewID;
119 while (1)
120 {
121 if (IdentCdrom(CDROM,NewID) == false)
122 return false;
123
124 // A hit
125 if (NewID == ID)
126 break;
127
128 UnmountCdrom(CDROM);
018f1533
AL
129 if (MediaFail(Get.Host,CDROM) == false)
130 {
76d97c26
AL
131 CurrentID = "FAIL";
132 Fail("Wrong CD",true);
9e0349cc 133 return true;
018f1533
AL
134 }
135
f46e7681
AL
136 MountCdrom(CDROM);
137 }
138
139 // ID matches
140 if (NewID == ID)
141 {
142 Res.Filename = CDROM + File;
143 if (FileExists(Res.Filename) == false)
144 return _error->Error("File not found");
145
146 CurrentID = ID;
147 Res.LastModified = Itm->LastModified;
148 Res.IMSHit = true;
149 URIDone(Res);
150 return true;
151 }
152
153 return _error->Error("CDROM not found");
154}
155 /*}}}*/
156
157int main()
158{
159 CDROMMethod Mth;
160 return Mth.Run();
161}