Browse Source

Dsync merge
Author: jgg
Date: 1999-01-18 06:20:07 GMT
Dsync merge

Arch Librarian 22 years ago
parent
commit
7f25bdff3a

+ 8 - 3
apt-pkg/contrib/cmndline.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: cmndline.cc,v 1.7 1998/12/14 02:23:47 jgg Exp $
+// $Id: cmndline.cc,v 1.8 1999/01/18 06:20:07 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    Command Line Class - Sophisticated command line parser
    Command Line Class - Sophisticated command line parser
@@ -96,7 +96,6 @@ bool CommandLine::Parse(int argc,const char **argv)
 	 if (Opt == OptEnd)
 	 if (Opt == OptEnd)
 	    return _error->Error("Command line option %s is not understood",argv[I]);
 	    return _error->Error("Command line option %s is not understood",argv[I]);
 	 Opt++;
 	 Opt++;
-	 cout << Opt << endl;
 	 
 	 
 	 for (A = ArgList; A->end() == false &&
 	 for (A = ArgList; A->end() == false &&
 	      stringcasecmp(Opt,OptEnd,A->LongOpt) != 0; A++);
 	      stringcasecmp(Opt,OptEnd,A->LongOpt) != 0; A++);
@@ -205,7 +204,13 @@ bool CommandLine::HandleOpt(int &I,int argc,const char *argv[],
 	 return true;
 	 return true;
       }
       }
       
       
-      Conf->Set(A->ConfName,Argument);
+      const char *I = A->ConfName;
+      for (; *I != 0 && *I != ' '; I++);
+      if (*I == ' ')
+	 Conf->Set(string(A->ConfName,0,I-A->ConfName),string(I+1) + Argument);
+      else
+	 Conf->Set(A->ConfName,string(I) + Argument);
+	 
       return true;
       return true;
    }
    }
    
    

+ 1 - 2
apt-pkg/contrib/cmndline.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: cmndline.h,v 1.5 1998/12/14 02:23:47 jgg Exp $
+// $Id: cmndline.h,v 1.6 1999/01/18 06:20:07 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    Command Line Class - Sophisticated command line parser
    Command Line Class - Sophisticated command line parser
@@ -38,7 +38,6 @@
    
    
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
-// Header section: pkglib
 #ifndef PKGLIB_CMNDLINE_H
 #ifndef PKGLIB_CMNDLINE_H
 #define PKGLIB_CMNDLINE_H
 #define PKGLIB_CMNDLINE_H
 
 

+ 34 - 27
apt-pkg/contrib/configuration.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: configuration.cc,v 1.10 1998/11/05 07:21:43 jgg Exp $
+// $Id: configuration.cc,v 1.11 1999/01/18 06:20:07 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    Configuration Class
    Configuration Class
@@ -43,10 +43,17 @@ Configuration::Item *Configuration::Lookup(Item *Head,const char *S,
    int Res = 1;
    int Res = 1;
    Item *I = Head->Child;
    Item *I = Head->Child;
    Item **Last = &Head->Child;
    Item **Last = &Head->Child;
-   for (; I != 0; Last = &I->Next, I = I->Next)
-      if ((Res = stringcasecmp(I->Tag.begin(),I->Tag.end(),S,S + Len)) == 0)
-	 break;
    
    
+   // Empty strings match nothing. They are used for lists.
+   if (Len != 0)
+   {
+      for (; I != 0; Last = &I->Next, I = I->Next)
+	 if ((Res = stringcasecmp(I->Tag.begin(),I->Tag.end(),S,S + Len)) == 0)
+	    break;
+   }
+   else
+      for (; I != 0; Last = &I->Next, I = I->Next);
+      
    if (Res == 0)
    if (Res == 0)
       return I;
       return I;
    if (Create == false)
    if (Create == false)
@@ -73,7 +80,7 @@ Configuration::Item *Configuration::Lookup(const char *Name,bool Create)
    const char *End = Start + strlen(Name);
    const char *End = Start + strlen(Name);
    const char *TagEnd = Name;
    const char *TagEnd = Name;
    Item *Itm = Root;
    Item *Itm = Root;
-   for (; End - TagEnd > 2; TagEnd++)
+   for (; End - TagEnd >= 2; TagEnd++)
    {
    {
       if (TagEnd[0] == ':' && TagEnd[1] == ':')
       if (TagEnd[0] == ':' && TagEnd[1] == ':')
       {
       {
@@ -84,6 +91,13 @@ Configuration::Item *Configuration::Lookup(const char *Name,bool Create)
       }
       }
    }   
    }   
 
 
+   // This must be a trailing ::, we create unique items in a list
+   if (End - Start == 0)
+   {
+      if (Create == false)
+	 return 0;
+   }
+   
    Itm = Lookup(Itm,Start,End - Start,Create);
    Itm = Lookup(Itm,Start,End - Start,Create);
    return Itm;
    return Itm;
 }
 }
