contrib/lar:
[project/luci.git] / contrib / lar / lar.c
index 255bc01..6bac9d6 100644 (file)
@@ -46,7 +46,7 @@ lar_index * lar_get_index( lar_archive *ar )
        idx_map = NULL;
 
        for( i = 0; i < idx_length; \
-               i += (sizeof(lar_index) - sizeof(char)) 
+               i += (sizeof(lar_index) - sizeof(char *))
        ) {
                idx_ptr = (lar_index *)malloc(sizeof(lar_index));
 
@@ -65,7 +65,7 @@ lar_index * lar_get_index( lar_archive *ar )
 }
 
 uint32_t lar_get_filename( lar_archive *ar,
-       lar_index *idx_ptr, char *filename 
+       lar_index *idx_ptr, char *filename
 ) {
        if( idx_ptr->nlength >= LAR_FNAME_BUFFER )
                LAR_DIE("Filename exceeds maximum allowed length");
@@ -111,7 +111,7 @@ lar_member * lar_open_member( lar_archive *ar, const char *name )
                        member->data   = &memberdata[idx_ptr->foffset % pgsz];
 
                        member->mmap   = memberdata;
-                       member->mlen   = idx_ptr->flength + ( idx_ptr->foffset % pgsz );                        
+                       member->mlen   = idx_ptr->flength + ( idx_ptr->foffset % pgsz );
 
                        return member;
                }
@@ -135,7 +135,7 @@ lar_archive * lar_open( const char *filename )
        int fd;
        struct stat as;
        lar_archive *ar;
-       
+
        if( stat(filename, &as) == -1 )
                return NULL;
 
@@ -174,3 +174,70 @@ int lar_close( lar_archive *ar )
        return 0;
 }
 
+lar_archive * lar_find_archive( const char *package, const char *path )
+{
+       int seg = 1;
+       int len = 0;
+       int pln = 0;
+       int i, j;
+       struct stat s;
+       LAR_FNAME(buffer);
+
+       if( path )
+       {
+               for( pln = 0; path[pln] != '\0'; pln++ )
+                       if( pln >= (sizeof(buffer) - 5) )
+                               LAR_DIE("Library path exceeds maximum allowed length");
+
+               memcpy(buffer, path, pln);
+       }
+
+       for( len = 0; package[len] != '\0'; len++ )
+       {
+               if( len >= (sizeof(buffer) - 5 - pln) )
+                       LAR_DIE("Package name exceeds maximum allowed length");
+
+               if( package[len] == '.' ) seg++;
+       }
+
+       while( seg > 0 )
+       {
+               for( i = 0, j = 1; (i < len) && (j <= seg); i++ )
+               {
+                       if( package[i] == '.' ) {
+                               if( j < seg ) j++; else break;
+                       }
+
+                       buffer[pln+i] = ( package[i] == '.' ) ? LAR_DIRSEP : package[i];
+               }
+
+               buffer[pln+i+0] = '.'; buffer[pln+i+1] = 'l'; buffer[pln+i+2] = 'a';
+               buffer[pln+i+3] = 'r'; buffer[pln+i+4] = '\0';
+
+               if( (stat(buffer, &s) > -1) && (s.st_mode & S_IFREG) )
+                       return lar_open(buffer);
+
+               seg--;
+       }
+
+       return NULL;
+}
+
+lar_member * lar_find_member( lar_archive *ar, const char *package )
+{
+       int len;
+       LAR_FNAME(buffer);
+
+       for( len = 0; package[len] != '\0'; len++ )
+       {
+               if( len >= (sizeof(buffer) - 5) )
+                       LAR_DIE("Package name exceeds maximum allowed length");
+
+               buffer[len] = ( package[len] == '.' ) ? '/' : package[len];
+       }
+
+       buffer[len+0] = '.'; buffer[len+1] = 'l'; buffer[len+2] = 'u';
+       buffer[len+3] = 'a'; buffer[len+4] = '\0';
+
+       return lar_open_member(ar, buffer);
+}