/* * Open a file specified by a parsed file name (which may be only a * device). */ int zopen_file(i_ctx_t *i_ctx_p, const gs_parsed_file_name_t *pfn, const char *file_access, stream **ps, gs_memory_t *mem) { gx_io_device *const iodev = pfn->iodev; if (pfn->fname == NULL) /* just a device */ return iodev->procs.open_device(iodev, file_access, ps, mem); else { /* file */ iodev_proc_open_file((*open_file)) = iodev->procs.open_file; if (open_file == 0) open_file = iodev_os_open_file; /* Check OS files to make sure we allow the type of access */ if (open_file == iodev_os_open_file) { int code = check_file_permissions(i_ctx_p, pfn->fname, pfn->len, file_access[0] == 'r' ? "PermitFileReading" : "PermitFileWriting"); if (code < 0 && !file_is_tempfile(i_ctx_p, (const uchar *)pfn->fname, pfn->len)) return code; } return open_file(iodev, pfn->fname, pfn->len, file_access, ps, mem); } }
/* <string1> <string2> renamefile - */ static int zrenamefile(i_ctx_t *i_ctx_p) { int code; os_ptr op = osp; gs_parsed_file_name_t pname1, pname2; code = parse_real_file_name(op, &pname2, imemory, "renamefile(to)"); if (code < 0) return code; pname1.fname = 0; code = parse_real_file_name(op - 1, &pname1, imemory, "renamefile(from)"); if (code >= 0) { gx_io_device *iodev_dflt = iodev_default(imemory); if (pname1.iodev != pname2.iodev ) { if (pname1.iodev == iodev_dflt) pname1.iodev = pname2.iodev; if (pname2.iodev == iodev_dflt) pname2.iodev = pname1.iodev; } if (pname1.iodev != pname2.iodev || (pname1.iodev == iodev_dflt && /* * We require FileControl permissions on the source path * unless it is a temporary file. Also, we require FileControl * and FileWriting permissions to the destination file/path. */ ((check_file_permissions(i_ctx_p, pname1.fname, pname1.len, "PermitFileControl") < 0 && !file_is_tempfile(i_ctx_p, op[-1].value.bytes, r_size(op - 1))) || (check_file_permissions(i_ctx_p, pname2.fname, pname2.len, "PermitFileControl") < 0 || check_file_permissions(i_ctx_p, pname2.fname, pname2.len, "PermitFileWriting") < 0 )))) { code = gs_note_error(e_invalidfileaccess); } else { code = (*pname1.iodev->procs.rename_file)(pname1.iodev, pname1.fname, pname2.fname); } } gs_free_file_name(&pname2, "renamefile(to)"); gs_free_file_name(&pname1, "renamefile(from)"); if (code < 0) return code; pop(2); return 0; }
/* <string> deletefile - */ static int zdeletefile(i_ctx_t *i_ctx_p) { os_ptr op = osp; gs_parsed_file_name_t pname; int code = parse_real_file_name(op, &pname, imemory, "deletefile"); if (code < 0) return code; if (pname.iodev == iodev_default) { if ((code = check_file_permissions(i_ctx_p, pname.fname, pname.len, "PermitFileControl")) < 0 && !file_is_tempfile(i_ctx_p, op->value.bytes, r_size(op))) { return code; } } code = (*pname.iodev->procs.delete_file)(pname.iodev, pname.fname); gs_free_file_name(&pname, "deletefile"); if (code < 0) return code; pop(1); return 0; }