summaryrefslogtreecommitdiff
path: root/src/ddhardrescue.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ddhardrescue.c')
-rwxr-xr-xsrc/ddhardrescue.c128
1 files changed, 108 insertions, 20 deletions
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;
}