if (!stat)
return EINVAL;
- // Set type
- switch (stat->st_mode & S_IFMT) {
- case S_IFREG:
- pakfire_file_set_type(file, REGTYPE);
- break;
-
- case S_IFDIR:
- pakfire_file_set_type(file, DIRTYPE);
- break;
-
- case S_IFLNK:
- pakfire_file_set_type(file, SYMTYPE);
- break;
-
- case S_IFBLK:
- pakfire_file_set_type(file, BLKTYPE);
- break;
-
- case S_IFCHR:
- pakfire_file_set_type(file, CHRTYPE);
- break;
-
- case S_IFIFO:
- pakfire_file_set_type(file, FIFOTYPE);
- break;
- }
-
// Set mode
pakfire_file_set_mode(file, stat->st_mode);
return strcmp(path1, path2);
}
-static char pakfire_file_sprintf_type(PakfireFile file) {
- if (pakfire_file_is_dir(file))
- return 'd';
-
- if (pakfire_file_is_symlink(file))
- return 'l';
-
- if (pakfire_file_is_char(file))
- return 'c';
-
- return '-';
-}
-
-static char* pakfire_file_format_perms(PakfireFile file) {
- char buffer[11];
-
- mode_t mode = pakfire_file_get_mode(file);
-
- buffer[0] = pakfire_file_sprintf_type(file);
- buffer[1] = (S_IRUSR & mode) ? 'r' : '-';
- buffer[2] = (S_IWUSR & mode) ? 'w' : '-';
- buffer[3] = (S_IXUSR & mode) ? 'x' : '-';
- buffer[4] = (S_IRGRP & mode) ? 'r' : '-';
- buffer[5] = (S_IWGRP & mode) ? 'w' : '-';
- buffer[6] = (S_IXGRP & mode) ? 'x' : '-';
- buffer[7] = (S_IROTH & mode) ? 'r' : '-';
- buffer[8] = (S_IWOTH & mode) ? 'w' : '-';
- buffer[9] = (S_IXOTH & mode) ? 'x' : '-';
- buffer[10] = '\0';
-
- #warning TODO SUID bits, etc...
-
- return strdup(buffer);
-}
-
-static char* pakfire_file_format_mtime(PakfireFile file) {
- struct tm* timer = gmtime((time_t *)&file->time);
-
- char buffer[STRING_SIZE];
- strftime(buffer, sizeof(buffer), "%d %b %Y %T", timer);
-
- return strdup(buffer);
-}
-
-PAKFIRE_EXPORT void pakfire_file_sprintf(PakfireFile file, char* str, size_t len) {
- const char* path = pakfire_file_get_path(file);
- ssize_t size = pakfire_file_get_size(file);
-
- const char* user = pakfire_file_get_user(file);
- const char* group = pakfire_file_get_group(file);
-
- char* perms = pakfire_file_format_perms(file);
- char* mtime = pakfire_file_format_mtime(file);
-
- snprintf(str, len, "%s %-8s %-8s %8d %s %s", perms, user, group,
- (int)size, mtime, path);
-
- free(perms);
- free(mtime);
-}
-
PAKFIRE_EXPORT const char* pakfire_file_get_path(PakfireFile file) {
return file->path;
}
return 0;
}
-PAKFIRE_EXPORT char pakfire_file_get_type(PakfireFile file) {
- return file->type;
-}
-
-PAKFIRE_EXPORT void pakfire_file_set_type(PakfireFile file, char type) {
- file->type = type;
-}
-
-PAKFIRE_EXPORT int pakfire_file_is_file(PakfireFile file) {
- return (file->type == REGTYPE) || (file->type == AREGTYPE);
-}
-
-PAKFIRE_EXPORT int pakfire_file_is_link(PakfireFile file) {
- return (file->type == LNKTYPE);
-}
-
-PAKFIRE_EXPORT int pakfire_file_is_symlink(PakfireFile file) {
- return (file->type == SYMTYPE);
-}
-
-PAKFIRE_EXPORT int pakfire_file_is_char(PakfireFile file) {
- return (file->type == CHRTYPE);
-}
-
-PAKFIRE_EXPORT int pakfire_file_is_block(PakfireFile file) {
- return (file->type == BLKTYPE);
-}
-
-PAKFIRE_EXPORT int pakfire_file_is_dir(PakfireFile file) {
- return (file->type == DIRTYPE);
+PAKFIRE_EXPORT int pakfire_file_get_type(PakfireFile file) {
+ return file->mode & S_IFMT;
}
PAKFIRE_EXPORT ssize_t pakfire_file_get_size(PakfireFile file) {
PakfireFile pakfire_file_unref(PakfireFile file);
int pakfire_file_cmp(PakfireFile file1, PakfireFile file2);
-void pakfire_file_sprintf(PakfireFile file, char* str, size_t len);
int pakfire_file_copy_stat(PakfireFile file, struct stat* stat);
const char* pakfire_file_get_path(PakfireFile file);
int pakfire_file_set_path(PakfireFile file, const char* path);
-char pakfire_file_get_type(PakfireFile file);
-void pakfire_file_set_type(PakfireFile file, char type);
-
-int pakfire_file_is_file(PakfireFile file);
-int pakfire_file_is_link(PakfireFile file);
-int pakfire_file_is_symlink(PakfireFile file);
-int pakfire_file_is_char(PakfireFile file);
-int pakfire_file_is_block(PakfireFile file);
-int pakfire_file_is_dir(PakfireFile file);
+int pakfire_file_get_type(PakfireFile file);
ssize_t pakfire_file_get_size(PakfireFile file);
void pakfire_file_set_size(PakfireFile file, ssize_t size);