Skip to content
Snippets Groups Projects
Commit 2e1838d8 authored by Yorhel's avatar Yorhel
Browse files

Get rid of padding in dir struct + use offsetof() to calc needed size

There used to be four bytes of padding in the struct on systems with
32bit pointers. Moving the pointers down so that they are in between the
64bit and 32bit fields means that there'll never be any padding.

There may, however, be some extra padding at the end of the struct to
make the size a multiple of 8. Since we use the name field as a sort of
"flexible array member", we don't particularly care about that padding
and just want to allocate enough memory to hold the struct and the name
field. offsetof() allows us to do that without relying on compiler
support for flexible array members.
parent dfbeed9d
No related branches found
No related tags found
No related merge requests found
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "config.h" #include "config.h"
#include <stdio.h> #include <stdio.h>
#include <stddef.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -57,15 +58,15 @@ ...@@ -57,15 +58,15 @@
/* structure representing a file or directory */ /* structure representing a file or directory */
struct dir { struct dir {
struct dir *parent, *next, *prev, *sub, *hlnk;
int64_t size, asize; int64_t size, asize;
uint64_t ino, dev; uint64_t ino, dev;
struct dir *parent, *next, *prev, *sub, *hlnk;
int items; int items;
unsigned char flags; unsigned char flags;
char name[3]; /* must be large enough to hold ".." */ char name[3]; /* must be large enough to hold ".." */
}; };
/* sizeof(total dir) = SDIRSIZE + strlen(name) = sizeof(struct dir) - 3 + strlen(name) + 1 */ /* sizeof(total dir) = SDIRSIZE + strlen(name) = offsetof(struct dir, name) + strlen(name) + 1 */
#define SDIRSIZE (sizeof(struct dir)-2) #define SDIRSIZE (offsetof(struct dir, name)+1)
/* A note on the ino and dev fields above: ino is usually represented as ino_t, /* A note on the ino and dev fields above: ino is usually represented as ino_t,
* which POSIX specifies to be an unsigned integer. dev is usually represented * which POSIX specifies to be an unsigned integer. dev is usually represented
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment