Воссоздание открытого поведения POSIX в переполнении стека

Я пишу сервер на PHP (в частности, сервер SFTP). Базовый протокол предоставляет объекту ту же семантику, что и POSIX. открыть функция (в частности, она поддерживает O_READ, O_WRITE, O_RDWR, O_CREAT, O_APPEND, O_EXCL).

Однако PHP Еореп, работая с потоками, использует другую семантику (‘r’, ‘r +’, ‘w’ ….).

Существует ли согласованный способ интерпретации семантики первого с использованием реализации последнего?

0

Решение

Исходный код PHP приходит на помощь о картировании fopen() режимы для open() комбинации флагов.

Наоборот, не все комбинации open() карта флагов к существующей fopen() Режим. Некоторые из комбинаций, вероятно, не действительны; Я не знаю как open() относится к ним.

/* parse standard "fopen" modes into open() flags */
PHPAPI int php_stream_parse_fopen_modes(const char *mode, int *open_flags)
{
int flags;

switch (mode[0]) {
case 'r':
flags = 0;
break;
case 'w':
flags = O_TRUNC|O_CREAT;
break;
case 'a':
flags = O_CREAT|O_APPEND;
break;
case 'x':
flags = O_CREAT|O_EXCL;
break;
case 'c':
flags = O_CREAT;
break;
default:
/* unknown mode */
return FAILURE;
}

if (strchr(mode, '+')) {
flags |= O_RDWR;
} else if (flags) {
flags |= O_WRONLY;
} else {
flags |= O_RDONLY;
}

#if defined(O_CLOEXEC)
if (strchr(mode, 'e')) {
flags |= O_CLOEXEC;
}
#endif

#if defined(O_NONBLOCK)
if (strchr(mode, 'n')) {
flags |= O_NONBLOCK;
}
#endif

#if defined(_O_TEXT) && defined(O_BINARY)
if (strchr(mode, 't')) {
flags |= _O_TEXT;
} else {
flags |= O_BINARY;
}
#endif

*open_flags = flags;
return SUCCESS;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]