req::ptr<File> PhpStreamWrapper::open(const String& filename, const String& mode, int options, const req::ptr<StreamContext>& context) { if (strncasecmp(filename.c_str(), "php://", 6)) { return nullptr; } const char *req = filename.c_str() + sizeof("php://") - 1; if (!strcasecmp(req, "stdin")) { return req::make<PlainFile>(dup(STDIN_FILENO), true, s_php); } if (!strcasecmp(req, "stdout")) { return req::make<PlainFile>(dup(STDOUT_FILENO), true, s_php); } if (!strcasecmp(req, "stderr")) { return req::make<PlainFile>(dup(STDERR_FILENO), true, s_php); } if (!strncasecmp(req, "fd/", sizeof("fd/") - 1)) { return openFD(req + sizeof("fd/") - 1); } if (!strncasecmp(req, "filter/", sizeof("filter/") - 1)) { return phpStreamOpenFilter(req + sizeof("filter") - 1, mode, options, context); } if (!strncasecmp(req, "temp", sizeof("temp") - 1)) { auto file = req::make<TempFile>(true, s_php, s_temp); if (!file->valid()) { raise_warning("Unable to create temporary file"); return nullptr; } return file; } if (!strcasecmp(req, "memory")) { auto file = req::make<TempFile>(true, s_php, s_memory); if (!file->valid()) { raise_warning("Unable to create temporary file"); return nullptr; } return file; } if (!strcasecmp(req, "input")) { auto raw_post = g_context->getRawPostData(); return req::make<MemFile>( raw_post.c_str(), raw_post.size(), s_php, s_input); } if (!strcasecmp(req, "output")) { return req::make<OutputFile>(filename); } return nullptr; }
File* PhpStreamWrapper::open(CStrRef filename, CStrRef mode, int options, CVarRef context) { if (strncasecmp(filename.c_str(), "php://", 6)) { return nullptr; } const char *req = filename.c_str() + sizeof("php://") - 1; if (!strcasecmp(req, "stdin")) { return NEWOBJ(PlainFile)(dup(STDIN_FILENO), true); } if (!strcasecmp(req, "stdout")) { return NEWOBJ(PlainFile)(dup(STDOUT_FILENO), true); } if (!strcasecmp(req, "stderr")) { return NEWOBJ(PlainFile)(dup(STDERR_FILENO), true); } if (!strncasecmp(req, "fd/", sizeof("fd/") - 1)) { return openFD(req + sizeof("fd/") - 1); } if (!strncasecmp(req, "temp", sizeof("temp") - 1) || !strcasecmp(req, "memory")) { std::unique_ptr<TempFile> file(NEWOBJ(TempFile)()); if (!file->valid()) { raise_warning("Unable to create temporary file"); return nullptr; } return file.release(); } if (!strcasecmp(req, "input")) { Transport *transport = g_context->getTransport(); if (transport) { int size = 0; const void *data = transport->getPostData(size); if (data && size) { return NEWOBJ(MemFile)((const char *)data, size); } } return NEWOBJ(MemFile)(nullptr, 0); } if (!strcasecmp(req, "output")) { return NEWOBJ(OutputFile)(filename); } return nullptr; }
File* PhpStreamWrapper::open(const String& filename, const String& mode, int options, CVarRef context) { if (strncasecmp(filename.c_str(), "php://", 6)) { return nullptr; } const char *req = filename.c_str() + sizeof("php://") - 1; if (!strcasecmp(req, "stdin")) { return NEWOBJ(PlainFile)(dup(STDIN_FILENO), true); } if (!strcasecmp(req, "stdout")) { return NEWOBJ(PlainFile)(dup(STDOUT_FILENO), true); } if (!strcasecmp(req, "stderr")) { return NEWOBJ(PlainFile)(dup(STDERR_FILENO), true); } if (!strncasecmp(req, "fd/", sizeof("fd/") - 1)) { return openFD(req + sizeof("fd/") - 1); } if (!strncasecmp(req, "temp", sizeof("temp") - 1) || !strcasecmp(req, "memory")) { std::unique_ptr<TempFile> file(NEWOBJ(TempFile)()); if (!file->valid()) { raise_warning("Unable to create temporary file"); return nullptr; } return file.release(); } if (!strcasecmp(req, "input")) { auto raw_post = g_context->getRawPostData(); return NEWOBJ(MemFile)(raw_post.c_str(), raw_post.size()); } if (!strcasecmp(req, "output")) { return NEWOBJ(OutputFile)(filename); } return nullptr; }