libreport  2.1.3
A tool to inform users about various problems on the running system
dump_dir.h
1 /*
2  On-disk storage of problem data
3 
4  Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
5  Copyright (C) 2009 RedHat inc.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License along
18  with this program; if not, write to the Free Software Foundation, Inc.,
19  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21 #ifndef LIBREPORT_DUMP_DIR_H_
22 #define LIBREPORT_DUMP_DIR_H_
23 
24 /* For DIR */
25 #include <sys/types.h>
26 #include <dirent.h>
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 enum {
33  DD_FAIL_QUIETLY_ENOENT = (1 << 0),
34  DD_FAIL_QUIETLY_EACCES = (1 << 1),
35  /* Open symlinks. dd_* funcs don't open symlinks by default */
36  DD_OPEN_FOLLOW = (1 << 2),
37  DD_OPEN_READONLY = (1 << 3),
38 };
39 
40 struct dump_dir {
41  char *dd_dirname;
42  DIR *next_dir;
43  int locked;
44  uid_t dd_uid;
45  gid_t dd_gid;
46  /* mode fo saved files */
47  mode_t mode;
48  time_t dd_time;
49 };
50 
51 void dd_close(struct dump_dir *dd);
52 
53 struct dump_dir *dd_opendir(const char *dir, int flags);
54 /* Pass uid = (uid_t)-1L to disable chown'ing of newly created files
55  * (IOW: if you aren't running under root):
56  */
57 struct dump_dir *dd_create(const char *dir, uid_t uid, mode_t mode);
58 
59 void dd_create_basic_files(struct dump_dir *dd, uid_t uid, const char *chroot_dir);
60 int dd_exist(const struct dump_dir *dd, const char *path);
61 void dd_sanitize_mode_and_owner(struct dump_dir *dd);
62 
63 DIR *dd_init_next_file(struct dump_dir *dd);
64 int dd_get_next_file(struct dump_dir *dd, char **short_name, char **full_name);
65 
66 enum {
67  /* DD_FAIL_QUIETLY_ENOENT bit is valid for dd_load_text_ext too, */
68  DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE = (DD_OPEN_READONLY << 1),
69 };
70 char* dd_load_text_ext(const struct dump_dir *dd, const char *name, unsigned flags);
71 char* dd_load_text(const struct dump_dir *dd, const char *name);
72 void dd_save_text(struct dump_dir *dd, const char *name, const char *data);
73 void dd_save_binary(struct dump_dir *dd, const char *name, const char *data, unsigned size);
74 /* Returns value less than 0 if any error occured; otherwise returns size of an
75  * item in Bytes. If an item does not exist returns 0 instead of an error
76  * value.
77  */
78 long dd_get_item_size(struct dump_dir *dd, const char *name);
79 /* Deletes an item from dump directory
80  * On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
81  * For more about errno see unlink documentation
82  */
83 int dd_delete_item(struct dump_dir *dd, const char *name);
84 /* Returns 0 if directory is deleted or not found */
85 int dd_delete(struct dump_dir *dd);
86 int dd_rename(struct dump_dir *dd, const char *new_path);
87 /* Changes owner of dump dir
88  * Uses two different strategies selected at build time by
89  * DUMP_DIR_OWNED_BY_USER configuration:
90  * <= 0 : owner = abrt user's uid, group = new_uid's gid
91  * > 0 : owner = new_uid, group = abrt group's gid
92  *
93  * On success, zero is returned. On error, -1 is returned.
94  */
95 int dd_chown(struct dump_dir *dd, uid_t new_uid);
96 
97 
98 /* reported_to handling */
99 #define add_reported_to libreport_add_reported_to
100 void add_reported_to(struct dump_dir *dd, const char *line);
102  char *url;
103  char *msg;
104  char *bthash;
105  /* char *whole_line; */
106  /* time_t timestamp; */
107  /* ^^^ if you add more fields, don't forget to update free_report_result() */
108 };
109 typedef struct report_result report_result_t;
110 #define free_report_result libreport_free_report_result
111 void free_report_result(struct report_result *result);
112 #define find_in_reported_to libreport_find_in_reported_to
113 report_result_t *find_in_reported_to(struct dump_dir *dd, const char *prefix);
114 /* TODO: GList *read_entire_reported_to(dd); */
115 
116 
117 void delete_dump_dir(const char *dirname);
118 /* Checks dump dir accessibility for particular uid.
119  *
120  * If the directory doesn't exist the directory is not accessible and errno is
121  * set to ENOTDIR.
122  *
123  * Returns non zero if dump dir is accessible otherwise return 0 value.
124  */
125 int dump_dir_accessible_by_uid(const char *dirname, uid_t uid);
126 
127 /* creates not_reportable file in the problem directory and saves the
128  reason to it, which prevents libreport from reporting the problem
129  On success, zero is returned.
130  On error, -1 is returned and an error message is logged.
131  - this could probably happen only if the dump dir is not locked
132 */
133 int dd_mark_as_notreportable(struct dump_dir *dd, const char *reason);
134 
135 #ifdef __cplusplus
136 }
137 #endif
138 
139 #endif