]> git.saurik.com Git - apt.git/blame - cmdline/apt-cdrom.cc
use utimes instead of utimensat/futimens
[apt.git] / cmdline / apt-cdrom.cc
CommitLineData
83d89a9f
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
a3f6ea20 3// $Id: apt-cdrom.cc,v 1.45 2003/11/19 23:50:51 mdz Exp $
83d89a9f
AL
4/* ######################################################################
5
18444708
AL
6 APT CDROM - Tool for handling APT's CDROM database.
7
8 Currently the only option is 'add' which will take the current CD
9 in the drive and add it into the database.
83d89a9f
AL
10
11 ##################################################################### */
12 /*}}}*/
13// Include Files /*{{{*/
ea542140
DK
14#include<config.h>
15
83d89a9f
AL
16#include <apt-pkg/cmndline.h>
17#include <apt-pkg/error.h>
18#include <apt-pkg/init.h>
83d89a9f
AL
19#include <apt-pkg/fileutl.h>
20#include <apt-pkg/progress.h>
65ae8fab 21#include <apt-pkg/cdromutl.h>
cdcc6d34 22#include <apt-pkg/strutl.h>
a75c6a6e
MZ
23#include <apt-pkg/acquire.h>
24#include <apt-pkg/acquire-item.h>
25#include <apt-pkg/cdrom.h>
472ff00e
DK
26#include <apt-pkg/configuration.h>
27#include <apt-pkg/pkgsystem.h>
143abaeb 28
233c2b66 29#include <locale.h>
83d89a9f 30#include <iostream>
18444708 31#include <fstream>
83d89a9f
AL
32#include <vector>
33#include <algorithm>
83d89a9f
AL
34#include <sys/stat.h>
35#include <fcntl.h>
36#include <dirent.h>
37#include <unistd.h>
38#include <stdio.h>
ea542140 39
b9179170
MV
40#include <apt-private/private-cmndline.h>
41
ea542140 42#include <apti18n.h>
83d89a9f 43 /*}}}*/
0a83556b
MV
44static const char *W_NO_CDROM_FOUND = \
45 N_("No CD-ROM could be auto-detected or found using "
9d0c9e70
MV
46 "the default mount point.\n"
47 "You may try the --cdrom option to set the CD-ROM mount point. "
0a83556b 48 "See 'man apt-cdrom' for more "
9d0c9e70 49 "information about the CD-ROM auto-detection and mount point.");
83d89a9f 50
076d01b0
AL
51using namespace std;
52
92fcbfc1 53class pkgCdromTextStatus : public pkgCdromStatus /*{{{*/
83d89a9f 54{
a75c6a6e
MZ
55protected:
56 OpTextProgress Progress;
57 void Prompt(const char *Text);
58 string PromptLine(const char *Text);
59 bool AskCdromName(string &name);
60
61public:
62 virtual void Update(string text, int current);
63 virtual bool ChangeCdrom();
64 virtual OpProgress* GetOpProgress();
8a579291 65};
83d89a9f 66
a75c6a6e 67void pkgCdromTextStatus::Prompt(const char *Text)
83d89a9f 68{
a75c6a6e
MZ
69 char C;
70 cout << Text << ' ' << flush;
f52037d6 71 if (read(STDIN_FILENO,&C,1) < 0)
7dd5854b
MV
72 _error->Errno("pkgCdromTextStatus::Prompt",
73 "Failed to read from standard input (not a terminal?)");
a75c6a6e
MZ
74 if (C != '\n')
75 cout << endl;
83d89a9f 76}
4dfaa253 77
a75c6a6e 78string pkgCdromTextStatus::PromptLine(const char *Text)
83d89a9f 79{
a75c6a6e 80 cout << Text << ':' << endl;
83d89a9f 81
a75c6a6e
MZ
82 string Res;
83 getline(cin,Res);
83d89a9f
AL
84 return Res;
85}
18444708 86
a75c6a6e 87bool pkgCdromTextStatus::AskCdromName(string &name)
83d89a9f 88{
cdd5a135 89 cout << _("Please provide a name for this Disc, such as 'Debian 5.0.3 Disk 1'") << flush;
a75c6a6e 90 name = PromptLine("");
83d89a9f 91
83d89a9f
AL
92 return true;
93}
83d89a9f 94
83d89a9f 95
a75c6a6e 96void pkgCdromTextStatus::Update(string text, int current)
18444708 97{
a75c6a6e
MZ
98 if(text.size() > 0)
99 cout << text << flush;
18444708 100}
4dfaa253 101
8a579291 102bool pkgCdromTextStatus::ChangeCdrom()
83d89a9f 103{
4a5e5089 104 Prompt(_("Please insert a Disc in the drive and press enter"));
18444708
AL
105 return true;
106}
83d89a9f 107
8a579291 108OpProgress* pkgCdromTextStatus::GetOpProgress()
a75c6a6e
MZ
109{
110 return &Progress;
111};
83d89a9f 112 /*}}}*/
169413dc 113// SetupAutoDetect /*{{{*/
fb503892 114bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
169413dc
MV
115{
116 bool Debug = _config->FindB("Debug::Acquire::cdrom", false);
117
118 vector<struct CdromDevice> v = UdevCdroms.Scan();
119 if (i >= v.size())
120 return false;
121
122 if (Debug)
123 clog << "Looking at devce " << i
124 << " DeviveName: " << v[i].DeviceName
125 << " IsMounted: '" << v[i].Mounted << "'"
126 << " MountPoint: '" << v[i].MountPath << "'"
127 << endl;
128
129 if (v[i].Mounted)
130 {
131 // set the right options
132 _config->Set("Acquire::cdrom::mount", v[i].MountPath);
133 _config->Set("APT::CDROM::NoMount", true);
134 } else {
ffee221b 135 string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
fb503892 136 if (!FileExists(AptMountPoint))
ffee221b 137 mkdir(AptMountPoint.c_str(), 0750);
fb503892 138 if(MountCdrom(AptMountPoint, v[i].DeviceName) == false)
ffee221b 139 _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint.c_str());
fb503892 140 _config->Set("Acquire::cdrom::mount", AptMountPoint);
169413dc
MV
141 _config->Set("APT::CDROM::NoMount", true);
142 }
143 i++;
144
145 return true;
146}
147 /*}}}*/
83d89a9f
AL
148// DoAdd - Add a new CDROM /*{{{*/
149// ---------------------------------------------------------------------
4dfaa253
AL
150/* This does the main add bit.. We show some status and things. The
151 sequence is to mount/umount the CD, Ident it then scan it for package
152 files and reduce that list. Then we copy over the package files and
153 verify them. Then rewrite the database files */
83d89a9f
AL
154bool DoAdd(CommandLine &)
155{
169413dc 156 pkgUdevCdromDevices UdevCdroms;
a75c6a6e
MZ
157 pkgCdromTextStatus log;
158 pkgCdrom cdrom;
fb503892 159 bool res = true;
169413dc 160
4df70e75 161 bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
2ecf54d8 162 unsigned int count = 0;
169413dc 163 if (AutoDetect && UdevCdroms.Dlopen())
169413dc
MV
164 while (AutoDetectCdrom(UdevCdroms, count))
165 res &= cdrom.Add(&log);
0a83556b 166 if (count == 0) {
169413dc 167 res = cdrom.Add(&log);
0a83556b 168 if (res == false) {
4ff02882 169 _error->Error("%s", _(W_NO_CDROM_FOUND));
0a83556b
MV
170 }
171 }
169413dc 172
a75c6a6e 173 if(res)
4a5e5089 174 cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
169413dc 175
a75c6a6e 176 return res;
83d89a9f
AL
177}
178 /*}}}*/
b2e465d6
AL
179// DoIdent - Ident a CDROM /*{{{*/
180// ---------------------------------------------------------------------
181/* */
182bool DoIdent(CommandLine &)
183{
169413dc 184 pkgUdevCdromDevices UdevCdroms;
a75c6a6e
MZ
185 string ident;
186 pkgCdromTextStatus log;
187 pkgCdrom cdrom;
169413dc
MV
188 bool res = true;
189
190 bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
785412cf 191
2ecf54d8 192 unsigned int count = 0;
169413dc 193 if (AutoDetect && UdevCdroms.Dlopen())
169413dc
MV
194 while (AutoDetectCdrom(UdevCdroms, count))
195 res &= cdrom.Ident(ident, &log);
0a83556b
MV
196 if (count == 0) {
197 res = cdrom.Ident(ident, &log);
198 if (res == false) {
4ff02882 199 _error->Error("%s", _(W_NO_CDROM_FOUND));
0a83556b
MV
200 }
201 }
169413dc 202 return res;
b2e465d6
AL
203}
204 /*}}}*/
83d89a9f
AL
205// ShowHelp - Show the help screen /*{{{*/
206// ---------------------------------------------------------------------
207/* */
b9179170 208bool ShowHelp(CommandLine &)
83d89a9f 209{
9179f697 210 ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
5b28c804 211 COMMON_ARCH,__DATE__,__TIME__);
04aa15a8 212 if (_config->FindB("version") == true)
b9179170 213 return true;
b2e465d6
AL
214
215 cout <<
216 "Usage: apt-cdrom [options] command\n"
217 "\n"
218 "apt-cdrom is a tool to add CDROM's to APT's source list. The\n"
219 "CDROM mount point and device information is taken from apt.conf\n"
220 "and /etc/fstab.\n"
221 "\n"
222 "Commands:\n"
223 " add - Add a CDROM\n"
224 " ident - Report the identity of a CDROM\n"
225 "\n"
226 "Options:\n"
227 " -h This help text\n"
228 " -d CD-ROM mount point\n"
229 " -r Rename a recognized CD-ROM\n"
230 " -m No mounting\n"
231 " -f Fast mode, don't check package files\n"
232 " -a Thorough scan mode\n"
0a83556b 233 " --no-auto-detect Do not try to auto detect drive and mount point\n"
b2e465d6 234 " -c=? Read this configuration file\n"
a2884e32 235 " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
b2e465d6 236 "See fstab(5)\n";
b9179170 237 return true;
83d89a9f
AL
238}
239 /*}}}*/
92fcbfc1 240int main(int argc,const char *argv[]) /*{{{*/
83d89a9f 241{
83d89a9f
AL
242 CommandLine::Dispatch Cmds[] = {
243 {"add",&DoAdd},
b2e465d6 244 {"ident",&DoIdent},
b9179170 245 {"help",&ShowHelp},
83d89a9f 246 {0,0}};
67111687 247
b9179170
MV
248 std::vector<CommandLine::Args> Args = getCommandArgs("apt-cdrom", CommandLine::GetCommand(Cmds, argc, argv));
249
67111687
AL
250 // Set up gettext support
251 setlocale(LC_ALL,"");
252 textdomain(PACKAGE);
253
83d89a9f 254 // Parse the command line and initialize the package library
b9179170 255 CommandLine CmdL(Args.data(),_config);
b2e465d6
AL
256 if (pkgInitConfig(*_config) == false ||
257 CmdL.Parse(argc,argv) == false ||
258 pkgInitSystem(*_config,_system) == false)
83d89a9f
AL
259 {
260 _error->DumpErrors();
261 return 100;
262 }
263
264 // See if the help should be shown
5633a7c2 265 if (_config->FindB("help") == true || _config->FindB("version") == true ||
83d89a9f 266 CmdL.FileSize() == 0)
b9179170 267 return ShowHelp(CmdL);
a9a5908d
AL
268
269 // Deal with stdout not being a tty
c340d185 270 if (isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
a9a5908d 271 _config->Set("quiet","1");
83d89a9f
AL
272
273 // Match the operation
274 CmdL.DispatchArg(Cmds);
275
276 // Print any errors or warnings found during parsing
65beb572
DK
277 bool const Errors = _error->PendingError();
278 if (_config->FindI("quiet",0) > 0)
83d89a9f 279 _error->DumpErrors();
65beb572
DK
280 else
281 _error->DumpErrors(GlobalError::DEBUG);
282 return Errors == true ? 100 : 0;
83d89a9f 283}
92fcbfc1 284 /*}}}*/