--- /dev/null
+#include "lstat.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <string.h>
+#include <errno.h>
+
+/*********************************************************************
+ * Function: GetFileList
+ *
+ * Description: For the given valid directory path, returns the list
+ * all directories or files in that path.
+ *
+ * Input: 'dirname' the directory path.
+ * 'file_type' if this takes the value DIRECTORY_TYPE
+ * returns the list of directories in that path.
+ * If its of type FILE_TYPE returns the list of files
+ * in that path.
+ *
+ * Output: List of directories/files in that path.
+ *
+ *********************************************************************/
+
+char *GetFileList(char *dirname, int file_type)
+{
+ DIR * pdir;
+ struct dirent * pdirent;
+ int curr_offset = 0;
+ int byte_count = 0;
+ int line_count = 0;
+ char * retstr = NULL;
+ char * filename = NULL;
+
+ if( (dirname == NULL) || ((pdir = opendir(dirname)) == NULL )) {
+ if(dirname == NULL){
+ fprintf(stderr,"GetFileList(): NULL directory is passed as parameter to funtion\n");
+ }else
+ fprintf(stderr,"GetFileList(): Unable to open the directory %s\n", dirname);
+ return NULL;
+ }
+
+ while(1)
+ {
+ if( (pdirent = readdir(pdir)) == NULL)
+ break;
+ if((pdirent->d_name[0] == '.') || !strcmp( pdirent->d_name, FILENAME_NUM_REF) )
+ continue ;
+ byte_count = byte_count + strlen(pdirent->d_name) + 1;
+ line_count++;
+ }
+
+ if(line_count) {
+ retstr = (char *) malloc(byte_count+1);
+ if( retstr == NULL ) {
+ closedir(pdir);
+ return NULL;
+ }
+ rewinddir(pdir);
+
+ while(line_count != 0)
+ {
+ if( (pdirent = readdir(pdir)) == NULL)
+ break;
+ if((pdirent->d_name[0] == '.') || !strcmp( pdirent->d_name, FILENAME_NUM_REF) )
+ continue ;
+ filename = (char*) malloc(strlen(dirname)+strlen(pdirent->d_name)+2);
+
+ if(filename == NULL) {
+ closedir(pdir);
+ return NULL;
+ }
+ sprintf(filename,"%s/%s",dirname,pdirent->d_name );
+ if((file_type == FILE_TYPE ) && IsDirectory(filename))
+ continue ;
+ if((file_type == DIRECTORY_TYPE ) && (!IsDirectory(filename)))
+ continue;
+ if ( filename )
+ free(filename);
+ strcpy(retstr+curr_offset,pdirent->d_name);
+ curr_offset = curr_offset + strlen(pdirent->d_name) + 1;
+ line_count--;
+
+ }
+ retstr[byte_count] = '\0';
+ }
+ closedir(pdir);
+ return retstr;
+}
+
+/*********************************************************************
+ * Function: IsDirectory
+ *
+ * Description: Checks if given filename is a directory or not.
+ * all directories or files in that path.
+ *
+ * Input: 'filename' the directory path to be checked.
+ *
+ * Output: Returns 1 if its a directory else 0.
+ *
+ *********************************************************************/
+
+int IsDirectory(char * filename)
+{
+ struct stat statf;
+ int result;
+
+ result = stat(filename, &statf);
+ if((result == SUCCESS) && (statf.st_mode & S_IFDIR ))
+ return 1;
+ return 0;
+}
+
+
+/*********************************************************************
+ * Function: GetFileCount
+ *
+ * Description: For the given valid directory path, returns the number
+ * directories or files in that path.
+ *
+ * Input: 'dirname' the directory path.
+ * 'file_type' if this takes the value DIRECTORY_TYPE
+ * returns the count of directories in that path.
+ * If its of type FILE_TYPE returns the count of files
+ * in that path.
+ *
+ * Output: Total number of files/directories in that path.
+ *
+ *********************************************************************/
+
+int GetFileCount(char * dirname, int file_type)
+{
+ DIR * pdir;
+ struct dirent * pdirent;
+ int file_count = 0;
+ char * filename = NULL;
+
+ if ( (pdir = opendir(dirname)) == NULL) {
+ fprintf(stderr,"GetFileCount(): %s Unable to open.\n",dirname);
+ return 0;
+ }
+ while(1)
+ {
+ if( (pdirent = readdir(pdir)) == NULL)
+ break;
+ if( (pdirent->d_name[0] == '.') || !strcmp( pdirent->d_name, FILENAME_NUM_REF) )
+ continue ;
+ filename = (char*) malloc(strlen(dirname)+strlen(pdirent->d_name)+2);
+ sprintf(filename, "%s/%s", dirname, pdirent->d_name );
+ if((file_type == FILE_TYPE) && !(IsDirectory(filename)))
+ file_count++;
+ else
+ if( (file_type == DIRECTORY_TYPE ) && IsDirectory(filename) )
+ file_count++;
+ }
+ closedir (pdir);
+ return file_count;
+}
+
+/*********************************************************************
+ * Function: ReadFromProcFile
+ *
+ * Description: For the given valid file path, returns the data in
+ * that file.
+ *
+ * Input: 'filepath' the file whose data is to be accessed.
+ * 'lustre_val' the data from the file is written into
+ * this variable, accesed by the requestor.
+ *
+ * Output: Returns SUCCESS if file access was a success else
+ * ERR_READ_FROM_PROC_FILE if file does not exist or if
+ * data is invalid in given path.
+ *
+ *********************************************************************/
+
+int ReadFromProcFile ( const char* filepath, char* lustre_var)
+{
+ FILE* fptr = NULL;
+ int ret_val = SUCCESS;
+ int len = 0;
+
+ if ( (filepath == NULL) || (lustre_var == NULL)) {
+ fprintf(stderr, "ReadFromProcFile(): one or both of the i/p param is null\n");
+ ret_val = ERR_READ_FROM_PROC_FILE;
+ }
+ else {
+ fptr = fopen (filepath, "r");
+ if (fptr == NULL) {
+ fprintf(stderr, "ReadFromProcFile(): %s Unable to open the file\n", filepath);
+ ret_val = ERR_READ_FROM_PROC_FILE;
+ }
+ else {
+ if (fgets (lustre_var,ARRAY_SIZE, fptr) == NULL) {
+ /* fgets includes '\n' also in the returned string */
+ fprintf (stderr, "ReadFromProcFile(): Error reading file %s \n",filepath);
+ ret_val = ERR_READ_FROM_PROC_FILE;
+ }else {
+ len = strlen (lustre_var);
+ /* Last char is EOF,before string ends, so '\0' is moved to last but one.*/
+ lustre_var[len-1] = lustre_var[len];
+ }
+ fclose (fptr);
+ }
+ }
+ return ret_val;
+}
+
+int parse_dir_info(char *dirpath)
+{
+ char *dir_list = NULL, *tmp_list;
+ int current_dptr = 0, tmp_ptr = 0, dcount, dindex, tcount, tindex, rc;
+ char name[ARRAY_SIZE], tname[ARRAY_SIZE];
+
+ if(!IsDirectory(dirpath))
+ return -1;
+
+ /* Obtain the number of instances */
+ if ( (dcount = GetFileCount (dirpath, DIRECTORY_TYPE)) == 0)
+ return dcount;
+// printf("\n dcount is %d", dcount);
+
+// printf("\n%s", dirpath);
+ if ( (dir_list = GetFileList(dirpath, DIRECTORY_TYPE)) == '\0')
+ return -1;
+
+ for ( dindex = 0; dindex < dcount; dindex++) {
+ sprintf(name, "%s/%s", dirpath, dir_list + current_dptr);
+ printf("\n>> %s >>\n", dir_list + current_dptr);
+
+ if ( (tcount = GetFileCount (name, DIRECTORY_TYPE)) == 0) {
+ if(!(rc = parse_file_info(name)))
+ continue;
+ } else {
+ rc = parse_file_info(name);
+ if ( (tmp_list = GetFileList(name, DIRECTORY_TYPE)) == '\0')
+ break;
+// printf("\n %s", name);
+
+ for ( tindex = 0; tindex < tcount; tindex++) {
+ printf("\n\t>>>> %s>>>>\n", tmp_list + tmp_ptr);
+ sprintf(tname, "%s/%s", name, tmp_list + tmp_ptr);
+// printf("\n tname is %s", tname);
+
+ tmp_ptr += strlen (tmp_list + tmp_ptr) + 1;
+ if((rc = parse_file_info(tname)) == -1)
+ break;
+ }
+ current_dptr += strlen (dir_list + current_dptr) + 1;
+ }
+ }
+
+ return rc;
+}
+
+int parse_file_info(char * node_path)
+{
+ char file_path [MAX_PATH_SIZE];
+ char name[ARRAY_SIZE], fname[ARRAY_SIZE];
+ char file_data [ARRAY_SIZE];
+ char *file_list = NULL;
+ int fcount, findex;
+ int current_fptr = 0;
+ char data[ARRAY_SIZE];
+
+ memset (file_path, '\0', MAX_PATH_SIZE );
+ memset (file_data, '\0', ARRAY_SIZE );
+
+// printf(" \n PFI node_path %s ", node_path);
+
+ /* Obtain the number of instances */
+ if ( (fcount = GetFileCount (node_path, FILE_TYPE)) == 0)
+ return fcount;
+
+// printf("\n PFI Number of PFILES %d", fcount);
+
+ if ( (file_list = GetFileList(node_path, FILE_TYPE)) == '\0')
+ return -1;
+
+ for ( findex = 0; findex < fcount; findex++) {
+ printf("\n[%s", file_list + current_fptr);
+ sprintf(fname, "%s/%s", node_path, file_list + current_fptr);
+
+ if (ReadFromProcFile (fname, data) == ERR_READ_FROM_PROC_FILE) {
+ fprintf(stderr, "File read error %s for fname not found\n", file_path);
+ return -1;
+ }
+ printf(" -> \t%s]", data);
+
+ current_fptr += strlen (file_list + current_fptr) + 1;
+ }
+ free (file_list);
+ file_list = NULL;
+ return 0;
+}
+
+main()
+{
+ int rc = -1;
+
+ printf("\n/********* CLIENT info ******/\n");
+ if (rc = parse_dir_info(CLIENT_PATH))
+ printf("\n Client doesn't exist");
+ printf("\n/********* MDC info *********/\n");
+ if (rc = parse_dir_info(MDC_PATH))
+ printf("\n MDC doesn't exist");
+
+ printf("\n/********* OSC info *********/\n");
+ if (rc = parse_dir_info(OSC_PATH))
+ printf("\n OSC doesn't exist");
+
+ printf("\n/********* LOV info *********/\n");
+ if (rc = parse_dir_info(LOV_PATH) == -1)
+ printf("\n LOV doesn't exist");
+
+ printf("\n/********* LDLM info ********/\n");
+ if (rc = parse_dir_info(LDLM_PATH))
+ printf("\n LDLM doesn't exist");
+
+ printf("\n/********* OSD info *********/\n");
+ if(rc = parse_dir_info(OSD_PATH))
+ printf("\n OSD doesn't exist");
+ printf("\n/********* OST info *********/\n");
+ if(rc = parse_dir_info(OST_PATH))
+ printf("\n OST doesn't exist");
+ printf("\n/********* MDS info *********/\n");
+ if (rc = parse_dir_info(MDS_PATH))
+ printf("\n MDS doesn't exist");
+
+ return 0;
+}