NULL, "ata",
{
.NumACLs = 1,
+ .Size = -1,
.Flags = VFS_FFLAG_DIRECTORY,
.ACLs = &gVFS_ACL_EveryoneRX,
.ReadDir = ATA_ReadDir,
for( j = 0; j < gATA_Disks[i].NumPartitions; j ++ )
gATA_Nodes[ k++ ] = &gATA_Disks[i].Partitions[j].Node;
}
+
+ gATA_DriverInfo.RootNode.Size = giATA_NumNodes;
}
/**
char *ATA_ReadDir(tVFS_Node *Node, int Pos)
{
if(Pos >= giATA_NumNodes || Pos < 0) return NULL;
- return gATA_Nodes[Pos]->ImplPtr;
+ return strdup( gATA_Nodes[Pos]->ImplPtr );
}
/**
NULL, "pci",\r
{\r
.Flags = VFS_FFLAG_DIRECTORY,\r
+ .Size = -1,\r
.NumACLs = 1,\r
.ACLs = &gVFS_ACL_EveryoneRX,\r
.ReadDir = PCI_ReadDirRoot,\r
if(pos < 0 || pos >= giPCI_DeviceCount)\r
return NULL;\r
\r
- return gPCI_Devices[pos].Name;\r
+ return strdup( gPCI_Devices[pos].Name );\r
}\r
/**\r
* \fn tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, char *filename)\r
NULL, "VTerm",
{
.Flags = VFS_FFLAG_DIRECTORY,
+ .Size = NUM_VTS,
.Inode = -1,
.NumACLs = 0,
.ReadDir = VT_ReadDir,
{
if(Pos < 0) return NULL;
if(Pos >= NUM_VTS) return NULL;
- return gVT_Terminals[Pos].Name;
+ return strdup( gVT_Terminals[Pos].Name );
}
/**
extern int strcmp(char *__dest, char *__src);
extern int strncmp(char *Str1, char *Str2, size_t num);
extern int strucmp(char *Str1, char *Str2);
+extern char *strdup(char *__str);
extern int strpos(char *Str, char Ch);
extern int strpos8(char *str, Uint32 search);
extern void itoa(char *buf, Uint num, int base, int minLength, char pad);
//! Find an directory entry by name
struct sVFS_Node *(*FindDir)(struct sVFS_Node *Node, char *Name);
- //! Read from a directory
+ //! Read from a directory - MUST return a heap address
char *(*ReadDir)(struct sVFS_Node *Node, int Pos);
//! Create a node in a directory
int (*MkNod)(struct sVFS_Node *Node, char *Name, Uint Flags);
#define VFS_MAXSKIP ((void*)1024)
#define VFS_SKIP ((void*)1)
#define VFS_SKIPN(n) ((void*)(n))
-#define VFS_FREEPLZ(ptr) ((void*)(((Uint)ptr)|1))
extern tVFS_Node NULLNode;
extern tVFS_ACL gVFS_ACL_EveryoneRWX;
extern tVFS_ACL gVFS_ACL_EveryoneRW;
return *Str1-*Str2;
}
+/**
+ * \fn char *strdup(char *str)
+ * \brief Duplicates a string
+ */
+char *strdup(char *str)
+{
+ char *ret;
+ ret = malloc(strlen(str)+1);
+ strcpy(ret, str);
+ return ret;
+}
+
/**
* \fn int strpos8(char *str, Uint32 search)
* \brief Search a string for a UTF-8 character
return 1;
}
-#define READDIR_FIXUP(ptr) (void*)( (Uint)(ptr) & ~1 )
/**
* \fn int VFS_ReadDir(int FD, char *Dest)
* \brief Read from a directory
h->Position ++;
} while(tmp != NULL && (Uint)tmp < (Uint)VFS_MAXSKIP);
- //LOG("tmp = '%s'", READDIR_FIXUP(tmp));
+ //LOG("tmp = '%s'", tmp);
if(!tmp) {
//LEAVE('i', 0);
return 0;
}
- strcpy(Dest, READDIR_FIXUP(tmp));
-
- if((Uint)tmp & 1)
- free(READDIR_FIXUP(tmp));
+ strcpy(Dest, tmp);
+ free(tmp);
//LEAVE('i', 1);
return 1;
dev = dev->Next
);
- return dev->Name;
+ return strdup(dev->Name);
}
/**
#endif\r
\r
LEAVE('s', ret);\r
- return VFS_FREEPLZ(ret);\r
+ return ret;\r
}\r
\r
/**\r
if(Pos) return child->Name;
- return child->Name;
+ return strdup(child->Name);
}
/**