Ho due perplessita`:una sul metodo usato per definire il dominio e una sulla variabile che darai in pasto al sistema.

METODO sw
Piu` che una serie di if, che in caso di modifica ti obbligano a rivedere tutto il codice, io avrei usato una hash: una cosa del tipo:
codice:
my %domini = ('DOM1','dominio1.com' , 'DOM2','dominio2.it' , 'DOM3','dominio3.com');  # nella parte iniziale del file
...

  if($user =~/(.+)\@(.+)/) {$user=$1; $domi=$2; }   # occhio che qui ti mancava una parentesi
  foreach($k=keys(%domini)) {
    if($domini{$k} eq $domi) { $domi = $k; break; }   # controlla la sintassi !!
  }
  $user = '\@'.$domi.'\\\\'.$user;
  if(($res=pam_start("login", $user, \&pam_conv_func, $pamh))!=PAM_SUCCESS ...
VARIABILE
Nel tuo sistema vecchio (funzionante) tu davi in pasto alla funzione pam_start il singolo nome dell'utente (se ho capito giusto), mentre ora dai una coppia @dominio\\user: non so se il sistema lo accetta


E comunque fatti sempre fare una stampa (magari commenta anche la riga che chiama il pam), in modo da verificare cosa effettivamente contengono le variabili ch edai in pasto alla "scatola nera".