Sorry, last patch introduced regression for devices that do not support 
identification. New one fixes that.

Regards
Vasily
From 3877543fcef46e1dce9fcae89157871a6d144ca9 Mon Sep 17 00:00:00 2001
From: Vasily Khoruzhick <[EMAIL PROTECTED]>
Date: Fri, 15 Feb 2008 15:48:50 +0200
Subject: [PATCH] Use fp_identify_finger instead of verify


Signed-off-by: Vasily Khoruzhick <[EMAIL PROTECTED]>
---
 src/pam_fprint.c |   91 ++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 61 insertions(+), 30 deletions(-)

diff --git a/src/pam_fprint.c b/src/pam_fprint.c
index 847d2f0..3e7e7d9 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[] = {
@@ -88,42 +89,73 @@ static const char *fingerstr(enum fp_finger finger)
 		return "UNKNOWN";
 	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)
 {
-	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));
+	gallery[prints_count] = 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;
+			}
+			j++;
 		}
 	}
-	return 1;
+	
+	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)
 {
 	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);
-
+	
 	do {
 		int r;
 		char msg[128];
 
-		snprintf(msg, sizeof(msg), "Scan %s finger on %s", fstr, driver_name);
+		snprintf(msg, sizeof(msg), "Scan finger on %s", driver_name);
 		msg[sizeof(msg) - 1] = 0;
 		send_info_msg(pamh, msg);
 
-		r = fp_verify_finger(dev, data);
+		r = fp_identify_finger(dev, gallery, &offset);
 		if (r < 0) {
 			snprintf(msg, sizeof(msg), "Fingerprint verification error %d", r);
 			msg[sizeof(msg) - 1] = 0;
@@ -164,8 +196,7 @@ 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;
 
 	r = fp_init();
 	if (r < 0)
@@ -180,9 +211,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);
+	if (!gallery || gallery[0] == NULL) {
 		fp_dscv_prints_free(prints);
 		fp_dscv_devs_free(ddevs);
 		send_info_msg(pamh, "Could not locate any suitable fingerprints "
@@ -197,17 +228,17 @@ static int do_auth(pam_handle_t *pamh)
 		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_verify(pamh, dev, data, finger);
-	fp_print_data_free(data);
+	r = do_identify(pamh, dev, gallery);
+	
+	gallery_iter = gallery;
+	while (*gallery_iter)
+	{
+	    fp_print_data_free(*gallery_iter);
+	    gallery_iter++;
+	}
+	free(gallery);
 	fp_dev_close(dev);
 	return r;
 }
-- 
1.5.4

From 6d0b5805a708633e9727ece96c61aa790d62b718 Mon Sep 17 00:00:00 2001
From: Vasily Khoruzhick <[EMAIL PROTECTED]>
Date: Fri, 15 Feb 2008 19:30:27 +0200
Subject: [PATCH] Regression for devices that unsupport identification fixed


Signed-off-by: Vasily Khoruzhick <[EMAIL PROTECTED]>
---
 src/pam_fprint.c |   56 +++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/src/pam_fprint.c b/src/pam_fprint.c
index 3e7e7d9..24fc104 100644
--- a/src/pam_fprint.c
+++ b/src/pam_fprint.c
@@ -70,7 +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,10 +89,10 @@ static const char *fingerstr(enum fp_finger finger)
 		return "UNKNOWN";
 	return names[finger];
 }
-*/
+
 
 static struct fp_print_data **find_dev_and_prints(struct fp_dscv_dev **ddevs,
-	struct fp_dscv_print **prints, struct fp_dscv_dev **_ddev)
+	struct fp_dscv_print **prints, struct fp_dscv_dev **_ddev, enum fp_finger **fingers)
 {
 	int i = 0, j = 0, err;
 	struct fp_dscv_print *print;
@@ -122,7 +122,15 @@ static struct fp_print_data **find_dev_and_prints(struct fp_dscv_dev **ddevs,
 	}
 	
 	gallery = malloc(sizeof(*gallery) * (prints_count + 1));
+	if (gallery == NULL) {
+	    return NULL;
+	}
 	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++]) {
@@ -133,6 +141,7 @@ static struct fp_print_data **find_dev_and_prints(struct fp_dscv_dev **ddevs,
 			    gallery[j] = NULL;
 			    break;
 			}
+			(*fingers)[j] = fp_dscv_print_get_finger(print);
 			j++;
 		}
 	}
@@ -141,21 +150,31 @@ static struct fp_print_data **find_dev_and_prints(struct fp_dscv_dev **ddevs,
 }
 
 static int do_identify(pam_handle_t *pamh, struct fp_dev *dev,
-	struct fp_print_data **gallery)
+	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(fingers[0]);
 	
 	do {
 		int r;
 		char msg[128];
 
-		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);
+		
+		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;
@@ -197,6 +216,7 @@ static int do_auth(pam_handle_t *pamh)
 	struct fp_dscv_print *print;
 	struct fp_dev *dev;
 	struct fp_print_data **gallery, **gallery_iter;
+	enum fp_finger *fingers;
 
 	r = fp_init();
 	if (r < 0)
@@ -212,8 +232,8 @@ static int do_auth(pam_handle_t *pamh)
 		return PAM_AUTHINFO_UNAVAIL;
 	}
 	
-	gallery = find_dev_and_prints(ddevs, prints, &ddev);
-	if (!gallery || gallery[0] == NULL) {
+	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 "
@@ -223,14 +243,19 @@ 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;
 	}
 
-	fp_dscv_prints_free(prints);
-
-	r = do_identify(pamh, dev, gallery);
+	r = do_identify(pamh, dev, gallery, fingers);
 	
 	gallery_iter = gallery;
 	while (*gallery_iter)
@@ -239,6 +264,7 @@ static int do_auth(pam_handle_t *pamh)
 	    gallery_iter++;
 	}
 	free(gallery);
+	free(fingers);
 	fp_dev_close(dev);
 	return r;
 }
-- 
1.5.4

_______________________________________________
fprint mailing list
[email protected]
http://lists.reactivated.net/mailman/listinfo/fprint

Reply via email to