From 261ec98c16ed512529472218fee3bf6db298a748 Mon Sep 17 00:00:00 2001
From: Ludovic Pouzenc <ludovic@pouzenc.fr>
Date: Sun, 6 Mar 2011 10:52:03 +0000
Subject: Rush du dimanche matin. Beaucoup de choses écrites et pas testée ni
 finies mais ça avance. A relire !!
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

git-svn-id: file:///var/svn/2011-ddhardrescue/trunk@8 d3078510-dda0-49f1-841c-895ef4b7ec81
---
 src/ddhardrescue.c | 128 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 108 insertions(+), 20 deletions(-)

(limited to 'src/ddhardrescue.c')

diff --git a/src/ddhardrescue.c b/src/ddhardrescue.c
index df61bc6..486ea41 100755
--- a/src/ddhardrescue.c
+++ b/src/ddhardrescue.c
@@ -1,49 +1,137 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <signal.h>
 #include <stdint.h>
-
+#include <string.h>
+#include <pthread.h>
+ 
 #include "slices.h"
 #include "recover.h"
+#include "utils.h"
 
 int end=0;
 unsigned long c=0;
 
+struct threadArgs {
+	struct progArgs *progArgs;
+	struct slices_manage_t *slices;
+};
+
+typedef enum { E_BOUND, E_TYPE } sliceEventKind_t;
+
+typedef struct {
+	slices_t *data;
+	pthread_mutex_t mutex;
+	void (*slices_listener)(sliceEventKind_t eventKind, slices_t *slices, slice_t *slice);
+} slices_manage_t;
+
+
 void sigHookAbrt() {
 	end=1;
 }
 
-int main() {
-	char *src, *dst, *ddOpts, *dump;
-	address_t beginSector, endSector, blockSize;
-	int /*depth,*/i;
-	slices_t *slices;
-	slice_t *curr, *toFree;
+void *procWorker(void *a);
+void *procViewer(void *a);
+
+int main(int argc, char **argv) {
+	// System structures
+	struct sigaction sa;
+	pthread_t tWorker, tViewer;
+
+	// Main data structures
+	slices_manage_t slices;
+
+	// Progam and threads arguments
+	struct progArgs args;
+	struct threadArgs tArgs;
+
+	// Algorithmic needs
+	int res, i;
+
 	
-	//TODO Parse args
-	//TODO signal...
+	// Parse command-line arguments	
+	res=parseArgs(argc, argv, &args);
+	if (res!=0) {
+		usage(argv[0]);
+		return 1;
+	}
 
+	// Set signals behavior
+	memset(&sa,0,sizeof(sa));
+	sa.sa_handler=sigHookAbrt;
+	res=sigaction(SIGABRT, &sa, NULL);
+	if (res!=0) {
+		return 2;
+	}
+
+	//XXX Remove srand : only for simulation
 	srand(4);
-	slices=recover(src,dst,ddOpts,beginSector,endSector/*,depth*/);
-	
-	blockSize=0;
-	dump=slicesDump(slices, &blockSize, 1000, beginSector, endSector);
+
+	// Data structure initialization
+	memset(&slices, 0, sizeof(slices));
+	slices.data=slicesNewSingleton(args.beginSector, args.endSector, S_UNKNOWN);
+	res=pthread_mutex_init(&(slices.mutex), NULL);
+	if (res!=0) {
+		return 3;
+	}
+
+	// Threads preparation, creation and start
+	memset(&tArgs, 0, sizeof(tArgs));
+	tArgs.progArgs=&args;
+	tArgs.slices=&slices;
+
+	res=pthread_create(&tWorker, NULL, procWorker, &tArgs);
+	if (res!=0) {
+		return 4;
+	}
+
+	res=pthread_create(&tViewer, NULL, procViewer, &tArgs);
+	if (res!=0) {
+		return 5;
+	}
+
+	// Thread join point
+	(void) pthread_join(tWorker, NULL);
+	(void) pthread_join(tViewer, NULL);
+
+	//Final dump of datas	
+	address_t blockSize=0;
+	char *dump;
+	dump=slicesDump(slices.data, &blockSize, 1000, args.beginSector, args.endSector);
 	puts(dump);
 	free(dump);
 	printf("blockSize==%lld\n", blockSize);
-	printf("c==%ld\n", c);
-	printf("slices->count==%d\n", slices->count);
+	printf("slices->count==%d\n", slices.data->count);
 
-	curr=slices->first;
-	i=0;
+	//Resources desallocation
+	(void) pthread_mutex_destroy(&(slices.mutex));
+
+	slice_t *curr, *toFree;
+	i=0; curr=slices.data->first;
 	while (curr!=NULL) {
 		i++;
 		toFree=curr;
 		curr=curr->next;
 		free(toFree);
 	}
-	free(slices);
+	free(slices.data);
+}
+
+void * procWorker(void *a) {
+	struct threadArgs *tArgs = (struct threadArgs *)a;
+
+	(void) recover(
+		tArgs->progArgs->src,
+		tArgs->progArgs->dst,
+		tArgs->progArgs->ddOpts,
+		tArgs->progArgs->beginSector,
+		tArgs->progArgs->endSector
+	);
+	
+	return a;
+}
 
-	printf("i==%d\n", i);
+void *procViewer(void *a) {
 
-	return 0;
+	return a;
 }
-- 
cgit v1.2.3