1 // -*- mode: cpp; mode: fold -*-
3 // $Id: apt-cdrom.cc,v 1.45 2003/11/19 23:50:51 mdz Exp $
4 /* ######################################################################
6 APT CDROM - Tool for handling APT's CDROM database.
8 Currently the only option is 'add' which will take the current CD
9 in the drive and add it into the database.
11 ##################################################################### */
13 // Include Files /*{{{*/
16 #include <apt-pkg/cmndline.h>
17 #include <apt-pkg/error.h>
18 #include <apt-pkg/init.h>
19 #include <apt-pkg/fileutl.h>
20 #include <apt-pkg/progress.h>
21 #include <apt-pkg/cdromutl.h>
22 #include <apt-pkg/strutl.h>
23 #include <apt-pkg/acquire.h>
24 #include <apt-pkg/acquire-item.h>
25 #include <apt-pkg/cdrom.h>
26 #include <apt-pkg/configuration.h>
27 #include <apt-pkg/pkgsystem.h>
40 #include <apt-private/private-cmndline.h>
44 static const char *W_NO_CDROM_FOUND
= \
45 N_("No CD-ROM could be auto-detected or found using "
46 "the default mount point.\n"
47 "You may try the --cdrom option to set the CD-ROM mount point. "
48 "See 'man apt-cdrom' for more "
49 "information about the CD-ROM auto-detection and mount point.");
53 class pkgCdromTextStatus
: public pkgCdromStatus
/*{{{*/
56 OpTextProgress Progress
;
57 void Prompt(const char *Text
);
58 string
PromptLine(const char *Text
);
59 bool AskCdromName(string
&name
);
62 virtual void Update(string text
, int current
);
63 virtual bool ChangeCdrom();
64 virtual OpProgress
* GetOpProgress();
67 void pkgCdromTextStatus::Prompt(const char *Text
)
70 cout
<< Text
<< ' ' << flush
;
71 if (read(STDIN_FILENO
,&C
,1) < 0)
72 _error
->Errno("pkgCdromTextStatus::Prompt",
73 "Failed to read from standard input (not a terminal?)");
78 string
pkgCdromTextStatus::PromptLine(const char *Text
)
80 cout
<< Text
<< ':' << endl
;
87 bool pkgCdromTextStatus::AskCdromName(string
&name
)
89 cout
<< _("Please provide a name for this Disc, such as 'Debian 5.0.3 Disk 1'") << flush
;
90 name
= PromptLine("");
96 void pkgCdromTextStatus::Update(string text
, int current
)
99 cout
<< text
<< flush
;
102 bool pkgCdromTextStatus::ChangeCdrom()
104 Prompt(_("Please insert a Disc in the drive and press enter"));
108 OpProgress
* pkgCdromTextStatus::GetOpProgress()
113 // SetupAutoDetect /*{{{*/
114 bool AutoDetectCdrom(pkgUdevCdromDevices
&UdevCdroms
, unsigned int &i
)
116 bool Debug
= _config
->FindB("Debug::Acquire::cdrom", false);
118 vector
<struct CdromDevice
> v
= UdevCdroms
.Scan();
123 clog
<< "Looking at devce " << i
124 << " DeviveName: " << v
[i
].DeviceName
125 << " IsMounted: '" << v
[i
].Mounted
<< "'"
126 << " MountPoint: '" << v
[i
].MountPath
<< "'"
131 // set the right options
132 _config
->Set("Acquire::cdrom::mount", v
[i
].MountPath
);
133 _config
->Set("APT::CDROM::NoMount", true);
135 string AptMountPoint
= _config
->FindDir("Dir::Media::MountPath");
136 if (!FileExists(AptMountPoint
))
137 mkdir(AptMountPoint
.c_str(), 0750);
138 if(MountCdrom(AptMountPoint
, v
[i
].DeviceName
) == false)
139 _error
->Warning(_("Failed to mount '%s' to '%s'"), v
[i
].DeviceName
.c_str(), AptMountPoint
.c_str());
140 _config
->Set("Acquire::cdrom::mount", AptMountPoint
);
141 _config
->Set("APT::CDROM::NoMount", true);
148 // DoAdd - Add a new CDROM /*{{{*/
149 // ---------------------------------------------------------------------
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 */
154 bool DoAdd(CommandLine
&)
156 pkgUdevCdromDevices UdevCdroms
;
157 pkgCdromTextStatus log
;
161 bool AutoDetect
= _config
->FindB("Acquire::cdrom::AutoDetect", true);
162 unsigned int count
= 0;
163 if (AutoDetect
&& UdevCdroms
.Dlopen())
164 while (AutoDetectCdrom(UdevCdroms
, count
))
165 res
&= cdrom
.Add(&log
);
167 res
= cdrom
.Add(&log
);
169 _error
->Error("%s", _(W_NO_CDROM_FOUND
));
174 cout
<< _("Repeat this process for the rest of the CDs in your set.") << endl
;
179 // DoIdent - Ident a CDROM /*{{{*/
180 // ---------------------------------------------------------------------
182 bool DoIdent(CommandLine
&)
184 pkgUdevCdromDevices UdevCdroms
;
186 pkgCdromTextStatus log
;
190 bool AutoDetect
= _config
->FindB("Acquire::cdrom::AutoDetect");
192 unsigned int count
= 0;
193 if (AutoDetect
&& UdevCdroms
.Dlopen())
194 while (AutoDetectCdrom(UdevCdroms
, count
))
195 res
&= cdrom
.Ident(ident
, &log
);
197 res
= cdrom
.Ident(ident
, &log
);
199 _error
->Error("%s", _(W_NO_CDROM_FOUND
));
205 // ShowHelp - Show the help screen /*{{{*/
206 // ---------------------------------------------------------------------
208 bool ShowHelp(CommandLine
&)
210 ioprintf(cout
,_("%s %s for %s compiled on %s %s\n"),PACKAGE
,PACKAGE_VERSION
,
211 COMMON_ARCH
,__DATE__
,__TIME__
);
212 if (_config
->FindB("version") == true)
216 "Usage: apt-cdrom [options] command\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"
223 " add - Add a CDROM\n"
224 " ident - Report the identity of a CDROM\n"
227 " -h This help text\n"
228 " -d CD-ROM mount point\n"
229 " -r Rename a recognized CD-ROM\n"
231 " -f Fast mode, don't check package files\n"
232 " -a Thorough scan mode\n"
233 " --no-auto-detect Do not try to auto detect drive and mount point\n"
234 " -c=? Read this configuration file\n"
235 " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
240 int main(int argc
,const char *argv
[]) /*{{{*/
242 CommandLine::Dispatch Cmds
[] = {
248 std::vector
<CommandLine::Args
> Args
= getCommandArgs("apt-cdrom", CommandLine::GetCommand(Cmds
, argc
, argv
));
250 // Set up gettext support
251 setlocale(LC_ALL
,"");
254 // Parse the command line and initialize the package library
255 CommandLine
CmdL(Args
.data(),_config
);
256 if (pkgInitConfig(*_config
) == false ||
257 CmdL
.Parse(argc
,argv
) == false ||
258 pkgInitSystem(*_config
,_system
) == false)
260 _error
->DumpErrors();
264 // See if the help should be shown
265 if (_config
->FindB("help") == true || _config
->FindB("version") == true ||
266 CmdL
.FileSize() == 0)
267 return ShowHelp(CmdL
);
269 // Deal with stdout not being a tty
270 if (isatty(STDOUT_FILENO
) && _config
->FindI("quiet", -1) == -1)
271 _config
->Set("quiet","1");
273 // Match the operation
274 CmdL
.DispatchArg(Cmds
);
276 // Print any errors or warnings found during parsing
277 bool const Errors
= _error
->PendingError();
278 if (_config
->FindI("quiet",0) > 0)
279 _error
->DumpErrors();
281 _error
->DumpErrors(GlobalError::DEBUG
);
282 return Errors
== true ? 100 : 0;