}
/* }}} */
+int phar_detect_phar_fname_ext(const char *filename, int check_length, char **ext_str, int *ext_len) /* {{{ */
+{
+ char end;
+ char *pos_p = strstr(filename, ".phar.php");
+ char *pos_z = strstr(filename, ".phar.gz");
+ char *pos_b = strstr(filename, ".phar.bz2");
+
+ if (pos_p) {
+ if (pos_z) {
+ return FAILURE;
+ }
+ *ext_str = pos_p;
+ *ext_len = 9;
+ } else if (pos_z) {
+ *ext_str = pos_z;
+ *ext_len = 8;
+ } else if (pos_b) {
+ *ext_str = pos_b;
+ *ext_len = 9;
+ } else if ((pos_p = strstr(filename, ".phar")) != NULL) {
+ *ext_str = pos_p;
+ *ext_len = 5;
+ } else {
+ return FAILURE;
+ }
+ if (check_length && (*ext_str)[*ext_len] != '\0') {
+ return FAILURE;
+ }
+ end = (*ext_str)[*ext_len];
+ if (end != '\0' && end != '/' && end != '\\') {
+ return FAILURE;
+ }
+ return SUCCESS;
+}
+/* }}} */
+
/**
* Process a phar stream name, ensuring we can handle any of:
*
- * - phar://whatever.phar
* - whatever.phar
* - whatever.phar.gz
* - whatever.phar.bz2
+ * - whatever.phar.php
+ *
+ * Optionally the name might start with 'phar://'
*
* This is used by phar_open_url()
*/
int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_len, char **entry, int *entry_len TSRMLS_DC) /* {{{ */
{
- char *pos_p, *pos_z, *pos_b, *ext_str;
+ char *ext_str;
int ext_len;
if (!strncasecmp(filename, "phar://", 7)) {
filename_len -= 7;
}
- pos_p = strstr(filename, ".phar.php");
- pos_z = strstr(filename, ".phar.gz");
- pos_b = strstr(filename, ".phar.bz2");
- if (pos_p) {
- if (pos_z) {
- return FAILURE;
- }
- ext_str = pos_p;
- ext_len = 9;
- } else if (pos_z) {
- ext_str = pos_z;
- ext_len = 8;
- } else if (pos_b) {
- ext_str = pos_b;
- ext_len = 9;
- } else if ((pos_p = strstr(filename, ".phar")) != NULL) {
- ext_str = pos_p;
- ext_len = 5;
- } else {
+ if (phar_detect_phar_fname_ext(filename, 0, &ext_str, &ext_len) == FAILURE) {
return FAILURE;
}
+
*arch_len = ext_str - filename + ext_len;
*arch = estrndup(filename, *arch_len);
if (ext_str[ext_len]) {