Я пишу сервер на PHP (в частности, сервер SFTP). Базовый протокол предоставляет объекту ту же семантику, что и POSIX. открыть функция (в частности, она поддерживает O_READ, O_WRITE, O_RDWR, O_CREAT, O_APPEND, O_EXCL).
Однако PHP Еореп, работая с потоками, использует другую семантику (‘r’, ‘r +’, ‘w’ ….).
Существует ли согласованный способ интерпретации семантики первого с использованием реализации последнего?
Исходный код 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;
}
Других решений пока нет …