Mercurial > projects > pwm
annotate pwfile.c @ 10:17fb30016e64
Enable access to record and file metadata
Add info command to show file metadata.
Enable display of creation and modification dates of records.
author | Guido Berhoerster <guido+pwm@berhoerster.name> |
---|---|
date | Fri, 28 Jul 2017 15:53:57 +0200 |
parents | 60c8ab006e55 |
children | cf81eb0c2d5a |
rev | line source |
---|---|
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
1 /* |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
2 * Copyright (C) 2017 Guido Berhoerster <guido+pwm@berhoerster.name> |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
3 * |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
4 * Permission is hereby granted, free of charge, to any person obtaining |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
5 * a copy of this software and associated documentation files (the |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
6 * "Software"), to deal in the Software without restriction, including |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
7 * without limitation the rights to use, copy, modify, merge, publish, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
8 * distribute, sublicense, and/or sell copies of the Software, and to |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
9 * permit persons to whom the Software is furnished to do so, subject to |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
10 * the following conditions: |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
11 * |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
12 * The above copyright notice and this permission notice shall be included |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
13 * in all copies or substantial portions of the Software. |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
14 * |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
22 */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
23 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
24 #include "compat.h" |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
25 |
10
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
26 #include <ctype.h> |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
27 #ifdef HAVE_ERR_H |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
28 #include <err.h> |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
29 #endif /* HAVE_ERR_H */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
30 #include <errno.h> |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
31 #include <stdio.h> |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
32 #include <string.h> |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
33 #include <sys/stat.h> |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
34 #ifdef HAVE_SYS_TREE_H |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
35 #include <sys/tree.h> |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
36 #endif |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
37 #include <sys/utsname.h> |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
38 #include <unistd.h> |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
39 #include <time.h> |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
40 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
41 #include "pwfile.h" |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
42 #include "util.h" |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
43 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
44 struct record_id_entry { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
45 RB_ENTRY(record_id_entry) record_id_entry; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
46 unsigned int id; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
47 unsigned char uuid[PWS3_UUID_SIZE]; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
48 }; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
49 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
50 RB_HEAD(record_id_tree, record_id_entry); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
51 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
52 static int record_id_entry_cmp(struct record_id_entry *, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
53 struct record_id_entry *); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
54 RB_PROTOTYPE_STATIC(record_id_tree, record_id_entry, record_id_entry, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
55 record_id_entry_cmp) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
56 RB_GENERATE_STATIC(record_id_tree, record_id_entry, record_id_entry, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
57 record_id_entry_cmp) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
58 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
59 static int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
60 record_id_entry_cmp(struct record_id_entry *entry1, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
61 struct record_id_entry *entry2) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
62 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
63 if (entry1->id > entry2->id) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
64 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
65 } else if (entry1->id < entry2->id) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
66 return (1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
67 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
68 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
69 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
70 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
71 static int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
72 pws_record_cmp(const void *p1, const void *p2) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
73 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
74 int retval; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
75 struct pws3_record *record1 = *(struct pws3_record **)p1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
76 struct pws3_record *record2 = *(struct pws3_record **)p2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
77 struct pws3_field *group_field1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
78 const char *group1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
79 struct pws3_field *group_field2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
80 const char *group2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
81 struct pws3_field *title_field1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
82 const char *title1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
83 struct pws3_field *title_field2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
84 const char *title2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
85 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
86 group_field1 = pws3_record_get_field(record1, PWS3_RECORD_FIELD_GROUP); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
87 group1 = (group_field1 != NULL) ? pws3_field_get_text(group_field1) : |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
88 ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
89 group_field2 = pws3_record_get_field(record2, PWS3_RECORD_FIELD_GROUP); |
2
5cd0debdb7d8
Fix a typo potentially causing a NULL pointer dereference
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
0
diff
changeset
|
90 group2 = (group_field2 != NULL) ? pws3_field_get_text(group_field2) : |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
91 ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
92 retval = strcmp(group1, group2); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
93 if (retval != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
94 return (retval); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
95 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
96 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
97 title_field1 = pws3_record_get_field(record1, PWS3_RECORD_FIELD_TITLE); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
98 title1 = (title_field1 != NULL) ? pws3_field_get_text(title_field1) : |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
99 ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
100 title_field2 = pws3_record_get_field(record2, PWS3_RECORD_FIELD_TITLE); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
101 title2 = (title_field2 != NULL) ? pws3_field_get_text(title_field2) : |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
102 ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
103 return (strcmp(title1, title2)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
104 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
105 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
106 static void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
107 record_id_tree_clear(struct record_id_tree *tree) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
108 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
109 struct record_id_entry *entry; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
110 struct record_id_entry *entry_tmp; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
111 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
112 RB_FOREACH_SAFE(entry, record_id_tree, tree, entry_tmp) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
113 RB_REMOVE(record_id_tree, tree, entry); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
114 free(entry); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
115 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
116 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
117 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
118 static void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
119 record_id_tree_destroy(struct record_id_tree *tree) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
120 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
121 if (tree == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
122 return; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
123 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
124 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
125 record_id_tree_clear(tree); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
126 free(tree); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
127 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
128 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
129 static const unsigned char * |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
130 record_id_tree_get_uuid(struct record_id_tree *tree, unsigned int id) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
131 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
132 struct record_id_entry *entry; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
133 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
134 entry = RB_FIND(record_id_tree, tree, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
135 &(struct record_id_entry){ .id = id }); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
136 if (entry == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
137 return (NULL); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
138 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
139 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
140 return (entry->uuid); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
141 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
142 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
143 void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
144 pwfile_init(struct pwm_ctx *ctx) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
145 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
146 ctx->file = pws3_file_create(); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
147 if (ctx->file == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
148 err(1, "pws3_file_create"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
149 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
150 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
151 ctx->next_id = 1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
152 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
153 ctx->record_id_tree = xmalloc(sizeof (struct record_id_tree)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
154 RB_INIT(ctx->record_id_tree); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
155 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
156 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
157 void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
158 pwfile_destroy(struct pwm_ctx *ctx) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
159 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
160 record_id_tree_destroy(ctx->record_id_tree); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
161 ctx->record_id_tree = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
162 pws3_file_destroy(ctx->file); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
163 ctx->file = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
164 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
165 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
166 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
167 pwfile_read_file(struct pwm_ctx *ctx, FILE *fp) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
168 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
169 struct pws3_record *pws3_record; |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
170 size_t record_list_len = 0; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
171 struct pws3_record **pws3_record_list; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
172 size_t i; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
173 struct pws3_field *uuid_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
174 const unsigned char *uuid; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
175 struct record_id_entry *entry; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
176 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
177 if (pws3_file_read_stream(ctx->file, ctx->password, fp) != 0) { |
5
0b1bce8db371
Prevent misleading double error message
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
4
diff
changeset
|
178 fprintf(stderr, "failed to read password database: %s\n", |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
179 pws3_file_get_error_message(ctx->file)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
180 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
181 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
182 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
183 record_id_tree_clear(ctx->record_id_tree); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
184 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
185 /* sort records by group and title */ |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
186 for (pws3_record = pws3_file_first_record(ctx->file); |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
187 pws3_record != NULL; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
188 pws3_record = pws3_file_next_record(ctx->file, pws3_record)) { |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
189 record_list_len++; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
190 } |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
191 pws3_record_list = xmalloc(sizeof (struct pws3_record *) * |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
192 record_list_len); |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
193 for (pws3_record = pws3_file_first_record(ctx->file), i = 0; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
194 pws3_record != NULL; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
195 pws3_record = pws3_file_next_record(ctx->file, pws3_record)) { |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
196 pws3_record_list[i++] = pws3_record; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
197 } |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
198 qsort(pws3_record_list, record_list_len, |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
199 sizeof (struct pws3_record *), pws_record_cmp); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
200 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
201 /* build the tree of record IDs */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
202 for (i = 0; i < record_list_len; i++) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
203 uuid_field = pws3_record_get_field(pws3_record_list[i], |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
204 PWS3_RECORD_FIELD_UUID); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
205 uuid = pws3_field_get_uuid(uuid_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
206 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
207 entry = xmalloc(sizeof (struct record_id_entry)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
208 entry->id = ctx->next_id++; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
209 memcpy(entry->uuid, uuid, sizeof (entry->uuid)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
210 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
211 RB_INSERT(record_id_tree, ctx->record_id_tree, entry); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
212 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
213 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
214 free(pws3_record_list); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
215 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
216 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
217 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
218 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
219 static int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
220 make_backup_copy(const char *filename) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
221 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
222 int retval = -1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
223 FILE *fp_orig = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
224 char *backup_filename = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
225 char *tmpfilename = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
226 mode_t old_mode; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
227 int fd_backup = -1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
228 unsigned char buf[BUFSIZ]; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
229 size_t read_len; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
230 FILE *fp_backup = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
231 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
232 fp_orig = fopen(filename, "r"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
233 if (fp_orig == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
234 if (errno != ENOENT) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
235 warn("fopen"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
236 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
237 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
238 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
239 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
240 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
241 xasprintf(&backup_filename, "%s~", filename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
242 xasprintf(&tmpfilename, "%s.XXXXXX", filename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
243 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
244 /* create temporary file */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
245 old_mode = umask(S_IRWXG | S_IRWXO); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
246 fd_backup = mkstemp(tmpfilename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
247 umask(old_mode); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
248 if (fd_backup == -1) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
249 warn("mkstemp"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
250 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
251 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
252 fp_backup = fdopen(fd_backup, "w"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
253 if (fp_backup == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
254 warn("fdopen"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
255 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
256 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
257 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
258 /* copy file contents */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
259 while (!feof(fp_orig)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
260 read_len = fread(buf, 1, sizeof (buf), fp_orig); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
261 if ((read_len < sizeof (buf)) && ferror(fp_orig)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
262 warn("fread"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
263 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
264 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
265 if (fwrite(buf, 1, read_len, fp_backup) != read_len) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
266 warn("fwrite"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
267 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
268 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
269 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
270 if (fflush(fp_backup) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
271 warn("fflush"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
272 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
273 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
274 if (fsync(fileno(fp_backup)) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
275 warn("fsync"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
276 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
277 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
278 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
279 retval = 0; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
280 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
281 out: |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
282 if ((fd_backup != -1) && (fp_backup == NULL)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
283 close(fd_backup); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
284 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
285 if (fp_backup != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
286 fclose(fp_backup); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
287 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
288 if (fp_orig != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
289 fclose(fp_orig); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
290 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
291 if (retval == 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
292 /* rename temporary file and overwrite existing file */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
293 if (rename(tmpfilename, backup_filename) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
294 warn("rename"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
295 retval = -1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
296 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
297 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
298 if ((retval != 0) && ((fd_backup != -1) || (fp_backup != NULL))) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
299 unlink(tmpfilename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
300 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
301 free(tmpfilename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
302 free(backup_filename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
303 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
304 return (retval); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
305 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
306 |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
307 static void |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
308 update_file_metadata(struct pws3_file *file) |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
309 { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
310 struct pws3_field *save_app_field; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
311 struct pws3_field *save_timestamp_field; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
312 char *logname; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
313 const char default_username[] = "unknown user"; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
314 const char *username; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
315 size_t username_len; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
316 struct utsname utsn; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
317 const char default_hostname[] = "unknown host"; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
318 const char *hostname; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
319 char user_host[1024]; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
320 struct pws3_field *save_user_host_field; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
321 struct pws3_field *save_user_field; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
322 struct pws3_field *save_host_field; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
323 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
324 save_app_field = |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
325 pws3_field_create(1, PWS3_HEADER_FIELD_SAVE_APPLICATION); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
326 if (save_app_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
327 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
328 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
329 if (pws3_field_set_text(save_app_field, PACKAGE " V" VERSION) != |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
330 0) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
331 err(1, "pws3_field_set_text"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
332 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
333 pws3_file_set_header_field(file, save_app_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
334 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
335 save_timestamp_field = |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
336 pws3_field_create(1, PWS3_HEADER_FIELD_SAVE_TIMESTAMP); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
337 if (save_timestamp_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
338 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
339 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
340 pws3_field_set_time(save_timestamp_field, time(NULL)); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
341 pws3_file_set_header_field(file, save_timestamp_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
342 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
343 logname = getenv("LOGNAME"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
344 if (logname == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
345 logname = getlogin(); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
346 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
347 username = (logname != NULL) ? logname : default_username; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
348 username_len = MIN(strlen(username), sizeof (user_host) - 4 - 1); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
349 hostname = (uname(&utsn) == 0) ? utsn.nodename : default_hostname; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
350 snprintf(user_host, sizeof (user_host), "%04zx%s%s", username_len, |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
351 username, hostname); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
352 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
353 save_user_host_field = |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
354 pws3_field_create(1, PWS3_HEADER_FIELD_SAVE_USER_HOST); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
355 if (save_user_host_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
356 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
357 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
358 if (pws3_field_set_text(save_user_host_field, user_host) != 0) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
359 err(1, "pws3_field_set_text"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
360 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
361 pws3_file_set_header_field(file, save_user_host_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
362 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
363 save_user_field = pws3_field_create(1, PWS3_HEADER_FIELD_SAVE_USER); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
364 if (save_user_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
365 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
366 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
367 if (pws3_field_set_text(save_user_field, logname) != 0) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
368 err(1, "pws3_field_set_text"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
369 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
370 pws3_file_set_header_field(file, save_user_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
371 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
372 save_host_field = pws3_field_create(1, PWS3_HEADER_FIELD_SAVE_HOST); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
373 if (save_host_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
374 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
375 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
376 if (pws3_field_set_text(save_host_field, hostname) != 0) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
377 err(1, "pws3_field_set_text"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
378 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
379 pws3_file_set_header_field(file, save_host_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
380 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
381 |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
382 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
383 pwfile_write_file(struct pwm_ctx *ctx) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
384 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
385 int retval = -1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
386 char *tmpfilename = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
387 mode_t old_mode; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
388 int fd = -1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
389 FILE *fp = NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
390 |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
391 /* update password file metadata */ |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
392 update_file_metadata(ctx->file); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
393 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
394 /* make a backup copy of the existing password file */ |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
395 if (make_backup_copy(ctx->filename) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
396 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
397 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
398 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
399 xasprintf(&tmpfilename, "%s.XXXXXX", ctx->filename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
400 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
401 /* create temporary file */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
402 old_mode = umask(S_IRWXG | S_IRWXO); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
403 fd = mkstemp(tmpfilename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
404 if (fd == -1) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
405 warn("mkstemp"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
406 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
407 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
408 umask(old_mode); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
409 fp = fdopen(fd, "w"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
410 if (fp == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
411 warn("fdopen"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
412 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
413 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
414 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
415 /* write contents */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
416 if (pws3_file_write_stream(ctx->file, ctx->password, 10000, fp) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
417 warnx("pws3_file_write_stream: %s", |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
418 pws3_file_get_error_message(ctx->file)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
419 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
420 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
421 if (fflush(fp) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
422 warn("fflush"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
423 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
424 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
425 if (fsync(fileno(fp)) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
426 warn("fsync"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
427 goto out; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
428 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
429 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
430 retval = 0; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
431 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
432 out: |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
433 if ((fd != -1) && (fp == NULL)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
434 close(fd); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
435 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
436 if (fp != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
437 fclose(fp); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
438 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
439 if (retval == 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
440 /* rename temporary file and overwrite existing file */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
441 if (rename(tmpfilename, ctx->filename) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
442 warn("rename"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
443 retval = -1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
444 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
445 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
446 if ((retval != 0) && ((fd != -1) || (fp != NULL))) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
447 unlink(tmpfilename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
448 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
449 free(tmpfilename); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
450 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
451 return (retval); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
452 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
453 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
454 static int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
455 list_item_cmp(const void *p1, const void *p2) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
456 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
457 int retval; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
458 const union list_item *item1 = *(const union list_item **)p1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
459 const union list_item *item2 = *(const union list_item **)p2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
460 const char *group1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
461 const char *group2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
462 const char *title1; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
463 const char *title2; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
464 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
465 /* sort both groups and records first by group name */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
466 group1 = (item1->any.group != NULL) ? item1->any.group : ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
467 group2 = (item2->any.group != NULL) ? item2->any.group : ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
468 retval = strcmp(group1, group2); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
469 if ((retval != 0) || ((item1->any.type == ITEM_TYPE_GROUP) && |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
470 (item2->any.type == ITEM_TYPE_GROUP))) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
471 return (retval); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
472 } else if ((item1->any.type == ITEM_TYPE_GROUP) && |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
473 (item2->any.type == ITEM_TYPE_RECORD)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
474 /* groups come before records belonging to it */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
475 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
476 } else if ((item1->any.type == ITEM_TYPE_RECORD) && |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
477 (item2->any.type == ITEM_TYPE_GROUP)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
478 return (1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
479 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
480 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
481 /* sort records also by title */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
482 title1 = (item1->record.title != NULL) ? item1->record.title : ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
483 title2 = (item2->record.title != NULL) ? item2->record.title : ""; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
484 return (strcmp(title1, title2)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
485 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
486 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
487 union list_item ** |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
488 pwfile_create_list(struct pwm_ctx *ctx) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
489 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
490 union list_item **list; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
491 struct record_id_entry *entry; |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
492 size_t list_capacity = 0; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
493 struct pws3_field *empty_group_field; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
494 struct pws3_record *pws3_record; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
495 struct pws3_field *group_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
496 const char *group; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
497 struct pws3_field *title_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
498 const char *title; |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
499 union list_item *item; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
500 size_t list_len = 0; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
501 size_t i; |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
502 size_t j; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
503 const char *prev_group = NULL; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
504 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
505 RB_FOREACH(entry, record_id_tree, ctx->record_id_tree) { |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
506 list_capacity++; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
507 } |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
508 list_capacity *= 2; /* maximum number of group items */ |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
509 for (empty_group_field = pws3_file_first_empty_group(ctx->file); |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
510 empty_group_field != NULL; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
511 empty_group_field = pws3_file_next_empty_group(ctx->file, |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
512 empty_group_field)) { |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
513 list_capacity++; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
514 } |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
515 list_capacity++; /* terminating NULL */ |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
516 list = xmalloc(sizeof (union list_item *) * list_capacity); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
517 |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
518 RB_FOREACH(entry, record_id_tree, ctx->record_id_tree) { |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
519 pws3_record = pws3_file_get_record(ctx->file, entry->uuid); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
520 group_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
521 PWS3_RECORD_FIELD_GROUP); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
522 group = (group_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
523 pws3_field_get_text(group_field) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
524 title_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
525 PWS3_RECORD_FIELD_TITLE); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
526 title = (title_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
527 pws3_field_get_text(title_field) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
528 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
529 item = xmalloc(sizeof (union list_item)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
530 item->record.type = ITEM_TYPE_RECORD; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
531 item->record.group = (group != NULL) ? xstrdup(group) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
532 item->record.title = (title != NULL) ? xstrdup(title) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
533 item->record.id = entry->id; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
534 memcpy(item->record.uuid, entry->uuid, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
535 sizeof (item->record.uuid)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
536 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
537 list[list_len++] = item; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
538 } |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
539 /* sort records by group and title in order to find unqiue groups */ |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
540 qsort(list, list_len, sizeof (union list_item *), list_item_cmp); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
541 |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
542 /* add groups based on the sorted records */ |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
543 for (i = 0, j = list_len; i < list_len; i++) { |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
544 group = list[i]->record.group; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
545 if ((group != NULL) && ((prev_group == NULL) || |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
546 (strcmp(prev_group, group) != 0))) { |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
547 item = xmalloc(sizeof (union list_item)); |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
548 item->group.type = ITEM_TYPE_GROUP; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
549 item->group.group = (group != NULL) ? xstrdup(group) : |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
550 NULL; |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
551 list[j++] = item; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
552 prev_group = group; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
553 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
554 } |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
555 list_len = j; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
556 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
557 /* add empty groups to the list */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
558 for (empty_group_field = pws3_file_first_empty_group(ctx->file); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
559 empty_group_field != NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
560 empty_group_field = pws3_file_next_empty_group(ctx->file, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
561 empty_group_field)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
562 group = pws3_field_get_text(empty_group_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
563 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
564 item = xmalloc(sizeof (union list_item)); |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
565 item->group.type = ITEM_TYPE_GROUP; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
566 item->group.group = xstrdup(group); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
567 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
568 list[list_len++] = item; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
569 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
570 |
3
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
571 /* terminate the list */ |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
572 list[list_len] = NULL; |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
573 list = xrealloc(list, sizeof (union list_item *) * (list_len + 1)); |
1cc98a5677d9
Refactor the creation of the record and group list
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
2
diff
changeset
|
574 |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
575 /* sort the final list by group and title */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
576 qsort(list, list_len, sizeof (union list_item *), list_item_cmp); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
577 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
578 return (list); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
579 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
580 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
581 void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
582 pwfile_destroy_list(union list_item **list) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
583 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
584 size_t i; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
585 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
586 if (list == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
587 return; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
588 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
589 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
590 for (i = 0; list[i] != NULL; i++) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
591 if (list[i]->any.type == ITEM_TYPE_RECORD) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
592 free(list[i]->record.title); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
593 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
594 free(list[i]->any.group); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
595 free(list[i]); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
596 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
597 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
598 free(list); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
599 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
600 |
10
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
601 static int |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
602 parse_user_host(const char *user_host, char **userp, char **hostp) |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
603 { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
604 size_t user_host_len; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
605 size_t i; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
606 unsigned int user_len; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
607 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
608 user_host_len = strlen(user_host); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
609 if (user_host_len < 4) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
610 return (-1); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
611 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
612 for (i = 0; i < 4; i++) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
613 if (!isxdigit(user_host[i])) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
614 return (-1); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
615 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
616 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
617 if (sscanf(user_host, "%04x", &user_len) != 1) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
618 return (-1); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
619 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
620 if (4 + (size_t)user_len > user_host_len) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
621 return (-1); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
622 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
623 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
624 xasprintf(userp, "%.*s", (int)user_len, user_host + 4); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
625 xasprintf(hostp, "%s", user_host + 4 + user_len); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
626 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
627 return (0); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
628 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
629 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
630 struct metadata * |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
631 pwfile_get_metadata(struct pwm_ctx *ctx) |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
632 { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
633 struct metadata *metadata; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
634 struct pws3_field *version_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
635 struct pws3_field *save_app_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
636 struct pws3_field *save_timestamp_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
637 struct pws3_field *save_user_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
638 struct pws3_field *save_host_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
639 struct pws3_field *save_user_host_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
640 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
641 metadata = xmalloc(sizeof (struct metadata)); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
642 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
643 version_field = pws3_file_get_header_field(ctx->file, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
644 PWS3_HEADER_FIELD_VERSION); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
645 metadata->version = pws3_field_get_uint16(version_field); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
646 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
647 save_app_field = pws3_file_get_header_field(ctx->file, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
648 PWS3_HEADER_FIELD_SAVE_APPLICATION); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
649 metadata->application = (save_app_field != NULL) ? |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
650 xstrdup(pws3_field_get_text(save_app_field)) : NULL; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
651 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
652 save_timestamp_field = pws3_file_get_header_field(ctx->file, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
653 PWS3_HEADER_FIELD_SAVE_TIMESTAMP); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
654 metadata->timestamp = (save_timestamp_field != NULL) ? |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
655 pws3_field_get_time(save_timestamp_field) : 0; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
656 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
657 save_user_field = pws3_file_get_header_field(ctx->file, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
658 PWS3_HEADER_FIELD_SAVE_USER); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
659 save_host_field = pws3_file_get_header_field(ctx->file, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
660 PWS3_HEADER_FIELD_SAVE_HOST); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
661 save_user_host_field = pws3_file_get_header_field(ctx->file, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
662 PWS3_HEADER_FIELD_SAVE_USER_HOST); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
663 metadata->user = NULL; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
664 metadata->host = NULL; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
665 if ((save_user_field != NULL) && (save_host_field != NULL)) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
666 metadata->user = xstrdup(pws3_field_get_text(save_user_field)); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
667 metadata->host = xstrdup(pws3_field_get_text(save_host_field)); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
668 } else if (save_user_host_field != NULL) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
669 parse_user_host(pws3_field_get_text(save_user_host_field), |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
670 &metadata->user, &metadata->host); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
671 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
672 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
673 return (metadata); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
674 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
675 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
676 void |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
677 pwfile_destroy_metadata(struct metadata *metadata) |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
678 { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
679 if (metadata == NULL) { |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
680 return; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
681 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
682 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
683 free(metadata->user); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
684 free(metadata->host); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
685 free(metadata->application); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
686 free(metadata); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
687 } |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
688 |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
689 static void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
690 update_record(struct pws3_record *pws3_record, struct record *record) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
691 { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
692 time_t now; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
693 struct pws3_field *ctime_field; |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
694 struct pws3_field *mtime_field; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
695 struct pws3_field *title_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
696 struct pws3_field *group_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
697 struct pws3_field *username_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
698 struct pws3_field *password_field; |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
699 struct pws3_field *password_mtime_field; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
700 struct pws3_field *notes_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
701 struct pws3_field *url_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
702 |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
703 now = time(NULL); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
704 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
705 ctime_field = pws3_record_get_field(pws3_record, |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
706 PWS3_RECORD_FIELD_CREATION_TIME); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
707 if (ctime_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
708 ctime_field = pws3_field_create(0, |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
709 PWS3_RECORD_FIELD_CREATION_TIME); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
710 if (ctime_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
711 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
712 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
713 pws3_field_set_time(ctime_field, now); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
714 pws3_record_set_field(pws3_record, ctime_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
715 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
716 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
717 mtime_field = pws3_field_create(0, PWS3_RECORD_FIELD_MODIFICATION_TIME); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
718 if (mtime_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
719 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
720 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
721 pws3_field_set_time(mtime_field, now); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
722 pws3_record_set_field(pws3_record, mtime_field); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
723 |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
724 if (record->title != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
725 title_field = pws3_field_create(0, PWS3_RECORD_FIELD_TITLE); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
726 if (title_field == NULL) { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
727 err(1, "pws3_field_create"); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
728 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
729 if (pws3_field_set_text(title_field, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
730 record->title) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
731 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
732 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
733 pws3_record_set_field(pws3_record, title_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
734 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
735 if (record->group != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
736 group_field = pws3_field_create(0, PWS3_RECORD_FIELD_GROUP); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
737 if (group_field == NULL) { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
738 err(1, "pws3_field_create"); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
739 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
740 if (pws3_field_set_text(group_field, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
741 record->group) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
742 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
743 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
744 pws3_record_set_field(pws3_record, group_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
745 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
746 if (record->username != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
747 username_field = pws3_field_create(0, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
748 PWS3_RECORD_FIELD_USERNAME); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
749 if (username_field == NULL) { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
750 err(1, "pws3_field_create"); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
751 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
752 if (pws3_field_set_text(username_field, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
753 record->username) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
754 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
755 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
756 pws3_record_set_field(pws3_record, username_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
757 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
758 if (record->password != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
759 password_field = pws3_field_create(0, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
760 PWS3_RECORD_FIELD_PASSWORD); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
761 if (password_field == NULL) { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
762 err(1, "pws3_field_create"); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
763 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
764 if (pws3_field_set_text(password_field, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
765 record->password) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
766 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
767 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
768 pws3_record_set_field(pws3_record, password_field); |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
769 |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
770 password_mtime_field = pws3_field_create(0, |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
771 PWS3_RECORD_FIELD_PASSWORD_MODIFICATION_TIME); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
772 if (password_mtime_field == NULL) { |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
773 err(1, "pws3_field_create"); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
774 } |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
775 pws3_field_set_time(password_mtime_field, now); |
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
776 pws3_record_set_field(pws3_record, password_mtime_field); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
777 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
778 if (record->notes != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
779 notes_field = pws3_field_create(0, PWS3_RECORD_FIELD_NOTES); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
780 if (notes_field == NULL) { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
781 err(1, "pws3_field_create"); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
782 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
783 if (pws3_field_set_text(notes_field, record->notes) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
784 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
785 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
786 pws3_record_set_field(pws3_record, notes_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
787 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
788 if (record->url != NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
789 url_field = pws3_field_create(0, PWS3_RECORD_FIELD_URL); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
790 if (url_field == NULL) { |
9
60c8ab006e55
Update metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
5
diff
changeset
|
791 err(1, "pws3_field_create"); |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
792 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
793 if (pws3_field_set_text(url_field, record->url) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
794 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
795 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
796 pws3_record_set_field(pws3_record, url_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
797 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
798 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
799 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
800 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
801 pwfile_create_record(struct pwm_ctx *ctx, struct record *record) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
802 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
803 struct pws3_record *pws3_record; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
804 const unsigned char *uuid; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
805 struct record_id_entry *entry; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
806 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
807 pws3_record = pws3_record_create(); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
808 if (pws3_record == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
809 err(1, "pws3_record_create"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
810 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
811 update_record(pws3_record, record); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
812 pws3_file_insert_record(ctx->file, pws3_record); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
813 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
814 uuid = pws3_field_get_uuid(pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
815 PWS3_RECORD_FIELD_UUID)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
816 entry = xmalloc(sizeof (struct record_id_entry)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
817 entry->id = ctx->next_id++; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
818 memcpy(entry->uuid, uuid, sizeof (entry->uuid)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
819 RB_INSERT(record_id_tree, ctx->record_id_tree, entry); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
820 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
821 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
822 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
823 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
824 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
825 pwfile_modify_record(struct pwm_ctx *ctx, unsigned int id, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
826 struct record *record) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
827 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
828 const unsigned char *uuid; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
829 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
830 uuid = record_id_tree_get_uuid(ctx->record_id_tree, id); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
831 if (uuid == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
832 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
833 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
834 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
835 update_record(pws3_file_get_record(ctx->file, uuid), record); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
836 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
837 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
838 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
839 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
840 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
841 pwfile_remove_record(struct pwm_ctx *ctx, unsigned int id) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
842 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
843 const unsigned char *uuid; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
844 struct record_id_entry *entry; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
845 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
846 uuid = record_id_tree_get_uuid(ctx->record_id_tree, id); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
847 if (uuid == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
848 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
849 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
850 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
851 pws3_record_destroy(pws3_file_remove_record(ctx->file, uuid)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
852 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
853 entry = RB_FIND(record_id_tree, ctx->record_id_tree, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
854 &(struct record_id_entry){ .id = id }); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
855 free(RB_REMOVE(record_id_tree, ctx->record_id_tree, entry)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
856 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
857 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
858 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
859 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
860 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
861 pwfile_create_group(struct pwm_ctx *ctx, const char *group) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
862 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
863 struct pws3_record *pws3_record; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
864 struct pws3_field *group_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
865 struct pws3_field *empty_group_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
866 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
867 /* check for a record in the given group */ |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
868 for (pws3_record = pws3_file_first_record(ctx->file); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
869 pws3_record != NULL; pws3_record = pws3_file_next_record(ctx->file, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
870 pws3_record)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
871 group_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
872 PWS3_RECORD_FIELD_GROUP); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
873 if ((group_field != NULL) && |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
874 (strcmp(group, pws3_field_get_text(group_field)) == 0)) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
875 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
876 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
877 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
878 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
879 empty_group_field = pws3_field_create(1, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
880 PWS3_HEADER_FIELD_EMPTY_GROUPS); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
881 if (empty_group_field == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
882 err(1, "pws3_field_create"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
883 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
884 if (pws3_field_set_text(empty_group_field, group) != 0) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
885 err(1, "pws3_field_set_text"); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
886 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
887 pws3_file_insert_empty_group(ctx->file, empty_group_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
888 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
889 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
890 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
891 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
892 int |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
893 pwfile_remove_group(struct pwm_ctx *ctx, const char *group) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
894 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
895 struct pws3_field *empty_group_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
896 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
897 empty_group_field = pws3_file_remove_empty_group(ctx->file, group); |
4
b5c4267a7182
Fix check for successful deletion of a empty group
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
3
diff
changeset
|
898 if (empty_group_field == NULL) { |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
899 return (-1); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
900 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
901 pws3_field_destroy(empty_group_field); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
902 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
903 return (0); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
904 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
905 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
906 struct record * |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
907 pwfile_get_record(struct pwm_ctx *ctx, unsigned int id) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
908 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
909 struct record *record; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
910 const unsigned char *uuid; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
911 struct pws3_record *pws3_record; |
10
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
912 struct pws3_field *ctime_field; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
913 struct pws3_field *mtime_field; |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
914 struct pws3_field *title_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
915 struct pws3_field *group_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
916 struct pws3_field *username_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
917 struct pws3_field *password_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
918 struct pws3_field *notes_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
919 struct pws3_field *url_field; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
920 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
921 uuid = record_id_tree_get_uuid(ctx->record_id_tree, id); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
922 if (uuid == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
923 return (NULL); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
924 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
925 pws3_record = pws3_file_get_record(ctx->file, uuid); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
926 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
927 record = xmalloc(sizeof (struct record)); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
928 |
10
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
929 ctime_field = pws3_record_get_field(pws3_record, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
930 PWS3_RECORD_FIELD_CREATION_TIME); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
931 record->ctime = (ctime_field != NULL) ? |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
932 pws3_field_get_time(ctime_field) : (time_t)0; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
933 |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
934 mtime_field = pws3_record_get_field(pws3_record, |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
935 PWS3_RECORD_FIELD_MODIFICATION_TIME); |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
936 record->mtime = (mtime_field != NULL) ? |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
937 pws3_field_get_time(mtime_field) : (time_t)0; |
17fb30016e64
Enable access to record and file metadata
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
9
diff
changeset
|
938 |
0
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
939 title_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
940 PWS3_RECORD_FIELD_TITLE); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
941 record->title = (title_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
942 xstrdup(pws3_field_get_text(title_field)) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
943 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
944 group_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
945 PWS3_RECORD_FIELD_GROUP); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
946 record->group = (group_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
947 xstrdup(pws3_field_get_text(group_field)) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
948 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
949 username_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
950 PWS3_RECORD_FIELD_USERNAME); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
951 record->username = (username_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
952 xstrdup(pws3_field_get_text(username_field)) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
953 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
954 password_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
955 PWS3_RECORD_FIELD_PASSWORD); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
956 record->password = (password_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
957 xstrdup(pws3_field_get_text(password_field)) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
958 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
959 notes_field = pws3_record_get_field(pws3_record, |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
960 PWS3_RECORD_FIELD_NOTES); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
961 record->notes = (notes_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
962 xstrdup(pws3_field_get_text(notes_field)) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
963 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
964 url_field = pws3_record_get_field(pws3_record, PWS3_RECORD_FIELD_URL); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
965 record->url = (url_field != NULL) ? |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
966 xstrdup(pws3_field_get_text(url_field)) : NULL; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
967 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
968 return (record); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
969 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
970 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
971 void |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
972 pwfile_destroy_record(struct record *record) |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
973 { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
974 if (record == NULL) { |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
975 return; |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
976 } |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
977 |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
978 free(record->title); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
979 free(record->group); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
980 free(record->username); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
981 free(record->password); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
982 free(record->notes); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
983 free(record->url); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
984 free(record); |
a7e41e1a79c8
Initial revision
Guido Berhoerster <guido+pwm@berhoerster.name>
parents:
diff
changeset
|
985 } |