1 /* Make sure serializing a dict (possibly repeatedly) does not corrupt either 2 type lookup or the string content of the dict. */ 3 4 #include <ctf-api.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 int 9 main (int argc, char *argv[]) 10 { 11 ctf_dict_t *fp; 12 ctf_id_t zygal, autoschediastic; 13 ctf_snapshot_id_t snap; 14 unsigned char *foo; 15 size_t foo_size; 16 int err; 17 char name[64]; 18 19 /* Adding things after serialization should not corrupt names created before 20 serialization. */ 21 22 if ((fp = ctf_create (&err)) == NULL) 23 goto create_err; 24 25 if ((zygal = ctf_add_struct (fp, CTF_ADD_ROOT, "zygal")) == CTF_ERR) 26 goto add_err; 27 28 if ((foo = ctf_write_mem (fp, &foo_size, 4096)) == NULL) 29 goto write_err; 30 free (foo); 31 32 if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL) 33 fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp))); 34 else 35 printf ("zygal's name is %s\n", name); 36 37 if ((autoschediastic = ctf_add_enum (fp, CTF_ADD_ROOT, "autoschediastic")) == CTF_ERR) 38 goto add_err; 39 40 if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL) 41 fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp))); 42 else 43 printf ("zygal's name is %s\n", name); 44 45 /* Serializing again should not corrupt names either. */ 46 if ((foo = ctf_write_mem (fp, &foo_size, 4096)) == NULL) 47 goto write_err; 48 free (foo); 49 50 if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL) 51 fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp))); 52 else 53 printf ("zygal's name is %s\n", name); 54 55 /* Add another new name, roll back, and make sure the strings are 56 uncorrupted. */ 57 58 snap = ctf_snapshot (fp); 59 if (ctf_add_enumerator (fp, autoschediastic, "aichmophobia", 0) < 0) 60 goto add_err; 61 62 if (ctf_rollback (fp, snap) < 0) 63 goto roll_err; 64 65 if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL) 66 fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp))); 67 else 68 printf ("zygal's name is %s after first rollback\n", name); 69 70 if (ctf_type_name (fp, autoschediastic, name, sizeof (name)) == NULL) 71 fprintf (stderr, "Can't get name of autoschediastic: %s\n", ctf_errmsg (ctf_errno (fp))); 72 else 73 printf ("autoschediastic's name is %s after first rollback\n", name); 74 75 ctf_dict_close (fp); 76 return 0; 77 78 create_err: 79 fprintf (stderr, "Cannot create: %s\n", ctf_errmsg (err)); 80 return 1; 81 add_err: 82 fprintf (stderr, "Cannot add: %s\n", ctf_errmsg (ctf_errno (fp))); 83 return 1; 84 write_err: 85 fprintf (stderr, "Cannot serialize: %s\n", ctf_errmsg (ctf_errno (fp))); 86 return 1; 87 roll_err: 88 fprintf (stderr, "Cannot roll back: %s\n", ctf_errmsg (ctf_errno (fp))); 89 return 1; 90 } 91