00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __C_CREATEREPOLIB_MISC_H__
00021 #define __C_CREATEREPOLIB_MISC_H__
00022
00023 #ifdef __cplusplus
00024 extern "C" {
00025 #endif
00026
00027 #include <glib.h>
00028 #include <string.h>
00029 #include <curl/curl.h>
00030 #include "compression_wrapper.h"
00031 #include "xml_parser.h"
00032
00040 #define CR_UNUSED(x) (void)(x)
00041
00044 #define CR_STATICSTRLEN(s) (sizeof(s)/sizeof(s[0]))
00045
00046
00047
00048 #define CR_ARRAYLEN(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
00049
00054 const char *cr_flag_to_str(gint64 flags);
00055
00058 struct cr_EVR {
00059 char *epoch;
00060 char *version;
00061 char *release;
00062 };
00063
00066 struct cr_NVREA {
00067 char *name;
00068 char *version;
00069 char *release;
00070 char *epoch;
00071 char *arch;
00072 };
00073
00077 struct cr_Version {
00078 long version;
00079 long release;
00080 long patch;
00081 char *suffix;
00082 };
00083
00084
00093 struct cr_EVR cr_str_to_evr(const char *string, GStringChunk *chunk);
00094
00100 static inline int cr_is_primary(const char *filename) {
00101 if (!strncmp(filename, "/etc/", 5))
00102 return 1;
00103 if (!strcmp(filename, "/usr/lib/sendmail"))
00104 return 1;
00105 if (strstr(filename, "bin/"))
00106 return 1;
00107 return 0;
00108 };
00109
00112 struct cr_HeaderRangeStruct {
00113 unsigned int start;
00114 unsigned int end;
00115 };
00116
00122 struct cr_HeaderRangeStruct cr_get_header_byte_range(const char *filename,
00123 GError **err);
00124
00130 char *cr_get_filename(const char *filepath);
00131
00140 int cr_download(CURL *handle,
00141 const char *url,
00142 const char *destination,
00143 GError **err);
00144
00151 int cr_copy_file(const char *src,
00152 const char *dst,
00153 GError **err);
00154
00164 #define cr_compress_file(SRC, DST, COMTYPE, ERR) \
00165 cr_compress_file_with_stat(SRC, DST, COMTYPE, NULL, ERR)
00166
00177 int cr_compress_file_with_stat(const char *src,
00178 const char *dst,
00179 cr_CompressionType comtype,
00180 cr_ContentStat *stat,
00181 GError **err);
00182
00193 #define cr_decompress_file(SRC, DST, COMTYPE, ERR) \
00194 cr_decompress_file_with_stat(SRC, DST, COMTYPE, NULL, ERR)
00195
00207 int cr_decompress_file_with_stat(const char *src,
00208 const char *dst,
00209 cr_CompressionType comtype,
00210 cr_ContentStat *stat,
00211 GError **err);
00212
00219 int cr_better_copy_file(const char *src,
00220 const char *dst,
00221 GError **err);
00222
00228 int cr_remove_dir(const char *path, GError **err);
00229
00234 char *cr_normalize_dir_path(const char *path);
00235
00240 struct cr_Version cr_str_to_version(const char *str);
00241
00248 int cr_cmp_version_str(const char* str1, const char *str2);
00249
00256 void cr_null_log_fn(const gchar *log_domain,
00257 GLogLevelFlags log_level,
00258 const gchar *message,
00259 gpointer user_data);
00260
00267 void cr_log_fn(const gchar *log_domain,
00268 GLogLevelFlags log_level,
00269 const gchar *message,
00270 gpointer user_data);
00271
00279 void cr_slist_free_full(GSList *list, GDestroyNotify free_f);
00280
00285 struct cr_NVREA *cr_split_rpm_filename(const char *filename);
00286
00290 void cr_nvrea_free(struct cr_NVREA *nvrea);
00291
00297 #define cr_cmp_nvrea(A, B) (cr_cmp_evr((A)->epoch, (A)->version, (A)->release,\
00298 (B)->epoch, (B)->version, (B)->release))
00299
00309 int cr_cmp_evr(const char *e1, const char *v1, const char *r1,
00310 const char *e2, const char *v2, const char *r2);
00311
00312
00318 static inline gchar *
00319 cr_safe_string_chunk_insert(GStringChunk *chunk, const char *str)
00320 {
00321 if (!str) return NULL;
00322 return g_string_chunk_insert(chunk, str);
00323 }
00324
00330 static inline gchar *
00331 cr_safe_string_chunk_insert_and_free(GStringChunk *chunk, char *str)
00332 {
00333 if (!str) return NULL;
00334 gchar *copy = g_string_chunk_insert(chunk, str);
00335 g_free(str);
00336 return copy;
00337 }
00338
00345 static inline gchar *
00346 cr_safe_string_chunk_insert_null(GStringChunk *chunk, const char *str)
00347 {
00348 if (!str || *str == '\0') return NULL;
00349 return g_string_chunk_insert(chunk, str);
00350 }
00351
00352
00358 static inline gchar *
00359 cr_safe_string_chunk_insert_const(GStringChunk *chunk, const char *str)
00360 {
00361 if (!str) return NULL;
00362 return g_string_chunk_insert_const(chunk, str);
00363 }
00364
00365 static inline gboolean
00366 cr_key_file_get_boolean_default(GKeyFile *key_file,
00367 const gchar *group_name,
00368 const gchar *key,
00369 gboolean default_value,
00370 GError **error)
00371 {
00372 GError *tmp_err = NULL;
00373 gboolean ret = g_key_file_get_boolean(key_file, group_name, key, &tmp_err);
00374 if (tmp_err) {
00375 g_propagate_error(error, tmp_err);
00376 return default_value;
00377 }
00378 return ret;
00379 }
00380
00386 int
00387 cr_warning_cb(cr_XmlParserWarningType type,
00388 char *msg,
00389 void *cbdata,
00390 GError **err);
00391
00398 gboolean
00399 cr_write_to_file(GError **err, gchar *filename, const char *format, ...);
00400
00401 typedef enum {
00402 CR_CP_DEFAULT = (1<<0),
00404 CR_CP_RECURSIVE = (1<<1),
00406 CR_CP_PRESERVE_ALL = (1<<2),
00408 } cr_CpFlags;
00409
00417 gboolean
00418 cr_cp(const char *src,
00419 const char *dst,
00420 cr_CpFlags flags,
00421 const char *working_directory,
00422 GError **err);
00423
00424 typedef enum {
00425 CR_RM_DEFAULT = (1<<0),
00427 CR_RM_RECURSIVE = (1<<1),
00429 CR_RM_FORCE = (1<<2),
00431 } cr_RmFlags;
00432
00439 gboolean
00440 cr_rm(const char *path,
00441 cr_RmFlags flags,
00442 const char *working_dir,
00443 GError **err);
00444
00450 gchar *
00451 cr_append_pid_and_datetime(const char *str, const char *suffix);
00452
00461 gboolean
00462 cr_spawn_check_exit_status(gint exit_status, GError **error);
00463
00466 #ifdef __cplusplus
00467 }
00468 #endif
00469
00470 #endif