Change fdt-specific loader into a generic setup_data loader
[profile/ivi/syslinux.git] / libfat / searchdir.c
index 7c07165..4964120 100644 (file)
@@ -1,7 +1,6 @@
-#ident "$Id$"
 /* ----------------------------------------------------------------------- *
- *   
- *   Copyright 2004 H. Peter Anvin - All Rights Reserved
+ *
+ *   Copyright 2004-2008 H. Peter Anvin - All Rights Reserved
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
 #include "libfatint.h"
 
 int32_t libfat_searchdir(struct libfat_filesystem *fs, int32_t dirclust,
-                        const void *name, void *direntry)
+                        const void *name, struct libfat_direntry *direntry)
 {
-  struct fat_dirent *dep;
-  int nent;
-  libfat_sector_t s = libfat_clustertosector(fs, dirclust);
-
-  while ( 1 ) {
-    if ( s == 0 )
-      return -2;               /* Not found */
-    else if ( s == (libfat_sector_t)-1 )
-      return -1;               /* Error */
-    
-    dep = libfat_get_sector(fs, s);
-    if ( !dep )
-      return -1;               /* Read error */
-
-    for ( nent = LIBFAT_SECTOR_SIZE/sizeof(struct fat_dirent) ;
-         nent ; nent-- ) {
-      if ( !memcmp(dep->name, name, 11) ) {
-       if ( direntry )
-         memcpy(direntry, dep, sizeof (*dep));
-       if ( read32(&dep->size) == 0 )
-         return 0;             /* An empty file has no clusters */
-       else
-         return read16(&dep->clustlo) + (read16(&dep->clusthi) << 16);
-      }
-      
-      if ( dep->name[0] == 0 )
-       return -2;              /* Hit high water mark */
-
-      dep++;
-    }   
-
-    s = libfat_nextsector(fs, s);
-  }
+    struct fat_dirent *dep;
+    int nent;
+    libfat_sector_t s = libfat_clustertosector(fs, dirclust);
+
+    while (1) {
+       if (s == 0)
+           return -2;          /* Not found */
+       else if (s == (libfat_sector_t) - 1)
+           return -1;          /* Error */
+
+       dep = libfat_get_sector(fs, s);
+       if (!dep)
+           return -1;          /* Read error */
+
+       for (nent = 0; nent < LIBFAT_SECTOR_SIZE;
+            nent += sizeof(struct fat_dirent)) {
+           if (!memcmp(dep->name, name, 11)) {
+               if (direntry) {
+                   memcpy(direntry->entry, dep, sizeof(*dep));
+                   direntry->sector = s;
+                   direntry->offset = nent;
+               }
+               if (read32(&dep->size) == 0)
+                   return 0;   /* An empty file has no clusters */
+               else
+                   return read16(&dep->clustlo) +
+                       (read16(&dep->clusthi) << 16);
+           }
+
+           if (dep->name[0] == 0)
+               return -2;      /* Hit high water mark */
+
+           dep++;
+       }
+
+       s = libfat_nextsector(fs, s);
+    }
 }