rpm
5.2.1
|
00001 00005 #if defined(__APPLE__) 00006 /* workaround for "uuid_t" type conflict, between <unistd.h> and "uuid.h" */ 00007 #define _UUID_T 00008 #define uuid_t __darwin_uuid_t 00009 #include <unistd.h> 00010 #undef uuid_t 00011 #undef _UUID_T 00012 #endif 00013 00014 #include "system.h" 00015 #include <string.h> 00016 #include "rpmlog.h" 00017 #include "rpmuuid.h" 00018 #ifdef WITH_UUID 00019 #include "uuid.h" 00020 #endif 00021 #include "debug.h" 00022 00023 int rpmuuidMake(int version, const char *ns, const char *data, char *buf_str, unsigned char *buf_bin) 00024 { 00025 #ifdef WITH_UUID 00026 uuid_rc_t rc; 00027 uuid_t *uuid = NULL; 00028 uuid_t *uuid_ns = NULL; 00029 char *result_ptr; 00030 size_t result_len; 00031 00032 /* sanity check version */ 00033 if (!(version == 1 || (version >= 3 && version <= 5))) { 00034 rpmlog(RPMLOG_ERR, _("invalid UUID version number")); 00035 return 1; 00036 } 00037 if ((version == 3 || version == 5) && (ns == NULL || data == NULL)) { 00038 rpmlog(RPMLOG_ERR, _("namespace or data required for requested UUID version\n")); 00039 return 1; 00040 } 00041 if (buf_str == NULL && buf_bin == NULL) { 00042 rpmlog(RPMLOG_ERR, _("either string or binary result buffer required\n")); 00043 return 1; 00044 } 00045 00046 /* create UUID object */ 00047 if ((rc = uuid_create(&uuid)) != UUID_RC_OK) { 00048 rpmlog(RPMLOG_ERR, _("failed to create UUID object: %s\n"), uuid_error(rc)); 00049 return 1; 00050 } 00051 00052 /* create optional UUID namespace object */ 00053 if (version == 3 || version == 5) { 00054 if ((rc = uuid_create(&uuid_ns)) != UUID_RC_OK) { 00055 rpmlog(RPMLOG_ERR, _("failed to create UUID namespace object: %s\n"), uuid_error(rc)); 00056 return 1; 00057 } 00058 if ((rc = uuid_load(uuid_ns, ns)) != UUID_RC_OK) { 00059 if ((rc = uuid_import(uuid_ns, UUID_FMT_STR, ns, strlen(ns))) != UUID_RC_OK) { 00060 rpmlog(RPMLOG_ERR, _("failed to import UUID namespace object: %s\n"), uuid_error(rc)); 00061 return 1; 00062 } 00063 } 00064 } 00065 00066 /* generate UUID */ 00067 if (version == 1) 00068 rc = uuid_make(uuid, UUID_MAKE_V1); 00069 else if (version == 3) 00070 rc = uuid_make(uuid, UUID_MAKE_V3, uuid_ns, data); 00071 else if (version == 4) 00072 rc = uuid_make(uuid, UUID_MAKE_V4); 00073 else if (version == 5) 00074 rc = uuid_make(uuid, UUID_MAKE_V5, uuid_ns, data); 00075 if (rc != UUID_RC_OK) { 00076 (void) uuid_destroy(uuid); 00077 if (uuid_ns != NULL) 00078 (void) uuid_destroy(uuid_ns); 00079 rpmlog(RPMLOG_ERR, _("failed to make UUID object: %s\n"), uuid_error(rc)); 00080 return 1; 00081 } 00082 00083 /* export UUID */ 00084 if (buf_str != NULL) { 00085 result_ptr = buf_str; 00086 result_len = UUID_LEN_STR+1; 00087 if ((rc = uuid_export(uuid, UUID_FMT_STR, &result_ptr, &result_len)) != UUID_RC_OK) { 00088 (void) uuid_destroy(uuid); 00089 if (uuid_ns != NULL) 00090 (void) uuid_destroy(uuid_ns); 00091 rpmlog(RPMLOG_ERR, _("failed to export UUID object as string representation: %s\n"), uuid_error(rc)); 00092 return 1; 00093 } 00094 } 00095 if (buf_bin != NULL) { 00096 result_ptr = (char *)buf_bin; 00097 result_len = UUID_LEN_BIN; 00098 if ((rc = uuid_export(uuid, UUID_FMT_BIN, &result_ptr, &result_len)) != UUID_RC_OK) { 00099 (void) uuid_destroy(uuid); 00100 if (uuid_ns != NULL) 00101 (void) uuid_destroy(uuid_ns); 00102 rpmlog(RPMLOG_ERR, _("failed to export UUID object as binary representation: %s\n"), uuid_error(rc)); 00103 return 1; 00104 } 00105 } 00106 00107 /* destroy UUID object(s) */ 00108 (void) uuid_destroy(uuid); 00109 if (uuid_ns != NULL) 00110 (void) uuid_destroy(uuid_ns); 00111 00112 /* indicate success */ 00113 return 0; 00114 #else 00115 rpmlog(RPMLOG_ERR, _("UUID generator not available!\n")); 00116 00117 /* indicate error */ 00118 return 1; 00119 #endif 00120 } 00121