Преглед изворни кода

support very long mtab entries in mountpoint discovery

Old code limited lines to 250 characters which is probably enough for
everybody, but who knows… It also takes care of device nodes which start
with the same prefix.
David Kalnischkies пре 12 година
родитељ
комит
12844170ad
4 измењених фајлова са 63 додато и 25 уклоњено
  1. 23 25
      apt-pkg/contrib/cdromutl.cc
  2. 26 0
      test/libapt/cdromfindmountpointfordevice_test.cc
  3. 6 0
      test/libapt/makefile
  4. 8 0
      test/libapt/run-tests

+ 23 - 25
apt-pkg/contrib/cdromutl.cc

@@ -23,6 +23,7 @@
 #include <string.h>
 #include <string.h>
 #include <iostream>
 #include <iostream>
 #include <string>
 #include <string>
+#include <vector>
 #include <sys/statvfs.h>
 #include <sys/statvfs.h>
 #include <dirent.h>
 #include <dirent.h>
 #include <fcntl.h>
 #include <fcntl.h>
@@ -262,37 +263,34 @@ bool IdentCdrom(string CD,string &Res,unsigned int Version)
    return true;   
    return true;   
 }
 }
 									/*}}}*/
 									/*}}}*/
-
 // FindMountPointForDevice - Find mountpoint for the given device	/*{{{*/
 // FindMountPointForDevice - Find mountpoint for the given device	/*{{{*/
 string FindMountPointForDevice(const char *devnode)
 string FindMountPointForDevice(const char *devnode)
 {
 {
-   char buf[255];
-   char *out[10];
-   int i=0;
-
    // this is the order that mount uses as well
    // this is the order that mount uses as well
-   const char *mount[] = { "/etc/mtab", 
-                           "/proc/mount", 
-                           NULL };
+   std::vector<std::string> const mounts = _config->FindVector("Dir::state::MountPoints", "/etc/mtab,/proc/mount");
 
 
-   for (i=0; mount[i] != NULL; i++) {
-      if (FileExists(mount[i])) {
-         FILE *f=fopen(mount[i], "r");
-         while ( fgets(buf, sizeof(buf), f) != NULL) {
-            if (strncmp(buf, devnode, strlen(devnode)) == 0) {
-               if(TokSplitString(' ', buf, out, 10))
-               {
-                  fclose(f);
-                  // unescape the \0XXX chars in the path
-                  string mount_point = out[1];
-                  return DeEscapeString(mount_point);
-               }
-            }
-         }
-         fclose(f);
+   for (std::vector<std::string>::const_iterator m = mounts.begin(); m != mounts.end(); ++m)
+      if (FileExists(*m) == true)
+      {
+	 char * line = NULL;
+	 size_t line_len = 0;
+	 FILE * f = fopen(m->c_str(), "r");
+	 while(getline(&line, &line_len, f) != -1)
+	 {
+	    char * out[] = { NULL, NULL, NULL };
+	    TokSplitString(' ', line, out, 3);
+	    if (out[2] != NULL || out[1] == NULL || out[0] == NULL)
+	       continue;
+	    if (strcmp(out[0], devnode) != 0)
+	       continue;
+	    fclose(f);
+	    // unescape the \0XXX chars in the path
+	    string mount_point = out[1];
+	    return DeEscapeString(mount_point);
+	 }
+	 fclose(f);
       }
       }
-   }
-   
+
    return string();
    return string();
 }
 }
 									/*}}}*/
 									/*}}}*/

+ 26 - 0
test/libapt/cdromfindmountpointfordevice_test.cc

@@ -0,0 +1,26 @@
+#include <config.h>
+
+#include <apt-pkg/cdromutl.h>
+#include <apt-pkg/configuration.h>
+
+#include <string>
+#include <vector>
+
+#include "assert.h"
+
+int main(int argc, char const *argv[]) {
+	if (argc != 2) {
+		std::cout << "One parameter expected - given " << argc << std::endl;
+		return 100;
+	}
+
+	_config->Set("Dir::state::Mountpoints", argv[1]);
+	equals("/", FindMountPointForDevice("rootfs"));
+	equals("/", FindMountPointForDevice("/dev/disk/by-uuid/fadcbc52-6284-4874-aaaa-dcee1f05fe21"));
+	equals("/sys", FindMountPointForDevice("sysfs"));
+	equals("/sys0", FindMountPointForDevice("sysfs0"));
+	equals("/boot/efi", FindMountPointForDevice("/dev/sda1"));
+	equals("/tmp", FindMountPointForDevice("tmpfs"));
+
+	return 0;
+}

+ 6 - 0
test/libapt/makefile

@@ -94,6 +94,12 @@ SLIBS = -lapt-pkg
 SOURCE = cdromreducesourcelist_test.cc
 SOURCE = cdromreducesourcelist_test.cc
 include $(PROGRAM_H)
 include $(PROGRAM_H)
 
 
+# test cdroms FindMountPointForDevice for udev autodetection
+PROGRAM = CdromFindMountPointForDevice${BASENAME}
+SLIBS = -lapt-pkg
+SOURCE = cdromfindmountpointfordevice_test.cc
+include $(PROGRAM_H)
+
 # test IndexCopy::ConvertToSourceList
 # test IndexCopy::ConvertToSourceList
 PROGRAM = IndexCopyToSourceList${BASENAME}
 PROGRAM = IndexCopyToSourceList${BASENAME}
 SLIBS = -lapt-pkg
 SLIBS = -lapt-pkg

Разлика између датотеке није приказан због своје велике величине
+ 8 - 0
test/libapt/run-tests