X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/2adb5fda8c34d1eea3e94fe6d1d6c378144ccfad..54debba5d21783160e78706f6c21b274ca4b805b:/cmdline/apt-get.cc diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 3c03e0fa3..a161847c8 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: apt-get.cc,v 1.139 2003/08/22 01:51:01 mdz Exp $ +// $Id: apt-get.cc,v 1.156 2004/08/28 01:05:16 mdz Exp $ /* ###################################################################### apt-get - Cover for dpkg @@ -46,6 +46,7 @@ #include "acqprogress.h" #include +#include #include #include #include @@ -110,7 +111,7 @@ class CacheFile : public pkgCacheFile // YnPrompt - Yes No Prompt. /*{{{*/ // --------------------------------------------------------------------- /* Returns true on a Yes.*/ -bool YnPrompt() +bool YnPrompt(bool Default=true) { if (_config->FindB("APT::Get::Assume-Yes",false) == true) { @@ -125,7 +126,7 @@ bool YnPrompt() return false; if (strlen(response) == 0) - return true; + return Default; regex_t Pattern; int Res; @@ -269,7 +270,7 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now) // Compute a single dependency element (glob or) pkgCache::DepIterator Start; pkgCache::DepIterator End; - D.GlobOr(Start,End); + D.GlobOr(Start,End); // advances D if (Cache->IsImportantDep(End) == false) continue; @@ -356,7 +357,7 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now) /* */ void ShowNew(ostream &out,CacheFile &Cache) { - /* Print out a list of packages that are going to be removed extra + /* Print out a list of packages that are going to be installed extra to what the user asked */ string List; string VersionsList; @@ -417,7 +418,7 @@ void ShowKept(ostream &out,CacheFile &Cache) List += string(I.Name()) + " "; VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n"; } - ShowList(out,_("The following packages have been kept back"),List,VersionsList); + ShowList(out,_("The following packages have been kept back:"),List,VersionsList); } /*}}}*/ // ShowUpgraded - Show upgraded packages /*{{{*/ @@ -438,7 +439,7 @@ void ShowUpgraded(ostream &out,CacheFile &Cache) List += string(I.Name()) + " "; VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n"; } - ShowList(out,_("The following packages will be upgraded"),List,VersionsList); + ShowList(out,_("The following packages will be upgraded:"),List,VersionsList); } /*}}}*/ // ShowDowngraded - Show downgraded packages /*{{{*/ @@ -459,7 +460,7 @@ bool ShowDowngraded(ostream &out,CacheFile &Cache) List += string(I.Name()) + " "; VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n"; } - return ShowList(out,_("The following packages will be DOWNGRADED"),List,VersionsList); + return ShowList(out,_("The following packages will be DOWNGRADED:"),List,VersionsList); } /*}}}*/ // ShowHold - Show held but changed packages /*{{{*/ @@ -543,6 +544,7 @@ bool ShowEssential(ostream &out,CacheFile &Cache) return ShowList(out,_("WARNING: The following essential packages will be removed\n" "This should NOT be done unless you know exactly what you are doing!"),List,VersionsList); } + /*}}}*/ // Stats - Show some statistics /*{{{*/ // --------------------------------------------------------------------- @@ -629,7 +631,7 @@ bool CacheFile::CheckDeps(bool AllowBroken) // Check that the system is OK if (DCache->DelCount() != 0 || DCache->InstCount() != 0) - return _error->Error("Internal Error, non-zero counts"); + return _error->Error("Internal error, non-zero counts"); // Apply corrections for half-installed packages if (pkgApplyStatus(*DCache) == false) @@ -665,6 +667,49 @@ bool CacheFile::CheckDeps(bool AllowBroken) return true; } + +static bool CheckAuth(pkgAcquire& Fetcher) +{ + string UntrustedList; + for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I < Fetcher.ItemsEnd(); ++I) + { + if (!(*I)->IsTrusted()) + { + UntrustedList += string((*I)->ShortDesc()) + " "; + } + } + + if (UntrustedList == "") + { + return true; + } + + ShowList(c2out,_("WARNING: The following packages cannot be authenticated!"),UntrustedList,""); + + if (_config->FindB("APT::Get::AllowUnauthenticated",false) == true) + { + c2out << "Authentication warning overridden.\n"; + return true; + } + + if (_config->FindI("quiet",0) < 2 + && _config->FindB("APT::Get::Assume-Yes",false) == false) + { + c2out << _("Install these packages without verification [y/N]? ") << flush; + if (!YnPrompt(false)) + return _error->Error(_("Some packages could not be authenticated")); + + return true; + } + else if (_config->FindB("APT::Get::Force-Yes",false) == true) + { + return true; + } + + return _error->Error(_("There are problems and -y was used without --force-yes")); +} + + /*}}}*/ // InstallPackages - Actually download and install the packages /*{{{*/ @@ -672,7 +717,7 @@ bool CacheFile::CheckDeps(bool AllowBroken) /* This displays the informative messages describing what is going to happen and then calls the download routines */ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, - bool Saftey = true) + bool Safety = true) { if (_config->FindB("APT::Get::Purge",false) == true) { @@ -693,19 +738,19 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, if (ShwKept == true) ShowKept(c1out,Cache); Fail |= !ShowHold(c1out,Cache); - if (_config->FindB("APT::Get::Show-Upgraded",false) == true) + if (_config->FindB("APT::Get::Show-Upgraded",true) == true) ShowUpgraded(c1out,Cache); Fail |= !ShowDowngraded(c1out,Cache); if (_config->FindB("APT::Get::Download-Only",false) == false) Essential = !ShowEssential(c1out,Cache); Fail |= Essential; Stats(c1out,Cache); - + // Sanity check if (Cache->BrokenCount() != 0) { ShowBroken(c1out,Cache,false); - return _error->Error("Internal Error, InstallPackages was called with broken packages!"); + return _error->Error("Internal error, InstallPackages was called with broken packages!"); } if (Cache->DelCount() == 0 && Cache->InstCount() == 0 && @@ -714,7 +759,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, // No remove flag if (Cache->DelCount() != 0 && _config->FindB("APT::Get::Remove",true) == false) - return _error->Error(_("Packages need to be removed but Remove is disabled.")); + return _error->Error(_("Packages need to be removed but remove is disabled.")); // Run the simulator .. if (_config->FindB("APT::Get::Simulate") == true) @@ -724,7 +769,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, if (Res == pkgPackageManager::Failed) return false; if (Res != pkgPackageManager::Completed) - return _error->Error("Internal Error, Ordering didn't finish"); + return _error->Error("Internal error, Ordering didn't finish"); return true; } @@ -810,7 +855,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, return _error->Error(_("There are problems and -y was used without --force-yes")); } - if (Essential == true && Saftey == true) + if (Essential == true && Safety == true) { if (_config->FindB("APT::Get::Trivial-Only",false) == true) return _error->Error(_("Trivial Only specified but this is not a trivial operation.")); @@ -838,7 +883,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, if (_config->FindI("quiet",0) < 2 && _config->FindB("APT::Get::Assume-Yes",false) == false) { - c2out << _("Do you want to continue? [Y/n] ") << flush; + c2out << _("Do you want to continue [Y/n]? ") << flush; if (YnPrompt() == false) { @@ -859,6 +904,9 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, return true; } + if (!CheckAuth(Fetcher)) + return false; + /* Unlock the dpkg lock if we are not going to be doing an install after. */ if (_config->FindB("APT::Get::Download-Only",false) == true) @@ -942,7 +990,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true, if (Failed == true && PM->FixMissing() == false) { cerr << _("Unable to correct missing packages.") << endl; - return _error->Error(_("Aborting Install.")); + return _error->Error(_("Aborting install.")); } _system->UnLock(); @@ -1036,10 +1084,9 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache, else { ioprintf(c1out, - _("Package %s has no available version, but exists in the database.\n" - "This typically means that the package was mentioned in a dependency and\n" - "never uploaded, has been obsoleted or is not available with the contents\n" - "of sources.list\n"),Pkg.Name()); + _("Package %s is not available, but is referred to by another package.\n" + "This may mean that the package is missing, has been obsoleted, or\n" + "is only available from another source\n"),Pkg.Name()); string List; string VersionsList; @@ -1252,19 +1299,25 @@ bool DoUpdate(CommandLine &CmdL) AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); pkgAcquire Fetcher(&Stat); - // Populate it with the source selection - if (List.GetIndexes(&Fetcher) == false) - return false; // Just print out the uris an exit if the --print-uris flag was used if (_config->FindB("APT::Get::Print-URIs") == true) { + // Populate it with the source selection and get all Indexes + // (GetAll=true) + if (List.GetIndexes(&Fetcher,true) == false) + return false; + pkgAcquire::UriIterator I = Fetcher.UriBegin(); for (; I != Fetcher.UriEnd(); I++) cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' << I->Owner->FileSize << ' ' << I->Owner->MD5Sum() << endl; return true; } + + // Populate it with the source selection + if (List.GetIndexes(&Fetcher) == false) + return false; // Run it if (Fetcher.Run() == pkgAcquire::Failed) @@ -1316,7 +1369,7 @@ bool DoUpgrade(CommandLine &CmdL) if (pkgAllUpgrade(Cache) == false) { ShowBroken(c1out,Cache,false); - return _error->Error(_("Internal Error, AllUpgrade broke stuff")); + return _error->Error(_("Internal error, AllUpgrade broke stuff")); } return InstallPackages(Cache,true); @@ -1327,6 +1380,15 @@ bool DoUpgrade(CommandLine &CmdL) /* Install named packages */ bool DoInstall(CommandLine &CmdL) { + // Lock the list directory + FileFd Lock; + if (_config->FindB("Debug::NoLocking",false) == false) + { + Lock.Fd(GetLock(_config->FindDir("Dir::State::Lists") + "lock")); + if (_error->PendingError() == true) + return _error->Error(_("Unable to lock the list directory")); + } + CacheFile Cache; if (Cache.OpenForInstall() == false || Cache.CheckDeps(CmdL.FileSize() != 1) == false) @@ -1527,74 +1589,65 @@ bool DoInstall(CommandLine &CmdL) { pkgCache::PkgIterator I(Cache,Cache.List[J]); - /* Just look at the ones we want to install */ - if ((*Cache)[I].Install() == false) + /* Just look at the ones we want to install but skip all already selected */ + if ((*Cache)[I].Install() == false || (*Cache)[I].NewInstall() == true) continue; for (pkgCache::VerIterator V = I.VersionList(); V.end() == false; V++) - { - for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++) - { + { + for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; ) + { pkgCache::DepIterator Start; pkgCache::DepIterator End; - D.GlobOr(Start,End); + D.GlobOr(Start,End); // advances D /* * If this is a virtual package, we need to check the list of * packages that provide it and see if any of those are * installed */ - pkgCache::PrvIterator Prv = Start.TargetPkg().ProvidesList(); + bool providedBySomething = false; - for (; Prv.end() != true; Prv++) - if ((*Cache)[Prv.OwnerPkg()].InstVerIter(*Cache).end() == false) { + for (pkgCache::PrvIterator Prv = Start.TargetPkg().ProvidesList(); + Prv.end() != true; + Prv++) + if ((*Cache)[Prv.OwnerPkg()].InstVerIter(*Cache).end() == false) + { providedBySomething = true; break; } if (providedBySomething) continue; - do - { - if (Start->Type == pkgCache::Dep::Suggests) { + for(;;) + { + /* Skip if package is installed already, or is about to be */ + string target = string(Start.TargetPkg().Name()) + " "; - /* A suggests relations, let's see if we have it - installed already */ + if ((*Start.TargetPkg()).SelectedState == pkgCache::State::Install + || Cache[Start.TargetPkg()].Install()) + break; - string target = string(Start.TargetPkg().Name()) + " "; - if ((*Start.TargetPkg()).SelectedState == pkgCache::State::Install || Cache[Start.TargetPkg()].Install()) - break; - /* Does another package suggest it as well? If so, - don't print it twice */ - if (int(SuggestsList.find(target)) > -1) - break; + /* Skip if we already saw it */ + if (int(SuggestsList.find(target)) != -1 || int(RecommendsList.find(target)) != -1) + break; + + if (Start->Type == pkgCache::Dep::Suggests) { SuggestsList += target; SuggestsVersions += string(Cache[Start.TargetPkg()].CandVersion) + "\n"; } if (Start->Type == pkgCache::Dep::Recommends) { - - /* A recommends relation, let's see if we have it - installed already */ - - string target = string(Start.TargetPkg().Name()) + " "; - if ((*Start.TargetPkg()).SelectedState == pkgCache::State::Install || Cache[Start.TargetPkg()].Install()) - break; - - /* Does another package recommend it as well? If so, - don't print it twice */ - - if (int(RecommendsList.find(target)) > -1) - break; RecommendsList += target; - SuggestsVersions += string(Cache[Start.TargetPkg()].CandVersion) + "\n"; + RecommendsVersions += string(Cache[Start.TargetPkg()].CandVersion) + "\n"; } - if (Start == End) - break; - Start++; - } while (1); - } - } + + if (Start >= End) + break; + Start++; + } + } + } } ShowList(c1out,_("Suggested packages:"),SuggestsList,SuggestsVersions); ShowList(c1out,_("Recommended packages:"),RecommendsList,RecommendsVersions); @@ -1617,7 +1670,7 @@ bool DoDistUpgrade(CommandLine &CmdL) if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false) return false; - c0out << _("Calculating Upgrade... ") << flush; + c0out << _("Calculating upgrade... ") << flush; if (pkgDistUpgrade(*Cache) == false) { c0out << _("Failed") << endl; @@ -1690,7 +1743,7 @@ bool DoDSelectUpgrade(CommandLine &CmdL) if (Fix.Resolve() == false) { ShowBroken(c1out,Cache,false); - return _error->Error("Internal Error, problem resolver broke stuff"); + return _error->Error("Internal error, problem resolver broke stuff"); } } @@ -1698,7 +1751,7 @@ bool DoDSelectUpgrade(CommandLine &CmdL) if (pkgAllUpgrade(Cache) == false) { ShowBroken(c1out,Cache,false); - return _error->Error("Internal Error, problem resolver broke stuff"); + return _error->Error("Internal error, problem resolver broke stuff"); } return InstallPackages(Cache,false); @@ -1886,7 +1939,7 @@ bool DoSource(CommandLine &CmdL) if (_config->FindB("APT::Get::Simulate",false) == true) { for (unsigned I = 0; I != J; I++) - ioprintf(cout,_("Fetch Source %s\n"),Dsc[I].Package.c_str()); + ioprintf(cout,_("Fetch source %s\n"),Dsc[I].Package.c_str()); return true; } @@ -2052,7 +2105,7 @@ bool DoBuildDep(CommandLine &CmdL) rec.Package = Opts->Value; rec.Type = pkgSrcRecords::Parser::BuildDependIndep; rec.Op = 0; - BuildDeps.insert(BuildDeps.begin(), rec); + BuildDeps.push_back(rec); } if (BuildDeps.size() == 0) @@ -2065,8 +2118,18 @@ bool DoBuildDep(CommandLine &CmdL) unsigned int ExpectedInst = 0; vector ::iterator D; pkgProblemResolver Fix(Cache); + bool skipAlternatives = false; // skip remaining alternatives in an or group for (D = BuildDeps.begin(); D != BuildDeps.end(); D++) { + bool hasAlternatives = (((*D).Op & pkgCache::Dep::Or) == pkgCache::Dep::Or); + + if (skipAlternatives == true) + { + if (!hasAlternatives) + skipAlternatives = false; // end of or group + continue; + } + if ((*D).Type == pkgSrcRecords::Parser::BuildConflict || (*D).Type == pkgSrcRecords::Parser::BuildConflictIndep) { @@ -2088,16 +2151,21 @@ bool DoBuildDep(CommandLine &CmdL) else // BuildDep || BuildDepIndep { pkgCache::PkgIterator Pkg = Cache->FindPkg((*D).Package); + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << "Looking for " << (*D).Package << "...\n"; + if (Pkg.end() == true) { - // Check if there are any alternatives - if (((*D).Op & pkgCache::Dep::Or) != pkgCache::Dep::Or) - return _error->Error(_("%s dependency for %s cannot be satisfied " - "because the package %s cannot be found"), - Last->BuildDepType((*D).Type),Src.c_str(), - (*D).Package.c_str()); - // Try the next alternative - continue; + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " (not found)" << (*D).Package << endl; + + if (hasAlternatives) + continue; + + return _error->Error(_("%s dependency for %s cannot be satisfied " + "because the package %s cannot be found"), + Last->BuildDepType((*D).Type),Src.c_str(), + (*D).Package.c_str()); } /* @@ -2110,9 +2178,6 @@ bool DoBuildDep(CommandLine &CmdL) * this would require we do a Resolve cycle for each package we * add to the install list. Ugh */ - while (D != BuildDeps.end() && - (((*D).Op & pkgCache::Dep::Or) == pkgCache::Dep::Or)) - D++; /* * If this is a virtual package, we need to check the list of @@ -2120,9 +2185,11 @@ bool DoBuildDep(CommandLine &CmdL) * installed */ pkgCache::PrvIterator Prv = Pkg.ProvidesList(); - bool providedBySomething = !Prv.end(); for (; Prv.end() != true; Prv++) { + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " Checking provider " << Prv.OwnerPkg().Name() << endl; + if ((*Cache)[Prv.OwnerPkg()].InstVerIter(*Cache).end() == false) break; } @@ -2130,9 +2197,8 @@ bool DoBuildDep(CommandLine &CmdL) // Get installed version and version we are going to install pkgCache::VerIterator IV = (*Cache)[Pkg].InstVerIter(*Cache); - if (!providedBySomething || (*D).Version[0] != '\0') { - /* We either have a versioned dependency (so a provides won't do) - or nothing is providing this package */ + if ((*D).Version[0] != '\0') { + // Versioned dependency pkgCache::VerIterator CV = (*Cache)[Pkg].CandidateVerIter(*Cache); @@ -2142,25 +2208,77 @@ bool DoBuildDep(CommandLine &CmdL) break; } if (CV.end() == true) + if (hasAlternatives) + { + continue; + } + else + { return _error->Error(_("%s dependency for %s cannot be satisfied " "because no available versions of package %s " "can satisfy version requirements"), Last->BuildDepType((*D).Type),Src.c_str(), (*D).Package.c_str()); + } + } + else + { + // Only consider virtual packages if there is no versioned dependency + if (Prv.end() == false) + { + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " Is provided by installed package " << Prv.OwnerPkg().Name() << endl; + skipAlternatives = hasAlternatives; + continue; + } } - /* - * TODO: if we depend on a version lower than what we already have - * installed it is not clear what should be done; in practice - * this case should be rare, and right now nothing is - * done about it :-( - */ - if (Prv.end() == true && // Nothing provides it; and - (IV.end() == true || // It is not installed, or - Cache->VS().CheckDep(IV.VerStr(),(*D).Op,(*D).Version.c_str()) == false)) - // the version installed doesn't - // satisfy constraints - TryToInstall(Pkg,Cache,Fix,false,false,ExpectedInst); + if (IV.end() == false) + { + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " Is installed\n"; + + if (Cache->VS().CheckDep(IV.VerStr(),(*D).Op,(*D).Version.c_str()) == true) + { + skipAlternatives = hasAlternatives; + continue; + } + + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " ...but the installed version doesn't meet the version requirement\n"; + + if (((*D).Op & pkgCache::Dep::LessEq) == pkgCache::Dep::LessEq) + { + return _error->Error(_("Failed to satisfy %s dependency for %s: Installed package %s is too new"), + Last->BuildDepType((*D).Type), + Src.c_str(), + Pkg.Name()); + } + } + + + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " Trying to install " << (*D).Package << endl; + + if (TryToInstall(Pkg,Cache,Fix,false,false,ExpectedInst) == true) + { + // We successfully installed something; skip remaining alternatives + skipAlternatives = hasAlternatives; + continue; + } + else if (hasAlternatives) + { + if (_config->FindB("Debug::BuildDeps",false) == true) + cout << " Unsatisfiable, trying alternatives\n"; + continue; + } + else + { + return _error->Error(_("Failed to satisfy %s dependency for %s: %s"), + Last->BuildDepType((*D).Type), + Src.c_str(), + (*D).Package.c_str()); + } } } @@ -2170,8 +2288,7 @@ bool DoBuildDep(CommandLine &CmdL) // Now we check the state of the packages, if (Cache->BrokenCount() != 0) - return _error->Error(_("Some broken packages were found while trying to process build-dependencies.\n" - "You might want to run `apt-get -f install' to correct these.")); + return _error->Error(_("Build-dependencies for %s could not be satisfied."),*I); } if (InstallPackages(Cache, false, true) == false) @@ -2207,7 +2324,7 @@ bool ShowHelp(CommandLine &CmdL) if (_config->FindB("version") == true) { - cout << _("Supported Modules:") << endl; + cout << _("Supported modules:") << endl; for (unsigned I = 0; I != pkgVersioningSystem::GlobalListLen; I++) { @@ -2282,7 +2399,7 @@ bool ShowHelp(CommandLine &CmdL) " -b Build the source package after fetching it\n" " -V Show verbose version numbers\n" " -c=? Read this configuration file\n" - " -o=? Set an arbitary configuration option, eg -o dir::cache=/tmp\n" + " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n" "See the apt-get(8), sources.list(5) and apt.conf(5) manual\n" "pages for more information and options.\n" " This APT has Super Cow Powers.\n"); @@ -2301,7 +2418,7 @@ void GetInitialize() _config->Set("APT::Get::Assume-Yes",false); _config->Set("APT::Get::Fix-Broken",false); _config->Set("APT::Get::Force-Yes",false); - _config->Set("APT::Get::APT::Get::No-List-Cleanup",true); + _config->Set("APT::Get::List-Cleanup",true); } /*}}}*/ // SigWinch - Window size change signal handler /*{{{*/ @@ -2357,6 +2474,7 @@ int main(int argc,const char *argv[]) {0,"remove","APT::Get::Remove",0}, {0,"only-source","APT::Get::Only-Source",0}, {0,"arch-only","APT::Get::Arch-Only",0}, + {0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0}, {'c',"config-file",0,CommandLine::ConfigFile}, {'o',"option",0,CommandLine::ArbItem}, {0,0,0,0}}; @@ -2402,7 +2520,7 @@ int main(int argc,const char *argv[]) } // Deal with stdout not being a tty - if (ttyname(STDOUT_FILENO) == 0 && _config->FindI("quiet",0) < 1) + if (!isatty(STDOUT_FILENO) && _config->FindI("quiet",0) < 1) _config->Set("quiet","1"); // Setup the output streams