Вопросы по демонизации
Решил вот хорошенько "раскурить эту тему". В принципе всё понятно, но хотелось бы прояснить ряд технических нюансов.
Вопросы в равной степени относятся как к
http://lisper.ru/apps/format/15
так и к
restas-0.0.7/contrib/restas-daemon.lisp
1. Непонятен следующий код:
(unless group
(setf gid
(sb-posix:passwd-gid passwd))
(setf uid
(sb-posix:passwd-uid passwd))))
Почему в (unless group ...) задаётся и uid тоже? Получается, что
если я задал &optional параметр group то я только получу gid в коде:
(when group
(setf gid
(sb-posix:group-gid (sb-posix:getgrnam group))))
.. и останусь без uid. Так вроде бы не должно быть?
2. Почему sb-posix::define-call а не sb-alien:define-alien-routine ?
3. А почему бы константу +PR_SET_KEEPCAPS+ не задать также как sb-unix:tiochnotty, а именно:
(unless (boundp 'sb-unix:+PR_SET_KEEPCAPS+)
(defconstant +PR_SET_KEEPCAPS+ 8)) и тоже послать патч?
4. Как работает initgroups ? Хотелось бы получить более чёткое видение ситуации.
Он как бы гарантирует что пользователь будет входить в группу, то есть если его нет,
то он добавляется?
5. Не понятно почему
(sb-posix::define-call "cap_from_text" (* char) null-alien (text c-string))
Нигде не описан вариант функции cap_from_text,
возвращающий строку, зато везде описано следующее определение:
cap_t cap_from_text(const char *buf_p);
Может лучше определить структуру или возвращать (void *)?
6. (sb-posix:umask 0) Так как наша Лисп-система только записывает и читает файлы
может имеет смысл установить маску так, чтобы у создаваемых файлов отбирался
флаг "x"? Тогда видимо маска будет равна = (+ 1 8 64)
7. Работа ioctl-tiocnotty и setsid. В чём суть использования этих ф-ий?
В пример простейшего демона здесь:
http://web.archive.org/web/20060603181849/http:/www.linuxprofilm.com/articles/linux-daemon-howto.html
не используется (sb-posix:ioctl fd tiocnotty), и вроде всё нормально работает.
В документации сказано что этот вызов отсоединяет процесс от терминала. Но я проверял,
что вызов setsid (правда в Си) вполне успешно отсоединяет от терминала...
8. Непонятна логика работы макроса:
(defmacro with-exit-on-error (&body body)
`(handler-case (progn ,@body)
(error (err)
(with-output-to-string (*standard-output*)
(let ((*print-escape* nil))
(print-object err *error-output*)
(write #\Newline :stream *error-output*)
(sb-ext:quit :unix-status 1))))))
Зачем выводить в строку всё что пишется в *standard-output* если
всё пишется в *error-output*? Или это опечатка?
-----------------------
9. Код:
(unless (find *daemon-command* '("start" "stop" "zap" "kill" "restart" "nodaemon") :test #'string-equal)
(with-exit-on-error
(error "Bad command-line options")))
Может имеет смысл сделать это в самом начале?
Вопросы в равной степени относятся как к
http://lisper.ru/apps/format/15
так и к
restas-0.0.7/contrib/restas-daemon.lisp
1. Непонятен следующий код:
(unless group
(setf gid
(sb-posix:passwd-gid passwd))
(setf uid
(sb-posix:passwd-uid passwd))))
Почему в (unless group ...) задаётся и uid тоже? Получается, что
если я задал &optional параметр group то я только получу gid в коде:
(when group
(setf gid
(sb-posix:group-gid (sb-posix:getgrnam group))))
.. и останусь без uid. Так вроде бы не должно быть?
2. Почему sb-posix::define-call а не sb-alien:define-alien-routine ?
3. А почему бы константу +PR_SET_KEEPCAPS+ не задать также как sb-unix:tiochnotty, а именно:
(unless (boundp 'sb-unix:+PR_SET_KEEPCAPS+)
(defconstant +PR_SET_KEEPCAPS+ 8)) и тоже послать патч?
4. Как работает initgroups ? Хотелось бы получить более чёткое видение ситуации.
Он как бы гарантирует что пользователь будет входить в группу, то есть если его нет,
то он добавляется?
5. Не понятно почему
(sb-posix::define-call "cap_from_text" (* char) null-alien (text c-string))
Нигде не описан вариант функции cap_from_text,
возвращающий строку, зато везде описано следующее определение:
cap_t cap_from_text(const char *buf_p);
Может лучше определить структуру или возвращать (void *)?
6. (sb-posix:umask 0) Так как наша Лисп-система только записывает и читает файлы
может имеет смысл установить маску так, чтобы у создаваемых файлов отбирался
флаг "x"? Тогда видимо маска будет равна = (+ 1 8 64)
7. Работа ioctl-tiocnotty и setsid. В чём суть использования этих ф-ий?
В пример простейшего демона здесь:
http://web.archive.org/web/20060603181849/http:/www.linuxprofilm.com/articles/linux-daemon-howto.html
не используется (sb-posix:ioctl fd tiocnotty), и вроде всё нормально работает.
В документации сказано что этот вызов отсоединяет процесс от терминала. Но я проверял,
что вызов setsid (правда в Си) вполне успешно отсоединяет от терминала...
8. Непонятна логика работы макроса:
(defmacro with-exit-on-error (&body body)
`(handler-case (progn ,@body)
(error (err)
(with-output-to-string (*standard-output*)
(let ((*print-escape* nil))
(print-object err *error-output*)
(write #\Newline :stream *error-output*)
(sb-ext:quit :unix-status 1))))))
Зачем выводить в строку всё что пишется в *standard-output* если
всё пишется в *error-output*? Или это опечатка?
-----------------------
9. Код:
(unless (find *daemon-command* '("start" "stop" "zap" "kill" "restart" "nodaemon") :test #'string-equal)
(with-exit-on-error
(error "Bad command-line options")))
Может имеет смысл сделать это в самом начале?
[#]
to LinkFly:
Слишком много вопросов за один раз :) Я уже не помню почему и что я делал. Ошибки, естественно, не исключены. Присылай патчи (только сначала убедись, что он рабочий ;)) - будем обсуждать. А вникать в данный момент в логику демонизации настроения нет :(