$pos1 = strrpos($data['filename'], '/'); if ($pos1) { $data['dir'] = substr($data['filename'], 0, $pos1); $data['file'] = substr($data['filename'], $pos1 + 1); } else { $data['dir'] = ''; $data['file'] = $data['filename']; } } $data['size'] = octdec(trim($data['size'])); $data['mtime'] = octdec(trim($data['mtime'])); $data['typeflag'] = octdec(trim($data['typeflag'])); if ($data['typeflag'] === '5') { $data['size'] = 0; if ($write_local) { xs_create_dir($save_filename); } } $data['offset'] = $pos; $contents = $data['size'] > 0 ? substr($str, $pos, $data['size']) : ''; $data['tmp'] = ''; // adding to list $is_file = true; if (intval($data['typeflag']) == 5) { $is_file = false; if ($data['filename']) { $dirs[] = $data['filename']; } } else { if ($data['filename']) { if (!$list_only) {
function xs_create_dir($dir) { if (!$dir) { return false; } // remove trailing / if (substr($dir, strlen($dir) - 1) === '/') { $dir = substr($dir, 0, strlen($dir) - 1); if (!$dir) { return false; } } if ($dir === '.' || $dir === '..') { return false; } $res = @mkdir($dir, 0777); if ($res) { return true; } // try to create previous directory $pos = strrpos($dir, '/'); if (!$pos) { return false; } $dir1 = substr($dir, 0, $pos); $dir2 = substr($dir, $pos + 1); if ($dir2 === '.' || $dir2 === '..') { return false; } if (!xs_create_dir($dir1)) { return false; } $res = @mkdir($dir2, 0777); return $res ? true : false; }