Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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;
}