Branch data Line data Source code
1 : : #include <stdlib.h> 2 : : #include <stdbool.h> 3 : : #include <time.h> 4 : : 5 : : #include <ccan/list/list.h> 6 : : #include "helper.h" 7 : : 8 : : #define ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING \ 9 : : (42) 10 : : 11 : : struct opaque { 12 : : struct list_node list; 13 : : size_t secret_offset; 14 : : char secret_drawer[42]; 15 : : }; 16 : : 17 : : static bool not_randomized = true; 18 : : 19 : 60 : struct opaque *create_opaque_blob(void) 20 : : { 21 : 60 : struct opaque *blob = calloc(1, sizeof(struct opaque)); 22 : : 23 : 60 : if (not_randomized) { 24 : 20 : srandom((int)time(NULL)); 25 : 20 : not_randomized = false; 26 : : } 27 : : 28 : 60 : blob->secret_offset = random() % (sizeof(blob->secret_drawer)); 29 : 60 : blob->secret_drawer[blob->secret_offset] = 30 : : ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING; 31 : : 32 : 60 : return blob; 33 : : } 34 : : 35 : 100 : bool if_blobs_know_the_secret(struct opaque *blob) 36 : : { 37 : 100 : bool answer = true; 38 : : int i; 39 : 4300 : for (i = 0; i < sizeof(blob->secret_drawer) / 40 : 4200 : sizeof(blob->secret_drawer[0]); i++) 41 : 4200 : if (i != blob->secret_offset) 42 : 4100 : answer = answer && (blob->secret_drawer[i] == 0); 43 : : else 44 : 200 : answer = answer && 45 : 100 : (blob->secret_drawer[blob->secret_offset] == 46 : : ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING); 47 : : 48 : 100 : return answer; 49 : : } 50 : : 51 : 60 : void destroy_opaque_blob(struct opaque *blob) 52 : : { 53 : 60 : free(blob); 54 : 60 : } 55 : : 56 : :