Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */
  2.  
  3. #include <sys/dirent.h>
  4. #include <sys/ksys.h>
  5. #include <errno.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. #define CHECK_DIR_ERR() if(_ksys_work_files(&inf)){ \
  10.                             free((void*)inf.p16); \
  11.                             errno = ENOTDIR; \
  12.                             return NULL; \
  13.                         }
  14.  
  15. DIR* opendir(const char* path)
  16. {
  17.     DIR* list = malloc(sizeof(DIR));
  18.     if(list==NULL){
  19.         errno = ENOMEM;
  20.         return NULL;
  21.     }
  22.  
  23.     list->pos=0;
  24.     unsigned num_of_file=0;
  25.     ksys70_t inf;
  26.  
  27.     inf.p00 = 1;
  28.     inf.p04 = 0;
  29.     inf.p12 = 2;
  30.     inf.p16 = (unsigned) malloc(32+inf.p12*560);
  31.     inf.p20 = 0;
  32.     inf.p21 = (char*)path;
  33.    
  34.     CHECK_DIR_ERR();
  35.    
  36.     num_of_file = *(unsigned*)(inf.p16+8);
  37.     inf.p12 = num_of_file;
  38.     free((void*)inf.p16);
  39.     inf.p16 = (unsigned) malloc(32+inf.p12*560);
  40.     list->objs = (struct dirent*)malloc(num_of_file*sizeof(struct dirent));
  41.    
  42.     CHECK_DIR_ERR();
  43.  
  44.     for(int i=0; i<num_of_file; i++){
  45.        list->objs[i].d_ino  = i;
  46.        list->objs[i].d_type = *(unsigned*)(inf.p16+32+(264+40)*i);
  47.        strcpy(list->objs[i].d_name,(char*)(inf.p16+32+40+(264+40)*i));
  48.     }
  49.     list->num_objs = num_of_file;
  50.     return list;
  51. }
  52.  
  53.  
  54.