Атрибуты устройств, или ioctl must die



В процессе работы над ОС Фантом, которая вообще не Юникс никаким местом, мне, тем не менее, захотелось сделать в нём Unix-compatible подсистему. Не то, чтобы прямо POSIX, но что-то достаточно близкое. Отчасти из любопытства, отчасти для удобства, отчасти как ещё один migration path. (Ну и вообще было интересно, насколько трудно написать простенький Юникс «из головы».) В качестве цели номер 1 была поставлена задача запустить quake 1 for Unix, которая и была достигнута.



В процессе, естественно, появились open/close/r/w/ioctl, и появилось ощущение, что последний неприлично, постыдно устарел. В качестве упражнения для размятия мозга я реализовал (в дополнение к обычному ioctl) некоторый альтернативный API, который бы позволил управлять свойствами устройств более гибким и удобным с точки зрения пользователя способом. Этот API, конечно, имеет свои очевидны минусы, и, в целом, эта статья — RFC, aka request For Comments.



Итак, API на уровне пользователя:



// returns name of property with sequential number nProperty, or error

errno_t listproperties( int fd, int nProperty, char *buf, int buflen );



errno_t getproperty( int fd, const char *pName, char *buf, int buflen );

errno_t setproperty( int fd, const char *pName, const char *pValue );





Правила:





Никаких дефайнов с номерами, только имена.

Никаких бинарных данных, только строки



Подробнее: https://habrahabr.ru/post/282415/