Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Вопросы по демонизации
LinkFly - 11.04.2010 23:27, Сообщений - 2
Решил вот хорошенько "раскурить эту тему". В принципе всё понятно, но хотелось бы прояснить ряд технических нюансов.

Вопросы в равной степени относятся как к
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:

Слишком много вопросов за один раз :) Я уже не помню почему и что я делал. Ошибки, естественно, не исключены. Присылай патчи (только сначала убедись, что он рабочий ;)) - будем обсуждать. А вникать в данный момент в логику демонизации настроения нет :(
archimag - 12.04.2010 10:25
[#]
Ок, "допилю" эту тему и вышли патч.
LinkFly - 12.04.2010 13:50
@2009-2010 lisper.ru