]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/cmndline.cc
improve CheckDropPrivsMustBeDisabled further
[apt.git] / apt-pkg / contrib / cmndline.cc
index 8cef8036872d38021760497580403ada8931c148..40365237e39dfce9f4445ebc01fa946458c7f652 100644 (file)
 #include <apt-pkg/error.h>
 #include <apt-pkg/strutl.h>
 
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <string>
+
 #include <apti18n.h>
                                                                        /*}}}*/
 using namespace std;
@@ -28,6 +33,9 @@ using namespace std;
 CommandLine::CommandLine(Args *AList,Configuration *Conf) : ArgList(AList), 
                                  Conf(Conf), FileList(0)
 {
+}
+CommandLine::CommandLine() : ArgList(NULL), Conf(NULL), FileList(0)
+{
 }
                                                                        /*}}}*/
 // CommandLine::~CommandLine - Destructor                              /*{{{*/
@@ -42,23 +50,26 @@ CommandLine::~CommandLine()
 char const * CommandLine::GetCommand(Dispatch const * const Map,
       unsigned int const argc, char const * const * const argv)
 {
-   // if there is a -- on the line there must be the word we search for around it
-   // as -- marks the end of the options, just not sure if the command can be
-   // considered an option or not, so accept both
+   // if there is a -- on the line there must be the word we search for either
+   // before it (as -- marks the end of the options) or right after it (as we can't
+   // decide if the command is actually an option, given that in theory, you could
+   // have parameters named like commands)
    for (size_t i = 1; i < argc; ++i)
    {
       if (strcmp(argv[i], "--") != 0)
         continue;
-      ++i;
-      if (i < argc)
+      // check if command is before --
+      for (size_t k = 1; k < i; ++k)
         for (size_t j = 0; Map[j].Match != NULL; ++j)
-           if (strcmp(argv[i], Map[j].Match) == 0)
+           if (strcmp(argv[k], Map[j].Match) == 0)
               return Map[j].Match;
-      i -= 2;
-      if (i != 0)
+      // see if the next token after -- is the command
+      ++i;
+      if (i < argc)
         for (size_t j = 0; Map[j].Match != NULL; ++j)
            if (strcmp(argv[i], Map[j].Match) == 0)
               return Map[j].Match;
+      // we found a --, but not a command
       return NULL;
    }
    // no --, so search for the first word matching a command
@@ -113,7 +124,7 @@ bool CommandLine::Parse(int argc,const char **argv)
            Args *A;
            for (A = ArgList; A->end() == false && A->ShortOpt != *Opt; A++);
            if (A->end() == true)
-              return _error->Error(_("Command line option '%c' [from %s] is not known."),*Opt,argv[I]);
+              return _error->Error(_("Command line option '%c' [from %s] is not understood in combination with the other options."),*Opt,argv[I]);
 
            if (HandleOpt(I,argc,argv,Opt,A) == false)
               return false;
@@ -138,7 +149,7 @@ bool CommandLine::Parse(int argc,const char **argv)
       {
          Opt = (const char*) memchr(Opt, '-', OptEnd - Opt);
         if (Opt == NULL)
-           return _error->Error(_("Command line option %s is not understood"),argv[I]);
+           return _error->Error(_("Command line option %s is not understood in combination with the other options"),argv[I]);
         Opt++;
         
         for (A = ArgList; A->end() == false &&
@@ -147,7 +158,7 @@ bool CommandLine::Parse(int argc,const char **argv)
 
         // Failed again..
         if (A->end() == true && OptEnd - Opt != 1)
-           return _error->Error(_("Command line option %s is not understood"),argv[I]);
+           return _error->Error(_("Command line option %s is not understood in combination with the other options"),argv[I]);
 
         // The option could be a single letter option prefixed by a no-..
         if (A->end() == true)
@@ -155,7 +166,7 @@ bool CommandLine::Parse(int argc,const char **argv)
            for (A = ArgList; A->end() == false && A->ShortOpt != *Opt; A++);
            
            if (A->end() == true)
-              return _error->Error(_("Command line option %s is not understood"),argv[I]);
+              return _error->Error(_("Command line option %s is not understood in combination with the other options"),argv[I]);
         }
         
         // The option is not boolean
@@ -293,7 +304,7 @@ bool CommandLine::HandleOpt(int &I,int argc,const char *argv[],
    // Look for an argument.
    while (1)
    {
-      // Look at preceeding text
+      // Look at preceding text
       char Buffer[300];
       if (Argument == 0)
       {
@@ -397,6 +408,7 @@ bool CommandLine::DispatchArg(Dispatch *Map,bool NoMatch)
 void CommandLine::SaveInConfig(unsigned int const &argc, char const * const * const argv)
 {
    char cmdline[100 + argc * 50];
+   memset(cmdline, 0, sizeof(cmdline));
    unsigned int length = 0;
    bool lastWasOption = false;
    bool closeQuote = false;