|
|
@@ -1,6 +1,6 @@
|
|
|
// -*- mode: cpp; mode: fold -*-
|
|
|
// Description /*{{{*/
|
|
|
-// $Id: apt-cdrom.cc,v 1.5 1998/11/28 08:39:46 jgg Exp $
|
|
|
+// $Id: apt-cdrom.cc,v 1.6 1998/11/29 01:19:20 jgg Exp $
|
|
|
/* ######################################################################
|
|
|
|
|
|
APT CDROM - Tool for handling APT's CDROM database.
|
|
|
@@ -14,10 +14,10 @@
|
|
|
#include <apt-pkg/cmndline.h>
|
|
|
#include <apt-pkg/error.h>
|
|
|
#include <apt-pkg/init.h>
|
|
|
-#include <apt-pkg/md5.h>
|
|
|
#include <apt-pkg/fileutl.h>
|
|
|
#include <apt-pkg/progress.h>
|
|
|
#include <apt-pkg/tagfile.h>
|
|
|
+#include <apt-pkg/cdromutl.h>
|
|
|
#include <strutl.h>
|
|
|
#include <config.h>
|
|
|
|
|
|
@@ -25,9 +25,6 @@
|
|
|
#include <fstream>
|
|
|
#include <vector>
|
|
|
#include <algorithm>
|
|
|
-#include <sys/wait.h>
|
|
|
-#include <sys/errno.h>
|
|
|
-#include <sys/vfs.h>
|
|
|
#include <sys/stat.h>
|
|
|
#include <fcntl.h>
|
|
|
#include <dirent.h>
|
|
|
@@ -35,134 +32,6 @@
|
|
|
#include <stdio.h>
|
|
|
/*}}}*/
|
|
|
|
|
|
-// UnmountCdrom - Unmount a cdrom /*{{{*/
|
|
|
-// ---------------------------------------------------------------------
|
|
|
-/* */
|
|
|
-bool UnmountCdrom(string Path)
|
|
|
-{
|
|
|
- int Child = fork();
|
|
|
- if (Child < -1)
|
|
|
- return _error->Errno("fork","Failed to fork");
|
|
|
-
|
|
|
- // The child
|
|
|
- if (Child == 0)
|
|
|
- {
|
|
|
- // Make all the fds /dev/null
|
|
|
- for (int I = 0; I != 10; I++)
|
|
|
- close(I);
|
|
|
- for (int I = 0; I != 3; I++)
|
|
|
- dup2(open("/dev/null",O_RDWR),I);
|
|
|
-
|
|
|
- const char *Args[10];
|
|
|
- Args[0] = "umount";
|
|
|
- Args[1] = Path.c_str();
|
|
|
- Args[2] = 0;
|
|
|
- execvp(Args[0],(char **)Args);
|
|
|
- exit(100);
|
|
|
- }
|
|
|
-
|
|
|
- // Wait for mount
|
|
|
- int Status = 0;
|
|
|
- while (waitpid(Child,&Status,0) != Child)
|
|
|
- {
|
|
|
- if (errno == EINTR)
|
|
|
- continue;
|
|
|
- return _error->Errno("waitpid","Couldn't wait for subprocess");
|
|
|
- }
|
|
|
-
|
|
|
- // Check for an error code.
|
|
|
- if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
|
|
|
- return false;
|
|
|
- return true;
|
|
|
-}
|
|
|
- /*}}}*/
|
|
|
-// MountCdrom - Mount a cdrom /*{{{*/
|
|
|
-// ---------------------------------------------------------------------
|
|
|
-/* We fork mount.. */
|
|
|
-bool MountCdrom(string Path)
|
|
|
-{
|
|
|
- int Child = fork();
|
|
|
- if (Child < -1)
|
|
|
- return _error->Errno("fork","Failed to fork");
|
|
|
-
|
|
|
- // The child
|
|
|
- if (Child == 0)
|
|
|
- {
|
|
|
- // Make all the fds /dev/null
|
|
|
- for (int I = 0; I != 10; I++)
|
|
|
- close(I);
|
|
|
- for (int I = 0; I != 3; I++)
|
|
|
- dup2(open("/dev/null",O_RDWR),I);
|
|
|
-
|
|
|
- const char *Args[10];
|
|
|
- Args[0] = "mount";
|
|
|
- Args[1] = Path.c_str();
|
|
|
- Args[2] = 0;
|
|
|
- execvp(Args[0],(char **)Args);
|
|
|
- exit(100);
|
|
|
- }
|
|
|
-
|
|
|
- // Wait for mount
|
|
|
- int Status = 0;
|
|
|
- while (waitpid(Child,&Status,0) != Child)
|
|
|
- {
|
|
|
- if (errno == EINTR)
|
|
|
- continue;
|
|
|
- return _error->Errno("waitpid","Couldn't wait for subprocess");
|
|
|
- }
|
|
|
-
|
|
|
- // Check for an error code.
|
|
|
- if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
|
|
|
- return false;
|
|
|
- return true;
|
|
|
-}
|
|
|
- /*}}}*/
|
|
|
-// IdentCdrom - Generate a unique string for this CD /*{{{*/
|
|
|
-// ---------------------------------------------------------------------
|
|
|
-/* We convert everything we hash into a string, this prevents byte size/order
|
|
|
- from effecting the outcome. */
|
|
|
-bool IdentCdrom(string CD,string &Res)
|
|
|
-{
|
|
|
- MD5Summation Hash;
|
|
|
-
|
|
|
- string StartDir = SafeGetCWD();
|
|
|
- if (chdir(CD.c_str()) != 0)
|
|
|
- return _error->Errno("chdir","Unable to change to %s",CD.c_str());
|
|
|
-
|
|
|
- DIR *D = opendir(".");
|
|
|
- if (D == 0)
|
|
|
- return _error->Errno("opendir","Unable to read %s",CD.c_str());
|
|
|
-
|
|
|
- // Run over the directory
|
|
|
- char S[300];
|
|
|
- for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D))
|
|
|
- {
|
|
|
- // Skip some files..
|
|
|
- if (strcmp(Dir->d_name,".") == 0 ||
|
|
|
- strcmp(Dir->d_name,"..") == 0)
|
|
|
- continue;
|
|
|
-
|
|
|
- sprintf(S,"%lu",Dir->d_ino);
|
|
|
- Hash.Add(S);
|
|
|
- Hash.Add(Dir->d_name);
|
|
|
- };
|
|
|
-
|
|
|
- chdir(StartDir.c_str());
|
|
|
- closedir(D);
|
|
|
-
|
|
|
- // Some stats from the fsys
|
|
|
- struct statfs Buf;
|
|
|
- if (statfs(CD.c_str(),&Buf) != 0)
|
|
|
- return _error->Errno("statfs","Failed to stat the cdrom");
|
|
|
-
|
|
|
- sprintf(S,"%u %u",Buf.f_blocks,Buf.f_bfree);
|
|
|
- Hash.Add(S);
|
|
|
-
|
|
|
- Res = Hash.Result().Value();
|
|
|
- return true;
|
|
|
-}
|
|
|
- /*}}}*/
|
|
|
-
|
|
|
// FindPackages - Find the package files on the CDROM /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* We look over the cdrom for package files. This is a recursive
|
|
|
@@ -689,6 +558,8 @@ bool CopyPackages(string CDROM,string Name,vector<string> &List)
|
|
|
|
|
|
if (NotFound + WrongSize > 10)
|
|
|
cout << "Alot of package entires were discarded, perhaps this CD is funny?" << endl;
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
|