- int fd;
- struct utsname un;
- struct dep_t *first = 0;
- struct dep_t *current = 0;
- char buffer[2048];
- char *filename;
- int continuation_line = 0;
- int k_version;
-
- k_version = 0;
- if ( uname ( &un ))
- bb_error_msg_and_die("can't determine kernel version");
-
- if (un.release[0] == '2') {
- k_version = un.release[2] - '0';
- }
-
- filename = bb_xasprintf("/lib/modules/%s/modules.dep", un.release );
-
- if (( fd = open ( filename, O_RDONLY )) < 0 ) {
-
- /* Ok, that didn't work. Fall back to looking in /lib/modules */
- if (( fd = open ( "/lib/modules/modules.dep", O_RDONLY )) < 0 ) {
- return 0;
- }
- }
- free(filename);
-
- while ( reads ( fd, buffer, sizeof( buffer ))) {
- int l = bb_strlen ( buffer );
- char *p = 0;
-
- while ( l > 0 && isspace ( buffer [l-1] )) {
- buffer [l-1] = 0;
- l--;
- }
-
- if ( l == 0 ) {
- continuation_line = 0;
- continue;
- }
-
- /* Is this a new module dep description? */
- if ( !continuation_line ) {
- /* find the dep beginning */
- char *col = strchr ( buffer, ':' );
- char *dot = col;
-
- if ( col ) {
- /* This line is a dep description */
- char *mods;
- char *modpath;
- char *mod;
-
- /* Find the beginning of the module file name */
- *col = 0;
- mods = strrchr ( buffer, '/' );
-
- if ( !mods )
- mods = buffer; /* no path for this module */
- else
- mods++; /* there was a path for this module... */
-
- /* find the path of the module */
- modpath = strchr ( buffer, '/' ); /* ... and this is the path */
- if ( !modpath )
- modpath = buffer; /* module with no path */
- /* find the end of the module name in the file name */
- if ( ENABLE_FEATURE_2_6_MODULES &&
- (k_version > 4) && ( *(col-3) == '.' ) &&
- ( *(col-2) == 'k' ) && ( *(col-1) == 'o' ) )
- dot = col - 3;
- else
- if (( *(col-2) == '.' ) && ( *(col-1) == 'o' ))
- dot = col - 2;
-
- mod = bb_xstrndup ( mods, dot - mods );
-
- /* enqueue new module */
- if ( !current ) {
- first = current = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
- }
- else {
- current-> m_next = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
- current = current-> m_next;
- }
- current-> m_name = mod;
- current-> m_path = bb_xstrdup(modpath);
- current-> m_options = NULL;
- current-> m_isalias = 0;
- current-> m_depcnt = 0;
- current-> m_deparr = 0;
- current-> m_next = 0;
-
- p = col + 1;
- }
- else
- /* this line is not a dep description */
- p = 0;
- }
- else
- /* It's a dep description continuation */
- p = buffer;
-
- while ( p && *p && isblank(*p))
- p++;
-
- /* p points to the first dependable module; if NULL, no dependable module */
- if ( p && *p ) {
- char *end = &buffer [l-1];
- char *deps;
- char *dep;
- char *next;
- int ext = 0;
-
- while ( isblank ( *end ) || ( *end == '\\' ))
- end--;
-
- do
- {
- /* search the end of the dependency */
- next = strchr (p, ' ' );
- if (next)
- {
- *next = 0;
- next--;
- }
- else
- next = end;
-
- /* find the beginning of the module file name */
- deps = strrchr ( p, '/' );
-
- if ( !deps || ( deps < p )) {
- deps = p;
-
- while ( isblank ( *deps ))
- deps++;
- }
- else
- deps++;
-
- /* find the end of the module name in the file name */
- if ( ENABLE_FEATURE_2_6_MODULES &&
- (k_version > 4) && ( *(next-2) == '.' ) &&
- ( *(next-1) == 'k' ) && ( *next == 'o' ) )
- ext = 3;
- else
- if (( *(next-1) == '.' ) && ( *next == 'o' ))
- ext = 2;
-
- /* Cope with blank lines */
- if ((next-deps-ext+1) <= 0)
- continue;
- dep = bb_xstrndup ( deps, next - deps - ext + 1 );
-
- /* Add the new dependable module name */
- current-> m_depcnt++;
- current-> m_deparr = (char **) xrealloc ( current-> m_deparr,
- sizeof ( char *) * current-> m_depcnt );
- current-> m_deparr [current-> m_depcnt - 1] = dep;