MCPcopy Create free account
hub / github.com/ddnet/ddnet / OpenFile

Method OpenFile

src/engine/shared/storage.cpp:508–562  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

506 }
507
508 IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = nullptr, int BufferSize = 0) override
509 {
510 TranslateType(Type, pFilename);
511
512 dbg_assert((Flags & IOFLAG_WRITE) == 0 || Type == TYPE_SAVE || Type == TYPE_ABSOLUTE, "IOFLAG_WRITE only usable with TYPE_SAVE and TYPE_ABSOLUTE");
513
514 char aBuffer[IO_MAX_PATH_LENGTH];
515 if(!pBuffer)
516 {
517 pBuffer = aBuffer;
518 BufferSize = sizeof(aBuffer);
519 }
520 pBuffer[0] = '\0';
521
522 if(Type == TYPE_ABSOLUTE)
523 {
524 return io_open(GetPath(TYPE_ABSOLUTE, pFilename, pBuffer, BufferSize), Flags);
525 }
526
527 if(str_startswith(pFilename, "mapres/../skins/"))
528 {
529 pFilename = pFilename + str_length("mapres/../");
530 }
531 if(pFilename[0] == '/' || pFilename[0] == '\\' || str_find(pFilename, "../") != nullptr || str_find(pFilename, "..\\") != nullptr
532#ifdef CONF_FAMILY_WINDOWS
533 || (pFilename[0] && pFilename[1] == ':')
534#endif
535 )
536 {
537 // don't escape base directory
538 return nullptr;
539 }
540 else if(Type == TYPE_ALL)
541 {
542 // check all available directories
543 for(int i = TYPE_SAVE; i < m_NumPaths; ++i)
544 {
545 IOHANDLE Handle = io_open(GetPath(i, pFilename, pBuffer, BufferSize), Flags);
546 if(Handle)
547 {
548 return Handle;
549 }
550 }
551 return nullptr;
552 }
553 else if(Type >= TYPE_SAVE && Type < m_NumPaths)
554 {
555 // check wanted directory
556 return io_open(GetPath(Type, pFilename, pBuffer, BufferSize), Flags);
557 }
558 else
559 {
560 dbg_assert_failed("Type invalid");
561 }
562 }
563
564 template<typename F>
565 bool GenericExists(const char *pFilename, int Type, F &&CheckFunction) const

Callers 1

LoadPathsFromFileMethod · 0.45

Calls 4

io_openFunction · 0.85
str_startswithFunction · 0.85
str_lengthFunction · 0.85
str_findFunction · 0.85

Tested by

no test coverage detected