Hi, Daniel Please apply attached patch to the pam_fprint repo. I've already sent it to maillist, but you found it a little bit dirty. I've reviewed it, and I think that I don't know how to make it clearer. For devices that don't support identify pam_fprint will build gallery, but only first print of gallery will be used - old behavior for these devices saved.
Actually I don't want to do it, because now I'm working on adding storage for fprintd (I hope I'll post patch this night), and then I'll port pam_fprint to use fprintd. Regards Vasily
From 8a5fbba08d1bb46478c2ec98ca72cbbe74ed88e1 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick <[EMAIL PROTECTED]> Date: Sun, 30 Mar 2008 12:26:19 +0300 Subject: [PATCH] Use fp_identify_finger instead of verify Signed-off-by: Vasily Khoruzhick <[EMAIL PROTECTED]> --- src/pam_fprint.c | 127 +++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 92 insertions(+), 35 deletions(-) diff --git a/src/pam_fprint.c b/src/pam_fprint.c index 847d2f0..24fc104 100644 --- a/src/pam_fprint.c +++ b/src/pam_fprint.c @@ -70,6 +70,7 @@ static int send_err_msg(pam_handle_t *pamh, char *msg) return pc->conv(1, &msgp, &resp, pc->appdata_ptr); } + static const char *fingerstr(enum fp_finger finger) { const char *names[] = { @@ -89,41 +90,91 @@ static const char *fingerstr(enum fp_finger finger) return names[finger]; } -static int find_dev_and_print(struct fp_dscv_dev **ddevs, - struct fp_dscv_print **prints, struct fp_dscv_dev **_ddev, - struct fp_dscv_print **_print) + +static struct fp_print_data **find_dev_and_prints(struct fp_dscv_dev **ddevs, + struct fp_dscv_print **prints, struct fp_dscv_dev **_ddev, enum fp_finger **fingers) { - int i = 0; + int i = 0, j = 0, err; struct fp_dscv_print *print; - struct fp_dscv_dev *ddev; + struct fp_dscv_dev *ddev = NULL; + uint16_t driver_id, driver_id_cur; + size_t prints_count = 0; + struct fp_print_data **gallery; + /* TODO: add device selection */ while (print = prints[i++]) { - ddev = fp_dscv_dev_for_dscv_print(ddevs, print); - if (ddev) { + if (!ddev) { + ddev = fp_dscv_dev_for_dscv_print(ddevs, print); + driver_id = fp_dscv_print_get_driver_id(print); *_ddev = ddev; - *_print = print; - return 0; } + if (ddev) + { + driver_id_cur = fp_dscv_print_get_driver_id(print); + if (driver_id_cur == driver_id) { + prints_count++; + } + } + } + + if (prints_count == 0) { + return NULL; + } + + gallery = malloc(sizeof(*gallery) * (prints_count + 1)); + if (gallery == NULL) { + return NULL; } - return 1; + gallery[prints_count] = NULL; + *fingers = malloc(sizeof(*fingers) * (prints_count)); + if (*fingers == NULL) { + free(gallery); + return NULL; + } + + i = 0, j = 0; + while (print = prints[i++]) { + driver_id_cur = fp_dscv_print_get_driver_id(print); + if (driver_id_cur == driver_id) { + err = fp_print_data_from_dscv_print(print, & (gallery[j])); + if (err != 0) { + gallery[j] = NULL; + break; + } + (*fingers)[j] = fp_dscv_print_get_finger(print); + j++; + } + } + + return gallery; } -static int do_verify(pam_handle_t *pamh, struct fp_dev *dev, - struct fp_print_data *data, enum fp_finger finger) +static int do_identify(pam_handle_t *pamh, struct fp_dev *dev, + struct fp_print_data **gallery, enum fp_finger *fingers) { int max_tries = 5; + size_t offset; const char *driver_name = fp_driver_get_full_name(fp_dev_get_driver(dev)); - const char *fstr = fingerstr(finger); - + const char *fstr = fingerstr(fingers[0]); + do { int r; char msg[128]; - snprintf(msg, sizeof(msg), "Scan %s finger on %s", fstr, driver_name); - msg[sizeof(msg) - 1] = 0; - send_info_msg(pamh, msg); - - r = fp_verify_finger(dev, data); + + if (fp_dev_supports_identification(dev)) { + snprintf(msg, sizeof(msg), "Scan finger on %s", driver_name); + msg[sizeof(msg) - 1] = 0; + send_info_msg(pamh, msg); + r = fp_identify_finger(dev, gallery, &offset); + + } + else { + snprintf(msg, sizeof(msg), "Scan %s finger on %s", fstr, driver_name); + msg[sizeof(msg) - 1] = 0; + send_info_msg(pamh, msg); + r = fp_verify_finger(dev, gallery[0]); + } if (r < 0) { snprintf(msg, sizeof(msg), "Fingerprint verification error %d", r); msg[sizeof(msg) - 1] = 0; @@ -164,8 +215,8 @@ static int do_auth(pam_handle_t *pamh) struct fp_dscv_dev *ddev; struct fp_dscv_print *print; struct fp_dev *dev; - struct fp_print_data *data; - enum fp_finger finger; + struct fp_print_data **gallery, **gallery_iter; + enum fp_finger *fingers; r = fp_init(); if (r < 0) @@ -180,9 +231,9 @@ static int do_auth(pam_handle_t *pamh) fp_dscv_devs_free(ddevs); return PAM_AUTHINFO_UNAVAIL; } - - r = find_dev_and_print(ddevs, prints, &ddev, &print); - if (r) { + + gallery = find_dev_and_prints(ddevs, prints, &ddev, &fingers); + if (!gallery) { fp_dscv_prints_free(prints); fp_dscv_devs_free(ddevs); send_info_msg(pamh, "Could not locate any suitable fingerprints " @@ -192,22 +243,28 @@ static int do_auth(pam_handle_t *pamh) dev = fp_dev_open(ddev); fp_dscv_devs_free(ddevs); + fp_dscv_prints_free(prints); if (!dev) { - fp_dscv_prints_free(prints); + gallery_iter = gallery; + while (*gallery_iter) { + fp_print_data_free(*gallery_iter); + gallery_iter++; + } + free(gallery); + free(fingers); return PAM_AUTHINFO_UNAVAIL; } - finger = fp_dscv_print_get_finger(print); - - r = fp_print_data_from_dscv_print(print, &data); - fp_dscv_prints_free(prints); - if (r) { - fp_dev_close(dev); - return PAM_AUTHINFO_UNAVAIL; + r = do_identify(pamh, dev, gallery, fingers); + + gallery_iter = gallery; + while (*gallery_iter) + { + fp_print_data_free(*gallery_iter); + gallery_iter++; } - - r = do_verify(pamh, dev, data, finger); - fp_print_data_free(data); + free(gallery); + free(fingers); fp_dev_close(dev); return r; } -- 1.5.4.4
_______________________________________________ fprint mailing list fprint@reactivated.net http://lists.reactivated.net/mailman/listinfo/fprint