mirror of
https://code.blicky.net/yorhel/ncdu.git
synced 2026-01-12 17:08:39 -09:00
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.
This commit is contained in:
parent
dfbeed9daf
commit
2e1838d890
1 changed files with 4 additions and 3 deletions
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
|
|
@ -57,15 +58,15 @@
|
|||
|
||||
/* structure representing a file or directory */
|
||||
struct dir {
|
||||
struct dir *parent, *next, *prev, *sub, *hlnk;
|
||||
int64_t size, asize;
|
||||
uint64_t ino, dev;
|
||||
struct dir *parent, *next, *prev, *sub, *hlnk;
|
||||
int items;
|
||||
unsigned char flags;
|
||||
char name[3]; /* must be large enough to hold ".." */
|
||||
};
|
||||
/* sizeof(total dir) = SDIRSIZE + strlen(name) = sizeof(struct dir) - 3 + strlen(name) + 1 */
|
||||
#define SDIRSIZE (sizeof(struct dir)-2)
|
||||
/* sizeof(total dir) = SDIRSIZE + strlen(name) = offsetof(struct dir, name) + strlen(name) + 1 */
|
||||
#define SDIRSIZE (offsetof(struct dir, name)+1)
|
||||
|
||||
/* 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
|
||||
|
|
|
|||
Loading…
Reference in a new issue