@@ -377,17 +391,11 @@ bool ReadConfigFile(Configuration &Conf,string FName)
 	       continue;
 	       continue;
 
 
 	    // Parse off the tag
 	    // Parse off the tag
-	    string::size_type Pos = LineBuffer.find(' ');
-	    if (Pos == string::npos)
-	    {
-	       if (TermChar == '{')
-		  Pos = LineBuffer.length();
-	       else
-		  return _error->Error("Syntax error %s:%u: Tag with no value",FName.c_str(),CurLine);
-	    }
+	    string Tag;
+	    const char *Pos = LineBuffer.c_str();
+	    if (ParseQuoteWord(Pos,Tag) == false)
+	       return _error->Error("Syntax error %s:%u: Malformed Tag",FName.c_str(),CurLine);	    
 	    
 	    
-	    string Tag = string(LineBuffer,0,Pos);
-
 	    // Go down a level
 	    // Go down a level
 	    if (TermChar == '{')
 	    if (TermChar == '{')
 	    {
 	    {
@@ -398,17 +406,16 @@ bool ReadConfigFile(Configuration &Conf,string FName)
 	       Tag = string();
 	       Tag = string();
 	    }
 	    }
 
 
-	    // We dont have a value to set
-	    if (Pos == LineBuffer.length())
-	    {
-	       LineBuffer = string();
-	       continue;
-	    }
-	    
 	    // Parse off the word
 	    // Parse off the word
 	    string Word;
 	    string Word;
-	    if (ParseCWord(LineBuffer.c_str()+Pos,Word) == false)
-	       return _error->Error("Syntax error %s:%u: Malformed value",FName.c_str(),CurLine);
+	    if (ParseCWord(Pos,Word) == false)
+	    {
+	       if (TermChar != '{')
+	       {
+		  Word = Tag;
+		  Tag = "";
+	       }	       
+	    }
 	    
 	    
 	    // Generate the item name
 	    // Generate the item name
 	    string Item;
 	    string Item;
@@ -416,10 +423,10 @@ bool ReadConfigFile(Configuration &Conf,string FName)
 	       Item = Tag;
 	       Item = Tag;
 	    else
 	    else
 	    {
 	    {
-	       if (Tag.empty() == true)
-		  Item = ParentTag;
-	       else
+	       if (TermChar != '{' || Tag.empty() == false)
 		  Item = ParentTag + "::" + Tag;
 		  Item = ParentTag + "::" + Tag;
+	       else
+		  Item = ParentTag;
 	    }
 	    }
 	    
 	    
 	    // Set the item in the configuration class
 	    // Set the item in the configuration class

+ 7 - 3
apt-pkg/contrib/configuration.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: configuration.h,v 1.8 1998/11/04 07:11:12 jgg Exp $
+// $Id: configuration.h,v 1.9 1999/01/18 06:20:07 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    Configuration Class
    Configuration Class
@@ -14,13 +14,17 @@
    And has associated with it a text string. The Configuration class only
    And has associated with it a text string. The Configuration class only
    provides storage and lookup for this tree, other classes provide
    provides storage and lookup for this tree, other classes provide
    configuration file formats (and parsers/emitters if needed).
    configuration file formats (and parsers/emitters if needed).
-   
+
    Most things can get by quite happily with,
    Most things can get by quite happily with,
      cout << _config->Find("Foo::Bar") << endl;
      cout << _config->Find("Foo::Bar") << endl;
