// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: cdromutl.cc,v 1.4 1999/04/20 05:02:09 jgg Exp $
+// $Id: cdromutl.cc,v 1.9 1999/08/30 07:48:04 jgg Exp $
/* ######################################################################
CDROM Utilities - Some functions to manipulate CDROM mounts.
}
// 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;
+ return ExecWait(Child,"mount",true);
}
/*}}}*/
// MountCdrom - Mount a cdrom /*{{{*/
}
// 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;
+ return ExecWait(Child,"mount",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)
+bool IdentCdrom(string CD,string &Res,unsigned int Version)
{
MD5Summation Hash;
if (strcmp(Dir->d_name,".") == 0 ||
strcmp(Dir->d_name,"..") == 0)
continue;
-
- sprintf(S,"%lu",Dir->d_ino);
+
+ if (Version <= 1)
+ {
+ sprintf(S,"%lu",(unsigned long)Dir->d_ino);
+ }
+ else
+ {
+ struct stat Buf;
+ if (stat(Dir->d_name,&Buf) != 0)
+ continue;
+ sprintf(S,"%lu",Buf.st_mtime);
+ }
+
Hash.Add(S);
Hash.Add(Dir->d_name);
};
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");
-
- // We use a kilobyte block size to advoid overflow
- sprintf(S,"%u %u",Buf.f_blocks*(Buf.f_bsize/1024),
- Buf.f_bfree*(Buf.f_bsize/1024));
- Hash.Add(S);
+ if (_config->FindB("Debug::identcdrom",false) == false)
+ {
+ struct statfs Buf;
+ if (statfs(CD.c_str(),&Buf) != 0)
+ return _error->Errno("statfs","Failed to stat the cdrom");
+
+ // We use a kilobyte block size to advoid overflow
+ sprintf(S,"%lu %lu",(long)(Buf.f_blocks*(Buf.f_bsize/1024)),
+ (long)(Buf.f_bfree*(Buf.f_bsize/1024)));
+ Hash.Add(S);
+ sprintf(S,"-%u",Version);
+ }
+ else
+ sprintf(S,"-%u.debug",Version);
- Res = Hash.Result().Value();
+ Res = Hash.Result().Value() + S;
return true;
}
/*}}}*/