procfs: Fix some breakage introduced by reorganizing some un-reorganizable data structures. From Ken Pettit

This commit is contained in:
Gregory Nutt 2014-09-22 11:07:08 -06:00
parent a54db7502d
commit b05d20a6e7

View File

@ -224,16 +224,13 @@ const struct mountpt_operations procfs_operations =
struct procfs_level0_s
{
uint8_t level; /* Directory level. Currently 0 or 1 */
struct procfs_dir_priv_s base; /* Base struct for ProcFS dir */
/* Our private data */
uint8_t lastlen; /* length of last reported static dir */
uint16_t index; /* Index to the next directory entry */
uint16_t nentries; /* Number of directory entries */
pid_t pid[CONFIG_MAX_TASKS]; /* Snapshot of all active task IDs */
FAR const char *lastread; /* Pointer to last static dir read */
/* Pointer to procfs handler entry */
FAR const struct procfs_entry_s *procfsentry;
};
/* Level 1 is an internal virtual directory (such as /proc/fs) which
@ -243,17 +240,14 @@ struct procfs_level0_s
struct procfs_level1_s
{
uint8_t level; /* Directory level. Currently 0 or 1 */
struct procfs_dir_priv_s base; /* Base struct for ProcFS dir */
/* Our private data */
uint8_t lastlen; /* length of last reported static dir */
uint8_t subdirlen; /* Length of the subdir search */
uint16_t index; /* Index to the next directory entry */
uint16_t nentries; /* Number of directory entries */
uint16_t firstindex; /* Index of 1st entry matching this subdir */
FAR const char *lastread; /* Pointer to last static dir read */
/* Pointer to procfs handler entry */
FAR const struct procfs_entry_s *procfsentry;
};
/****************************************************************************
@ -275,11 +269,11 @@ static void procfs_enum(FAR struct tcb_s *tcb, FAR void *arg)
/* Add the PID to the list */
index = dir->nentries;
index = dir->base.nentries;
DEBUGASSERT(index < CONFIG_MAX_TASKS);
dir->pid[index] = tcb->pid;
dir->nentries = index + 1;
dir->base.nentries = index + 1;
}
#endif
@ -455,15 +449,15 @@ static int procfs_opendir(FAR struct inode *mountpt, FAR const char *relpath,
sched_foreach(procfs_enum, level0);
irqrestore(flags);
#else
level0->index = 0;
level0->nentries = 0;
level0->base.index = 0;
level0->base.nentries = 0;
#endif
/* Initialze lastread entries */
level0->lastread = "";
level0->lastlen = 0;
level0->procfsentry = NULL;
level0->base.procfsentry = NULL;
priv = (FAR void *)level0;
}
@ -522,13 +516,13 @@ static int procfs_opendir(FAR struct inode *mountpt, FAR const char *relpath,
return -ENOMEM;
}
level1->level = 1;
level1->index = x;
level1->base.level = 1;
level1->base.index = x;
level1->firstindex = x;
level1->subdirlen = len;
level1->lastread = "";
level1->lastlen = 0;
level1->procfsentry = NULL;
level1->base.procfsentry = NULL;
priv = (FAR void *)level1;
break;
@ -713,7 +707,7 @@ static int procfs_readdir(struct inode *mountpt, struct fs_dirent_s *dir)
* standard f_pos instead of our own private index.
*/
level0->index = index + 1;
level0->base.index = index + 1;
ret = OK;
}
#endif /* CONFIG_FS_PROCFS_EXCLUDE_PROCESS */
@ -731,17 +725,25 @@ static int procfs_readdir(struct inode *mountpt, struct fs_dirent_s *dir)
* subdirectory are listed in order in the procfs_entry array.
*/
if (strncmp(g_procfsentries[level1->index].pathpattern,
if (strncmp(g_procfsentries[level1->base.index].pathpattern,
g_procfsentries[level1->firstindex].pathpattern,
level1->subdirlen) == 0)
{
/* This entry matches. Report the subdir entry */
name = &g_procfsentries[level1->index].pathpattern[
name = &g_procfsentries[level1->base.index].pathpattern[
level1->subdirlen + 1];
level1->lastlen = strcspn(name, "/");
level1->lastread = name;
strncpy(dir->fd_dir.d_name, name, level1->lastlen);
/* Some of the search entries contain '**' wildcards. When we
* report the entry name, we must remove this wildcard search
* specifier.
*/
while (dir->fd_dir.d_name[level1->lastlen - 1] == '*')
level1->lastlen--;
dir->fd_dir.d_name[level1->lastlen] = '\0';
if (name[level1->lastlen] == '/')
@ -753,7 +755,7 @@ static int procfs_readdir(struct inode *mountpt, struct fs_dirent_s *dir)
dir->fd_dir.d_type = DTYPE_FILE;
}
level1->index++;
level1->base.index++;
ret = OK;
}
else