+
+   A special extension, support for ordered lists is provided by using the
+   special syntax, "block::list::" the trailing :: designates the 
+   item as a list. To access the list you must use the tree function on
+   "block::list".
    
    
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
-// Header section: pkglib
 #ifndef PKGLIB_CONFIGURATION_H
 #ifndef PKGLIB_CONFIGURATION_H
 #define PKGLIB_CONFIGURATION_H
 #define PKGLIB_CONFIGURATION_H
 
 

+ 8 - 7
apt-pkg/contrib/error.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: error.cc,v 1.5 1998/09/18 02:42:40 jgg Exp $
+// $Id: error.cc,v 1.6 1999/01/18 06:20:07 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    Global Erorr Class - Global error mechanism
    Global Erorr Class - Global error mechanism
@@ -80,8 +80,9 @@ bool GlobalError::Errno(const char *Function,const char *Description,...)
 
 
    // sprintf the description
    // sprintf the description
    char S[400];
    char S[400];
-   vsprintf(S,Description,args);
-   sprintf(S + strlen(S)," - %s (%i %s)",Function,errno,strerror(errno));
+   vsnprintf(S,sizeof(S),Description,args);
+   snprintf(S + strlen(S),sizeof(S) - strlen(S),
+	    " - %s (%i %s)",Function,errno,strerror(errno));
 
 
    // Put it on the list
    // Put it on the list
    Item *Itm = new Item;
    Item *Itm = new Item;
@@ -108,8 +109,8 @@ bool GlobalError::WarningE(const char *Function,const char *Description,...)
 
 
    // sprintf the description
    // sprintf the description
    char S[400];
    char S[400];
-   vsprintf(S,Description,args);
-   sprintf(S + strlen(S)," - %s (%i %s)",Function,errno,strerror(errno));
+   vsnprintf(S,sizeof(S),Description,args);
+   snprintf(S + strlen(S),sizeof(S) - strlen(S)," - %s (%i %s)",Function,errno,strerror(errno));
 
 
    // Put it on the list
    // Put it on the list
    Item *Itm = new Item;
    Item *Itm = new Item;
@@ -130,7 +131,7 @@ bool GlobalError::Error(const char *Description,...)
 
 
    // sprintf the description
    // sprintf the description
    char S[400];
    char S[400];
-   vsprintf(S,Description,args);
+   vsnprintf(S,sizeof(S),Description,args);
 
 
    // Put it on the list
    // Put it on the list
    Item *Itm = new Item;
    Item *Itm = new Item;
@@ -153,7 +154,7 @@ bool GlobalError::Warning(const char *Description,...)
 
 
    // sprintf the description
    // sprintf the description
    char S[400];
    char S[400];
-   vsprintf(S,Description,args);
+   vsnprintf(S,sizeof(S),Description,args);
 
 
    // Put it on the list
    // Put it on the list
    Item *Itm = new Item;
    Item *Itm = new Item;

+ 1 - 2
apt-pkg/contrib/error.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: error.h,v 1.5 1998/09/18 02:42:41 jgg Exp $
+// $Id: error.h,v 1.6 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    Global Erorr Class - Global error mechanism
    Global Erorr Class - Global error mechanism
@@ -37,7 +37,6 @@
    
    
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
-// Header section: pkglib
 #ifndef PKGLIB_ERROR_H
 #ifndef PKGLIB_ERROR_H
 #define PKGLIB_ERROR_H
 #define PKGLIB_ERROR_H
 
 

+ 16 - 2
apt-pkg/contrib/fileutl.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: fileutl.cc,v 1.16 1998/11/27 04:20:52 jgg Exp $
+// $Id: fileutl.cc,v 1.17 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    File Utilities
    File Utilities
@@ -102,8 +102,11 @@ string SafeGetCWD()
    // Stash the current dir.
    // Stash the current dir.
    char S[300];
    char S[300];
    S[0] = 0;
    S[0] = 0;
-   if (getcwd(S,sizeof(S)) == 0)
+   if (getcwd(S,sizeof(S)-2) == 0)
       return "/";
       return "/";
