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_STATICSTRLEN(s) (sizeof(s)/sizeof(s[0]))
00041
00042
00043
00044 #define CR_ARRAYLEN(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
00045
00050 const char *cr_flag_to_str(gint64 flags);
00051
00054 typedef struct {
00055 char *epoch;
00056 char *version;
00057 char *release;
00058 } cr_EVR;
00059
00060 typedef struct {
00061 char *name;
00062 char *epoch;
00063 char *version;
00064 char *release;
00065 } cr_NEVR;
00066
00067 typedef struct {
00068 char *name;
00069 char *epoch;
00070 char *version;
00071 char *release;
00072 char *arch;
00073 } cr_NEVRA;
00074
00078 struct cr_Version {
00079 long major;
00080 long minor;
00081 long patch;
00082 char *suffix;
00083 };
00084
00085
00094 cr_EVR *cr_str_to_evr(const char *string, GStringChunk *chunk);
00095
00102 void
00103 cr_evr_free(cr_EVR *evr);
00104
00110 static inline int cr_is_primary(const char *filename) {
00111 if (!strncmp(filename, "/etc/", 5))
00112 return 1;
00113 if (!strcmp(filename, "/usr/lib/sendmail"))
00114 return 1;
00115 if (strstr(filename, "bin/"))
00116 return 1;
00117 return 0;
00118 };
00119
00122 struct cr_HeaderRangeStruct {
00123 unsigned int start;
00124 unsigned int end;
00125 };
00126
00132 struct cr_HeaderRangeStruct cr_get_header_byte_range(const char *filename,
00133 GError **err);
00134
00140 char *cr_get_filename(const char *filepath);
00141
00150 int cr_download(CURL *handle,
00151 const char *url,
00152 const char *destination,
00153 GError **err);
00154
00161 gboolean cr_copy_file(const char *src,
00162 const char *dst,
00163 GError **err);
00164
00174 #define cr_compress_file(SRC, DST, COMTYPE, ERR) \
00175 cr_compress_file_with_stat(SRC, DST, COMTYPE, NULL, ERR)
00176
00187 int cr_compress_file_with_stat(const char *src,
00188 const char *dst,
00189 cr_CompressionType comtype,
00190 cr_ContentStat *stat,
00191 GError **err);
00192
00203 #define cr_decompress_file(SRC, DST, COMTYPE, ERR) \
00204 cr_decompress_file_with_stat(SRC, DST, COMTYPE, NULL, ERR)
00205
00217 int cr_decompress_file_with_stat(const char *src,
00218 const char *dst,
00219 cr_CompressionType comtype,
00220 cr_ContentStat *stat,
00221 GError **err);
00222
00229 gboolean cr_better_copy_file(const char *src,
00230 const char *dst,
00231 GError **err);
00232
00238 int cr_remove_dir(const char *path, GError **err);
00239
00244 char *cr_normalize_dir_path(const char *path);
00245
00250 struct cr_Version cr_str_to_version(const char *str);
00251
00258 int cr_cmp_version_str(const char* str1, const char *str2);
00259
00266 void cr_null_log_fn(const gchar *log_domain,
00267 GLogLevelFlags log_level,
00268 const gchar *message,
00269 gpointer user_data);
00270
00277 void cr_log_fn(const gchar *log_domain,
00278 GLogLevelFlags log_level,
00279 const gchar *message,
00280 gpointer user_data);
00281
00289 void cr_slist_free_full(GSList *list, GDestroyNotify free_f);
00290
00298 void cr_queue_free_full(GQueue *queue, GDestroyNotify free_f);
00299
00309 cr_NEVRA *cr_split_rpm_filename(const char *filename);
00310
00316 #define cr_cmp_nevra(A, B) (cr_cmp_evr((A)->epoch, (A)->version, (A)->release,\
00317 (B)->epoch, (B)->version, (B)->release))
00318
00328 int cr_cmp_evr(const char *e1, const char *v1, const char *r1,
00329 const char *e2, const char *v2, const char *r2);
00330
00331
00337 static inline gchar *
00338 cr_safe_string_chunk_insert(GStringChunk *chunk, const char *str)
00339 {
00340 if (!str) return NULL;
00341 return g_string_chunk_insert(chunk, str);
00342 }
00343
00349 static inline gchar *
00350 cr_safe_string_chunk_insert_and_free(GStringChunk *chunk, char *str)
00351 {
00352 if (!str) return NULL;
00353 gchar *copy = g_string_chunk_insert(chunk, str);
00354 g_free(str);
00355 return copy;
00356 }
00357
00364 static inline gchar *
00365 cr_safe_string_chunk_insert_null(GStringChunk *chunk, const char *str)
00366 {
00367 if (!str || *str == '\0') return NULL;
00368 return g_string_chunk_insert(chunk, str);
00369 }
00370
00371
00377 static inline gchar *
00378 cr_safe_string_chunk_insert_const(GStringChunk *chunk, const char *str)
00379 {
00380 if (!str) return NULL;
00381 return g_string_chunk_insert_const(chunk, str);
00382 }
00383
00384 static inline gboolean
00385 cr_key_file_get_boolean_default(GKeyFile *key_file,
00386 const gchar *group_name,
00387 const gchar *key,
00388 gboolean default_value,
00389 GError **error)
00390 {
00391 GError *tmp_err = NULL;
00392 gboolean ret = g_key_file_get_boolean(key_file, group_name, key, &tmp_err);
00393 if (tmp_err) {
00394 g_propagate_error(error, tmp_err);
00395 return default_value;
00396 }
00397 return ret;
00398 }
00399
00405 int
00406 cr_warning_cb(cr_XmlParserWarningType type,
00407 char *msg,
00408 void *cbdata,
00409 GError **err);
00410
00417 gboolean
00418 cr_write_to_file(GError **err, gchar *filename, const char *format, ...);
00419
00420 typedef enum {
00421 CR_CP_DEFAULT = (1<<0),
00423 CR_CP_RECURSIVE = (1<<1),
00425 CR_CP_PRESERVE_ALL = (1<<2),
00427 } cr_CpFlags;
00428
00436 gboolean
00437 cr_cp(const char *src,
00438 const char *dst,
00439 cr_CpFlags flags,
00440 const char *working_directory,
00441 GError **err);
00442
00443 typedef enum {
00444 CR_RM_DEFAULT = (1<<0),
00446 CR_RM_RECURSIVE = (1<<1),
00448 CR_RM_FORCE = (1<<2),
00450 } cr_RmFlags;
00451
00458 gboolean
00459 cr_rm(const char *path,
00460 cr_RmFlags flags,
00461 const char *working_dir,
00462 GError **err);
00463
00469 gchar *
00470 cr_append_pid_and_datetime(const char *str, const char *suffix);
00471
00480 gboolean
00481 cr_spawn_check_exit_status(gint exit_status, GError **error);
00482
00487 cr_NEVR *
00488 cr_str_to_nevr(const char *str);
00489
00493 void
00494 cr_nevr_free(cr_NEVR *nevr);
00495
00500 cr_NEVRA *
00501 cr_str_to_nevra(const char *str);
00502
00506 void
00507 cr_nevra_free(cr_NEVRA *nevra);
00508
00520 gboolean
00521 cr_identical_files(const gchar *fn1,
00522 const gchar *fn2,
00523 gboolean *identical,
00524 GError **err);
00525
00529 gchar *
00530 cr_cut_dirs(gchar *path, gint cut_dirs);
00531
00534 #ifdef __cplusplus
00535 }
00536 #endif
00537
00538 #endif