38 phar_wrapper_open_url,
64 size_t arch_len, entry_len;
78 php_stream_wrapper_log_error(wrapper,
options,
"phar error: no directory in \"%s\", must have at least phar://%s/ for root directory (always use full path to a new phar)", filename, arch);
88 resource->
host = zend_string_init(arch, arch_len, 0);
90 resource->
path = zend_string_init(entry, entry_len, 0);
95 fprintf(stderr,
"Alias: %s\n", alias);
106 if (
mode[0] ==
'w' || (
mode[0] ==
'r' &&
mode[1] ==
'+')) {
170 zval *pzoption, *metadata;
194 if (
mode[0] ==
'w' || (
mode[0] ==
'r' &&
mode[1] ==
'+')) {
202 efree(internal_file);
211 efree(internal_file);
214 pharcontext =
HASH_OF(pzoption);
241 efree(internal_file);
249 efree(internal_file);
257 if (stream ==
NULL) {
260 efree(internal_file);
264 stream = phar_get_pharfp(phar);
290 efree(internal_file);
303 efree(internal_file);
310 fprintf(stderr,
"Pharname: %s\n", idata->
phar->filename);
311 fprintf(stderr,
"Filename: %s\n", internal_file);
324 efree(internal_file);
347 efree(internal_file);
357static int phar_stream_close(
php_stream *stream,
int close_handle)
360 phar_stream_flush(stream);
377 if (
data->internal_file->link) {
380 entry =
data->internal_file;
409 if (
data->internal_file->link) {
412 entry =
data->internal_file;
432 if (temp < data->zero) {
438 data->position = *newoffset;
457 data->internal_file->uncompressed_filesize =
data->position;
459 data->internal_file->compressed_filesize =
data->internal_file->uncompressed_filesize;
460 data->internal_file->old_flags =
data->internal_file->flags;
461 data->internal_file->is_modified = 1;
469static int phar_stream_flush(
php_stream *stream)
474 if (
data->internal_file->is_modified) {
475 data->internal_file->timestamp =
time(0);
496 if (!is_temp_dir && !
data->is_dir) {
497 ssb->
sb.st_size =
data->uncompressed_filesize;
499 ssb->
sb.st_mode |= S_IFREG;
501 ssb->
sb.st_mtime =
data->timestamp;
502 ssb->
sb.st_atime =
data->timestamp;
503 ssb->
sb.st_ctime =
data->timestamp;
504 }
else if (!is_temp_dir &&
data->is_dir) {
507 ssb->
sb.st_mode |= S_IFDIR;
509 ssb->
sb.st_mtime =
data->timestamp;
510 ssb->
sb.st_atime =
data->timestamp;
511 ssb->
sb.st_ctime =
data->timestamp;
514 ssb->
sb.st_mode = 0777;
515 ssb->
sb.st_mode |= S_IFDIR;
521 ssb->
sb.st_mode = (ssb->
sb.st_mode & 0555) | (ssb->
sb.st_mode & ~0777);
524 ssb->
sb.st_nlink = 1;
525 ssb->
sb.st_rdev = -1;
527 ssb->
sb.st_dev = 0xc;
530 ssb->
sb.st_ino =
data->inode;
533 ssb->
sb.st_blksize = -1;
534 ssb->
sb.st_blocks = -1;
563 char *internal_file, *
error;
566 size_t internal_file_len;
598 if (*internal_file ==
'\0') {
608 internal_file_len =
strlen(internal_file);
610 if (
NULL != (entry = zend_hash_str_find_ptr(&phar->
manifest, internal_file, internal_file_len))) {
615 if (zend_hash_str_exists(&(phar->
virtual_dirs), internal_file, internal_file_len)) {
632 if (
NULL == (entry = zend_hash_find_ptr(&phar->
manifest, str_key))) {
649 if (
NULL == (entry = zend_hash_str_find_ptr(&phar->
manifest, internal_file, internal_file_len))) {
670 char *internal_file, *
error;
671 int internal_file_len;
714 efree(internal_file);
724 efree(internal_file);
730 efree(internal_file);
742 php_url *resource_from, *resource_to;
752 php_error_docref(
NULL,
E_WARNING,
"phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"", url_from, url_to, url_from);
769 php_error_docref(
NULL,
E_WARNING,
"phar error: cannot rename \"%s\" to \"%s\": invalid or non-writable url \"%s\"", url_from, url_to, url_to);
785 if (!zend_string_equals(resource_from->
host, resource_to->
host)) {
793 if (!resource_from->
scheme || !resource_from->
host || !resource_from->
path) {
800 if (!resource_to->
scheme || !resource_to->
host || !resource_to->
path) {
845 php_error_docref(
NULL,
E_WARNING,
"phar error: cannot rename \"%s\" to \"%s\" from extracted phar archive, source has been deleted", url_from, url_to);
851 entry->is_deleted = 1;
854 entry->link = entry->tmp =
NULL;
871 entry->is_modified = 1;
872 entry->filename_len =
strlen(entry->filename);
880 php_error_docref(
NULL,
E_WARNING,
"phar error: cannot rename \"%s\" to \"%s\" from extracted phar archive, source does not exist", url_from, url_to);
897 if (!entry->is_deleted &&
902 new_str_key = zend_string_alloc(
ZSTR_LEN(str_key) + to_len - from_len, 0);
908 entry->is_modified = 1;
909 efree(entry->filename);
912 entry->filename_len =
ZSTR_LEN(new_str_key);
915 b->
h = zend_string_hash_val(new_str_key);
916 b->
key = new_str_key;
923 if (zend_string_starts_with_cstr(str_key,
ZSTR_VAL(resource_from->
path)+1, from_len) &&
926 new_str_key = zend_string_alloc(
ZSTR_LEN(str_key) + to_len - from_len, 0);
932 b->
h = zend_string_hash_val(new_str_key);
933 b->
key = new_str_key;
940 if (zend_string_starts_with_cstr(str_key,
ZSTR_VAL(resource_from->
path)+1, from_len) &&
943 new_str_key = zend_string_alloc(
ZSTR_LEN(str_key) + to_len - from_len, 0);
949 b->
h = zend_string_hash_val(new_str_key);
950 b->
key = new_str_key;
fprintf($stream, string $format, mixed ... $values)
strrchr(string $haystack, string $needle, bool $before_needle=false)
count(Countable|array $value, int $mode=COUNT_NORMAL)
int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context)
int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mode, int options, php_stream_context *context)
php_stream * phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
void phar_metadata_tracker_free(phar_metadata_tracker *tracker, bool persistent)
void phar_entry_remove(phar_entry_data *idata, char **error)
zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip)
void phar_flush(phar_archive_data *phar, char **error)
zend_result phar_split_fname(const char *filename, size_t filename_len, char **arch, size_t *arch_len, char **entry, size_t *entry_len, int executable, int for_create)
zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data **pphar, char **error)
void phar_request_initialize(void)
void phar_entry_delref(phar_entry_data *idata)
zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data **pphar, char **error)
phar_entry_info * phar_get_link_source(phar_entry_info *entry)
#define PHAR_ENT_PERM_MASK
zend_result phar_copy_entry_fp(phar_entry_info *source, phar_entry_info *dest, char **error)
phar_entry_data * phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, int security)
struct _phar_archive_data phar_archive_data
#define PHAR_ENT_COMPRESSION_MASK
zend_result phar_open_archive_fp(phar_archive_data *phar)
zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t filename_len, char *path, size_t path_len)
zend_result phar_get_entry_data(phar_entry_data **ret, char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, int security)
struct _phar_entry_info phar_entry_info
struct _phar_entry_data phar_entry_data
zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error)
zend_result phar_copy_on_write(phar_archive_data **pphar)
PHP_JSON_API size_t int options
#define php_stream_stat_path(path, ssb)
struct _php_stream_wrapper_ops php_stream_wrapper_ops
struct _php_stream php_stream
struct _php_stream_context php_stream_context
#define php_stream_read(stream, buf, count)
#define STREAM_OPEN_FOR_INCLUDE
#define php_stream_seek(stream, offset, whence)
#define php_stream_tell(stream)
struct _php_stream_ops php_stream_ops
struct _php_stream_wrapper php_stream_wrapper
#define php_stream_alloc(ops, thisptr, persistent_id, mode)
#define PHP_STREAM_URL_STAT_QUIET
struct _php_stream_statbuf php_stream_statbuf
#define php_stream_write(stream, buf, count)
PHPAPI void php_stream_wrapper_log_error(const php_stream_wrapper *wrapper, int options, const char *fmt,...) PHP_ATTRIBUTE_FORMAT(printf
void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, bool is_temp_dir)
const php_stream_wrapper php_stream_phar_wrapper
php_url * phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options)
phar_entry_info * internal_file
uint32_t compressed_filesize
phar_metadata_tracker metadata_tracker
uint32_t uncompressed_filesize
php_stream_wrapper * wrapper
PHPAPI void php_url_free(php_url *theurl)
#define estrndup(s, length)
#define ecalloc(nmemb, size)
strncmp(string $string1, string $string2, int $length)
zend_string_release_ex(func->internal_function.function_name, 0)
#define strncasecmp(s1, s2, n)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *str, size_t len)
#define ZEND_HASH_MAP_FOREACH_BUCKET(ht, _bucket)
#define HT_IS_INITIALIZED(ht)
#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key)
#define ZEND_HASH_FOREACH_END()
struct _zend_string zend_string
#define UNEXPECTED(condition)
#define ZSTR_INIT_LITERAL(s, persistent)
#define zend_string_equals_literal_ci(str, c)
struct _zend_array HashTable
#define ZVAL_COPY_DEREF(z, v)