+   unsigned int Len = strlen(S);
+   S[Len] = '/';
+   S[Len+1] = 0;
    return S;
    return S;
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -263,6 +266,17 @@ bool FileFd::Seek(unsigned long To)
    return true;
    return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
+// FileFd::Tell - Current seek position					/*{{{*/
+// ---------------------------------------------------------------------
+/* */
+unsigned long FileFd::Tell()
+{
+   off_t Res = lseek(iFd,0,SEEK_CUR);
+   if (Res == (off_t)-1)
+      _error->Errno("lseek","Failed to determine the current file position");
+   return Res;
+}
+									/*}}}*/
 // FileFd::Size - Return the size of the file				/*{{{*/
 // FileFd::Size - Return the size of the file				/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */

+ 2 - 2
apt-pkg/contrib/fileutl.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: fileutl.h,v 1.11 1998/12/08 05:24:43 jgg Exp $
+// $Id: fileutl.h,v 1.12 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    File Utilities
    File Utilities
@@ -18,7 +18,6 @@
    
    
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
-// Header section: pkglib
 #ifndef PKGLIB_FILEUTL_H
 #ifndef PKGLIB_FILEUTL_H
 #define PKGLIB_FILEUTL_H
 #define PKGLIB_FILEUTL_H
 
 
@@ -43,6 +42,7 @@ class FileFd
    bool Read(void *To,unsigned long Size);
    bool Read(void *To,unsigned long Size);
    bool Write(const void *From,unsigned long Size);
    bool Write(const void *From,unsigned long Size);
    bool Seek(unsigned long To);
    bool Seek(unsigned long To);
+   unsigned long Tell();
    unsigned long Size();
    unsigned long Size();
    bool Close();
    bool Close();
 
 

+ 7 - 3
apt-pkg/contrib/md5.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: md5.h,v 1.2 1998/11/25 23:54:45 jgg Exp $
+// $Id: md5.h,v 1.3 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    MD5SumValue - Storage for a MD5Sum
    MD5SumValue - Storage for a MD5Sum
@@ -39,9 +39,13 @@ class MD5SumValue
    // Accessors
    // Accessors
    bool operator ==(const MD5SumValue &rhs) const; 
    bool operator ==(const MD5SumValue &rhs) const; 
    string Value() const;
    string Value() const;
-   inline operator string() const {return Value();}; 
+   inline void Value(unsigned char S[16]) 
+         {for (int I = 0; I != sizeof(Sum); I++) S[I] = Sum[I];};
+   inline operator string() const {return Value();};
    bool Set(string Str);
    bool Set(string Str);
-   
+   inline void Set(unsigned char S[16]) 
+         {for (int I = 0; I != sizeof(Sum); I++) Sum[I] = S[I];};
+
    MD5SumValue(string Str);
    MD5SumValue(string Str);
    MD5SumValue();
    MD5SumValue();
 };
 };

+ 1 - 2
apt-pkg/contrib/mmap.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: mmap.h,v 1.7 1998/11/12 03:14:40 jgg Exp $
+// $Id: mmap.h,v 1.8 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    MMap Class - Provides 'real' mmap or a faked mmap using read().
    MMap Class - Provides 'real' mmap or a faked mmap using read().
@@ -22,7 +22,6 @@
    
    
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
-// Header section: pkglib
 #ifndef PKGLIB_MMAP_H
 #ifndef PKGLIB_MMAP_H
 #define PKGLIB_MMAP_H
 #define PKGLIB_MMAP_H
 
 

+ 1 - 2
apt-pkg/contrib/progress.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: progress.h,v 1.4 1998/10/02 04:39:54 jgg Exp $
+// $Id: progress.h,v 1.5 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    OpProgress - Operation Progress
    OpProgress - Operation Progress
@@ -18,7 +18,6 @@
    
    
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
-// Header section: pkglib
 #ifndef PKGLIB_PROGRESS_H
 #ifndef PKGLIB_PROGRESS_H
 #define PKGLIB_PROGRESS_H
 #define PKGLIB_PROGRESS_H
 
 

+ 5 - 3
apt-pkg/contrib/strutl.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: strutl.cc,v 1.16 1998/12/31 05:45:26 jgg Exp $
+// $Id: strutl.cc,v 1.17 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    String Util - Some usefull string functions.
    String Util - Some usefull string functions.
