Primeiro, tenha em mente que não é muito convencional que a lógica de código do seu módulo seja alterada de acordo com os resultados de outros módulos: isso geralmente é feito usando sinalizadores de controle, como required
e requisite
, que controlam quais módulos ser chamado, em que situações (ou seja, de acordo com o status atual da cadeia, os resultados dos módulos anteriores). Com isso em mente, você pode imaginar adaptar o comportamento do seu módulo desta maneira:
auth [success=1] default_pam.so
auth [success=done default=die] my_custom_pam.so default_failed
auth requisite my_custom_pam.so
Essa cadeia tem a seguinte lógica:
- Se o módulo padrão for bem-sucedido, marque-o como validado (implícito por
success=1
) e ignore 1 módulo. A cadeia alcançamy_custom_pam
chamado sem argumento, o que terá que ser bem-sucedido (requisite
). - Se o módulo padrão falhar, não pule nada. A cadeia alcança
my_custom_pam
, chamado com um argumento,default_failed
. A cadeia parará após este módulo (done
oudie
) e determinará o resultado geral.
Aqui, o elemento-chave é o argumento passado para my_custom_pam
. Ao verificar argc
e argv
na sua rotina pam_sm_authenticate
, você poderá adaptar sua lógica de acordo com o status atual da cadeia.