static int FuseHFS_unlink(const char *path) { dprintf("unlink %s\n", path); if (_readonly) return -EPERM; // convert to hfs path char *hfspath = mkhfspath(path); if (hfspath == NULL) return -ENOENT; // check that file exists hfsdirent ent; if (hfs_stat(NULL, hfspath, &ent) == -1) { free(hfspath); dprintf("unlink: ENOENT\n"); return -ENOENT; } // check that it's a file if (ent.flags & HFS_ISDIR) { free(hfspath); dprintf("unlink: EISDIR\n"); return -EISDIR; } // delete it if (hfs_delete(NULL, hfspath) == -1) { free(hfspath); perror("unlink(2)"); return -errno; } free(hfspath); return 0; }
static int FuseHFS_rename(const char *from, const char *to) { dprintf("rename %s %s\n", from, to); if (_readonly) return -EPERM; // convert to hfs paths char *hfspath1 = mkhfspath(from); char *hfspath2 = mkhfspath(to); // delete destination file if it exists hfsdirent ent; if (hfs_stat(NULL, hfspath2, &ent) == 0) if (!(ent.flags & HFS_ISDIR)) hfs_delete(NULL, hfspath2); // rename if (hfs_rename(NULL, hfspath1, hfspath2) != 0) { free(hfspath1); free(hfspath2); perror("hfs_rename"); return -errno; } // bless parent folder if it's a system file if (hfs_stat(NULL, hfspath2, &ent) == -1) { free(hfspath1); free(hfspath2); return -ENOENT; } if ((strcmp(ent.u.file.type, "zsys") == 0) && (strcmp(ent.u.file.creator, "MACS") == 0) && (strcmp(ent.name, "System") == 0)) { // bless dprintf("rename: blessing folder %lu\n", ent.parid); hfsvolent volent; hfs_vstat(NULL, &volent); volent.blessed = ent.parid; hfs_vsetattr(NULL, &volent); } // success free(hfspath1); free(hfspath2); return 0; }
/* * NAME: hdel->main() * DESCRIPTION: implement hdel command */ int hdel_main(int argc, char *argv[]) { hfsvol *vol; int fargc; char **fargv; int i, result = 0; if (argc < 2) { fprintf(stderr, "Usage: %s hfs-path [...]\n", argv0); return 1; } vol = hfsutil_remount(hcwd_getvol(-1), HFS_MODE_ANY); if (vol == 0) return 1; fargv = hfsutil_glob(vol, argc - 1, &argv[1], &fargc, &result); if (result == 0) { for (i = 0; i < fargc; ++i) { if (hfs_delete(vol, fargv[i]) == -1) { hfsutil_perrorp(fargv[i]); result = 1; } } } hfsutil_unmount(vol, &result); if (fargv) free(fargv); return result; }