@@ -189,7 +189,7 @@ string QuoteString(string Str,const char *Bad)
 	  *I <= 0x20 || *I >= 0x7F)
 	  *I <= 0x20 || *I >= 0x7F)
       {
       {
 	 char Buf[10];
 	 char Buf[10];
-	 sprintf(Buf,"%%%02x",(unsigned int)((unsigned char)*I));
+	 sprintf(Buf,"%%%02x",(int)*I);
 	 Res += Buf;
 	 Res += Buf;
       }
       }
       else
       else
@@ -214,7 +214,7 @@ string SizeToStr(double Size)
    
    
    /* bytes, KiloBytes, MegaBytes, GigaBytes, TeraBytes, PetaBytes, 
    /* bytes, KiloBytes, MegaBytes, GigaBytes, TeraBytes, PetaBytes, 
       ExaBytes, ZettaBytes, YottaBytes */
       ExaBytes, ZettaBytes, YottaBytes */
-   char Ext[] = {'b','k','M','G','T','P','E','Z','Y'};
+   char Ext[] = {'\0','k','M','G','T','P','E','Z','Y'};
    int I = 0;
    int I = 0;
    while (I <= 8)
    while (I <= 8)
    {
    {
@@ -456,6 +456,7 @@ int StringToBool(string Text,int Default = -1)
    if (strcasecmp(Text.c_str(),"no") == 0 ||
    if (strcasecmp(Text.c_str(),"no") == 0 ||
        strcasecmp(Text.c_str(),"false") == 0 ||
        strcasecmp(Text.c_str(),"false") == 0 ||
        strcasecmp(Text.c_str(),"without") == 0 ||
        strcasecmp(Text.c_str(),"without") == 0 ||
+       strcasecmp(Text.c_str(),"off") == 0 ||
        strcasecmp(Text.c_str(),"disable") == 0)
        strcasecmp(Text.c_str(),"disable") == 0)
       return 0;
       return 0;
    
    
@@ -463,6 +464,7 @@ int StringToBool(string Text,int Default = -1)
    if (strcasecmp(Text.c_str(),"yes") == 0 ||
    if (strcasecmp(Text.c_str(),"yes") == 0 ||
        strcasecmp(Text.c_str(),"true") == 0 ||
        strcasecmp(Text.c_str(),"true") == 0 ||
        strcasecmp(Text.c_str(),"with") == 0 ||
        strcasecmp(Text.c_str(),"with") == 0 ||
+       strcasecmp(Text.c_str(),"on") == 0 ||
        strcasecmp(Text.c_str(),"enable") == 0)
        strcasecmp(Text.c_str(),"enable") == 0)
       return 1;
       return 1;
    
    

+ 1 - 2
apt-pkg/contrib/system.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: system.h,v 1.1 1998/07/02 02:58:13 jgg Exp $
+// $Id: system.h,v 1.2 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    System Header - Usefull private definitions
    System Header - Usefull private definitions
@@ -11,7 +11,6 @@
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
 // Private header
 // Private header
-// Header section: /
 #ifndef SYSTEM_H
 #ifndef SYSTEM_H
 #define SYSTEM_H
 #define SYSTEM_H
 
 

+ 4 - 2
methods/file.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: file.cc,v 1.6 1998/11/14 01:39:49 jgg Exp $
+// $Id: file.cc,v 1.7 1999/01/18 06:20:08 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    File URI method for APT
    File URI method for APT
@@ -37,7 +37,9 @@ bool FileMethod::Fetch(FetchItem *Itm)
    URI Get = Itm->Uri;
    URI Get = Itm->Uri;
    string File = Get.Path;
    string File = Get.Path;
    FetchResult Res;
    FetchResult Res;
-   
+   if (Get.Host.empty() == false)
+      return _error->Error("Invalid URI, local URIS must not start with //");
+
    // See if the file exists
    // See if the file exists
    struct stat Buf;
    struct stat Buf;
    if (stat(File.c_str(),&Buf) == 0)
    if (stat(File.c_str(),&Buf) == 0)