I have been programming an FTP server in my free time. But I have a problem with sending listings of a directory. I use the Unix format, also used by ls
drwxr-xr-x 28 kasper kasper 4096 2009-08-14 01:32 Music
drwxr-xr-x 4 kasper kasper 4096 2009-09-06 13:52 Pictures
drwxr-xr-x 14 kasper kasper 4096 2009-09-09 18:49 Source
drwxr-xr-x 2 kasper kasper 4096 2009-09-08 18:27 Videos
In my program, I stat the files they want and send the data over.
The fields of a stat struct are all special types:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
The relevant code for my question follows:
len = snprintf( statbuf, STAT_BUFFER_SIZE,
"%crwxrwxrwx %lu %u %u %lld %s %s\r\n",
S_ISDIR( filestats.st_mode ) ? 'd' : '-',
(unsigned long ) filestats.st_nlink,
filestats.st_uid,
filestats.st_gid,
(unsigned long long ) filestats.st_size,
date,
filename);
How do I portably and efficiently print these types? At first I did it without casts by guessing the correct format specifiers. Apart from being an annoying programming habit, this also meant my code wouldn't work on a 32 bit system. Now with the casts it seems to work, but on how many platforms?
Thanks in advance, Kasper.