⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkg_hash.c

📁 this is the pkg installer for linux
💻 C
📖 第 1 页 / 共 2 页
字号:
		       latest_matching->name, latest_matching->version, latest_matching->architecture);	  return latest_matching;     }     return NULL;}static int pkg_name_constraint_fcn(pkg_t *pkg, void *cdata){     const char *name = (const char *)cdata;     if (strcmp(pkg->name, name) == 0)	  return 1;     else	  return 0;   }pkg_t *pkg_hash_fetch_best_installation_candidate_by_name(ipkg_conf_t *conf, const char *name){     hash_table_t *hash = &conf->pkg_hash;     abstract_pkg_t *apkg = NULL;     if (!(apkg = abstract_pkg_fetch_by_name(hash, name)))	  return NULL;          return pkg_hash_fetch_best_installation_candidate(conf, apkg, pkg_name_constraint_fcn, apkg->name, 0);}pkg_t * pkg_hash_fetch_by_name_version(hash_table_t *hash, 				       const char *pkg_name,				       const char * version){    pkg_vec_t * vec;    register int i;    char *version_str = NULL;        if(!(vec = pkg_vec_fetch_by_name(hash, pkg_name)))	return NULL;        for(i = 0; i < vec->len; i++) {	version_str = pkg_version_str_alloc(vec->pkgs[i]);	if(!strcmp(version_str, version)) {	    free(version_str);	    break;	}	free(version_str);    }	    if(i == vec->len)	return NULL;        return vec->pkgs[i];}pkg_t *pkg_hash_fetch_installed_by_name_dest(hash_table_t *hash,					     const char *pkg_name,					     pkg_dest_t *dest){    pkg_vec_t * vec;    register int i;    if(!(vec = pkg_vec_fetch_by_name(hash, pkg_name))) {	return NULL;    }        for(i = 0; i < vec->len; i++)	if((vec->pkgs[i]->state_status == SS_INSTALLED || vec->pkgs[i]->state_status == SS_UNPACKED) && vec->pkgs[i]->dest == dest) {	    return vec->pkgs[i];        }    return NULL;}pkg_t *pkg_hash_fetch_installed_by_name(hash_table_t *hash,					const char *pkg_name){    pkg_vec_t * vec;    register int i;    if(!(vec = pkg_vec_fetch_by_name(hash, pkg_name))){	return NULL;    }     for(i = 0; i < vec->len; i++)	if (vec->pkgs[i]->state_status == SS_INSTALLED || vec->pkgs[i]->state_status == SS_UNPACKED){	    return vec->pkgs[i];        }         return NULL;}pkg_vec_t *pkg_vec_fetch_by_name(hash_table_t *hash, const char *pkg_name){    abstract_pkg_t * ab_pkg;    if(!(ab_pkg = abstract_pkg_fetch_by_name(hash, pkg_name))){       return NULL;    }        if (ab_pkg->pkgs) {      return ab_pkg->pkgs;    } else if (ab_pkg->provided_by) {      abstract_pkg_t *abpkg =  abstract_pkg_vec_get(ab_pkg->provided_by, 0);      if (abpkg != NULL){	  return abpkg->pkgs;      } else {	  return ab_pkg->pkgs;      }    } else {      return NULL;    }}static int pkg_compare_names(const void *p1, const void *p2){  const pkg_t *pkg1 = *(const pkg_t **)p1;  const pkg_t *pkg2 = *(const pkg_t **)p2;  if (pkg1->name == NULL)    return 1;  if (pkg2->name == NULL)    return -1;  return(strcmp(pkg1->name, pkg2->name));}static void pkg_hash_fetch_available_helper(const char *pkg_name, void *entry, void *data){  int j;  abstract_pkg_t *ab_pkg = (abstract_pkg_t *)entry;  pkg_vec_t *all = (pkg_vec_t *)data;  pkg_vec_t *pkg_vec = ab_pkg->pkgs;  if (pkg_vec) {    for (j = 0; j < pkg_vec->len; j++) {      pkg_t *pkg = pkg_vec->pkgs[j];      pkg_vec_insert(all, pkg);    }  }}void pkg_hash_fetch_available(hash_table_t *hash, pkg_vec_t *all){    hash_table_foreach(hash, pkg_hash_fetch_available_helper, all);    qsort(all->pkgs, all->len, sizeof(pkg_t *), pkg_compare_names);}static void pkg_hash_fetch_all_installed_helper(const char *pkg_name, void *entry, void *data){  abstract_pkg_t *ab_pkg = (abstract_pkg_t *)entry;  pkg_vec_t *all = (pkg_vec_t *)data;  pkg_vec_t *pkg_vec = ab_pkg->pkgs;  int j;  if (pkg_vec) {    for (j = 0; j < pkg_vec->len; j++) {      pkg_t *pkg = pkg_vec->pkgs[j];      if (pkg->state_status == SS_INSTALLED || pkg->state_status == SS_UNPACKED) {	pkg_vec_insert(all, pkg);      }    }  }}void pkg_hash_fetch_all_installed(hash_table_t *hash, pkg_vec_t *all){    hash_table_foreach(hash, pkg_hash_fetch_all_installed_helper, all);    qsort(all->pkgs, all->len, sizeof(void*), pkg_compare_names);}static void pkg_hash_dump_helper(const char *pkg_name, void *entry, void *data){  int i;  pkg_t *pkg;  abstract_pkg_t *ab_pkg = (abstract_pkg_t *)entry;  ipkg_conf_t *conf = (ipkg_conf_t *)data;  abstract_pkg_t ** dependents = ab_pkg->depended_upon_by;  fprintf(stdout, "%s\n", ab_pkg->name);  i = 0;  if (dependents != NULL)    while (dependents [i] != NULL)      printf ("\tdepended upon by - %s\n", dependents [i ++]->name);  dependents = ab_pkg->provided_by->pkgs;  i = 0;  if (dependents != NULL)    while (dependents [i] != NULL && i < ab_pkg->provided_by->len)      printf ("\tprovided by - %s\n", dependents [i ++]->name);  pkg = pkg_hash_fetch_best_installation_candidate_by_name (conf, ab_pkg->name);  if (pkg) {    i = 0;    while (i < pkg->depends_count)      printf ("\tdepends on - %s\n", pkg->depends_str [i ++]);	  }}void pkg_hash_dump(hash_table_t *hash, void *data){  printf ("\n\n+=+%s+=+\n\n", __FUNCTION__);  hash_table_foreach(hash, pkg_hash_dump_helper, data);  printf ("\n+=+%s+=+\n\n", __FUNCTION__);    }abstract_pkg_t * ensure_abstract_pkg_by_name(hash_table_t * hash, const char * pkg_name){  abstract_pkg_t * ab_pkg;  if(!(ab_pkg = abstract_pkg_fetch_by_name(hash, pkg_name)))    ab_pkg = add_new_abstract_pkg_by_name(hash, pkg_name);  return ab_pkg;}pkg_t *hash_insert_pkg(hash_table_t *hash, pkg_t *pkg, int set_status,ipkg_conf_t *conf){     abstract_pkg_t * ab_pkg;     int arch_priority;     if(!pkg)	  return pkg;     arch_priority = pkg->arch_priority;     if (buildDepends(hash, pkg)<0){        fprintf(stderr, "%s : This should never happen. Report this Bug in bugzilla please \n ",__FUNCTION__);        return NULL;     }     ab_pkg = ensure_abstract_pkg_by_name(hash, pkg->name);     if (set_status) {	  if (pkg->state_status == SS_INSTALLED) {	       ab_pkg->state_status = SS_INSTALLED;	  } else if (pkg->state_status == SS_UNPACKED) {	       ab_pkg->state_status = SS_UNPACKED;	  }     }     if(!ab_pkg->pkgs)	  ab_pkg->pkgs = pkg_vec_alloc();         /* pkg_vec_insert_merge might munge package, but it returns an unmunged pkg */     pkg = pkg_vec_insert_merge(ab_pkg->pkgs, pkg, set_status,conf );     pkg->parent = ab_pkg;     if (buildProvides(hash, ab_pkg, pkg)<0){        fprintf(stderr, "%s : This should never happen. Report this Bug in bugzilla please \n ",__FUNCTION__);        return NULL;     }     /* need to build the conflicts graph before replaces for correct calculation of replaced_by relation */     if (buildConflicts(hash, ab_pkg, pkg)<0){        fprintf(stderr, "%s : This should never happen. Report this Bug in bugzilla please \n ",__FUNCTION__);        return NULL;     }     if (buildReplaces(hash, ab_pkg, pkg)<0) {        fprintf(stderr, "%s : This should never happen. Report this Bug in bugzilla please \n ",__FUNCTION__);        return NULL;     }         buildDependedUponBy(pkg, ab_pkg);     return pkg;}/* * this will assume that we've already determined that * the abstract pkg doesn't exist, 'cause we should know these things... */static abstract_pkg_t * add_new_abstract_pkg_by_name(hash_table_t * hash, const char * pkg_name){  abstract_pkg_t * ab_pkg;  ab_pkg = abstract_pkg_new();  if (ab_pkg == NULL) { return NULL; }  ab_pkg->name = strdup(pkg_name);  hash_table_insert(hash, pkg_name, ab_pkg);  return ab_pkg;}pkg_t *file_hash_get_file_owner(ipkg_conf_t *conf, const char *file_name){     hash_table_t *file_hash = &conf->file_hash;     return hash_table_get(file_hash, file_name); }int file_hash_set_file_owner(ipkg_conf_t *conf, const char *file_name, pkg_t *owning_pkg){     hash_table_t *file_hash = &conf->file_hash;     pkg_t *old_owning_pkg = hash_table_get(file_hash, file_name);     int file_name_len = strlen(file_name);     if (file_name[file_name_len -1] == '/')	  return 0;     if (conf->offline_root) {	  int len = strlen(conf->offline_root);	  if (strncmp(file_name, conf->offline_root, len) == 0) {	       file_name += len;	  }     }     // ipkg_message(conf, IPKG_DEBUG2, "owning_pkg=%s filename=%s\n", owning_pkg->name, file_name);     hash_table_insert(file_hash, file_name, owning_pkg);      if (old_owning_pkg) {	  str_list_remove_elt(old_owning_pkg->installed_files, file_name);	  /* mark this package to have its filelist written */	  old_owning_pkg->state_flag |= SF_FILELIST_CHANGED;	  owning_pkg->state_flag |= SF_FILELIST_CHANGED;     }     return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -