/* The user has just finished mounting/unmounting this path. * Update the list of user-mounted filesystems. */ void mount_user_mount(const char *path) { if (mount_is_mounted(path, NULL, NULL)) g_hash_table_insert(user_mounts, pathdup(path), "yes"); else g_hash_table_remove(user_mounts, path); }
/* Bring this item's structure uptodate. * 'parent' is optional; it saves one stat() for directories. */ void diritem_restat(const guchar *path, DirItem *item, struct stat *parent) { struct stat info; if (item->_image) { g_object_unref(item->_image); item->_image = NULL; } item->flags = 0; item->mime_type = NULL; if (mc_lstat(path, &info) == -1) { item->lstat_errno = errno; item->base_type = TYPE_ERROR; item->size = 0; item->mode = 0; item->mtime = item->ctime = item->atime = 0; item->uid = (uid_t) -1; item->gid = (gid_t) -1; } else { guchar *target_path; item->lstat_errno = 0; item->size = info.st_size; item->mode = info.st_mode; item->atime = info.st_atime; item->ctime = info.st_ctime; item->mtime = info.st_mtime; item->uid = info.st_uid; item->gid = info.st_gid; if (ABOUT_NOW(item->mtime) || ABOUT_NOW(item->ctime)) item->flags |= ITEM_FLAG_RECENT; if (xattr_have(path)) item->flags |= ITEM_FLAG_HAS_XATTR; item->label = xlabel_get(path); if (S_ISLNK(info.st_mode)) { if (mc_stat(path, &info)) item->base_type = TYPE_ERROR; else item->base_type = mode_to_base_type(info.st_mode); item->flags |= ITEM_FLAG_SYMLINK; target_path = pathdup(path); } else { item->base_type = mode_to_base_type(info.st_mode); target_path = (guchar *) path; } if (item->base_type == TYPE_DIRECTORY) { if (mount_is_mounted(target_path, &info, target_path == path ? parent : NULL)) item->flags |= ITEM_FLAG_MOUNT_POINT | ITEM_FLAG_MOUNTED; else if (g_hash_table_lookup(fstab_mounts, target_path)) item->flags |= ITEM_FLAG_MOUNT_POINT; } if (path != target_path) g_free(target_path); } if (item->base_type == TYPE_DIRECTORY) { /* KRJW: info.st_uid will be the uid of the dir, regardless * of whether `path' is a dir or a symlink to one. Note that * if path is a symlink to a dir, item->uid will be the uid * of the *symlink*, but we really want the uid of the dir * to which the symlink points. */ examine_dir(path, item, &info); } else if (item->base_type == TYPE_FILE) { if (item->flags & ITEM_FLAG_SYMLINK) { guchar *link_path; link_path = pathdup(path); item->mime_type = type_from_path(link_path ? link_path : path); g_free(link_path); } else item->mime_type = type_from_path(path); /* Note: for symlinks we need the mode of the target */ if (info.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) { /* Note that the flag is set for ALL executable * files, but the mime_type must also be executable * for clicking on the file to run it. */ item->flags |= ITEM_FLAG_EXEC_FILE; if (item->mime_type == NULL || item->mime_type == application_octet_stream) { item->mime_type = application_executable; } else if (item->mime_type == text_plain && !strchr(item->leafname, '.')) { item->mime_type = application_x_shellscript; } } else if (item->mime_type == application_x_desktop) { item->flags |= ITEM_FLAG_EXEC_FILE; } if (!item->mime_type) item->mime_type = text_plain; check_globicon(path, item); if (item->mime_type == application_x_desktop && item->_image == NULL) { item->_image = g_fscache_lookup(desktop_icon_cache, path); } } else check_globicon(path, item); if (!item->mime_type) item->mime_type = mime_type_from_base_type(item->base_type); }