Cancellazione dati: come trovare centri riparazione computer
Come Trovare Centri di Riparazione per la Cancellazione dei Dati sui Computer.
Trovare un Centro di Assistenza per la Cancellazione Sicura dei Dati sui Computer.
Scopri come trovare i migliori centri di riparazione per la cancellazione dei dati sui computer. Questo articolo offre consigli utili e strategie per scegliere il servizio giusto, garantendo la sicurezza delle tue informazioni. Non lasciare nulla al caso, leggi ora per fare la scelta migliore!
Trova professionisti vicino a te
Trova professionisti
/*
* Copyright (c) 2007-2009, Novell Inc.
*
* This program is licensed under the BSD license, read LICENSE.BSD
* for further information
*/
#include
#include
#include
#include
#include
#include
#include
#include "pool.h"
#include "poolarch.h"
#include "poolvendor.h"
#include "repo_solv.h"
#include "common_write.h"
#include "repo_rpmmd.h"
struct rpmmd_solv_data {
Repo *repo;
Solvable *solvable;
Repodata *data;
char *lang;
Id handle;
Queue dirq;
int isprimary;
int flags;
int done;
int depth;
int intag; /* 1: filelist 2: changelog 3: other tags */
int inprimary;
int filelistextend;
int filesizecount;
char *filesizechecksum;
Id filesizeid;
int filedigestcount;
char *filedigestchecksum;
Id filedigestid;
Id tagid; /* tagid of tag we are in */
Id dircache; /* id of dircache string */
char dircachebuf[PATH_MAX]; /* buffer for dircache string */
int dircachelen; /* length of dircache string */
char *lastdir; /* last dir name (for dircache) */
char *lastlang; /* last lang name (for changelog) */
};
struct rpmmd_solv_dir {
char *name;
int namel;
int nsubs;
struct rpmmd_solv_dir *subs;
};
struct rpmmd_solv_dircache {
struct rpmmd_solv_dir *dir;
};
static void
rpmmd_end(struct rpmmd_solv_data *data, const char *name)
{
if (data->intag == 1)
{
if (!strcmp(name, "file") && data->filesizecount && data->filedigestcount)
{
data->filesizecount = 0;
data->filedigestcount = 0;
repodata_set_num(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_DISKUSAGE, data->filesizeid);
if (data->filedigestid)
repodata_set_id(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_CHECKSUM, data->filedigestid);
data->filesizeid = 0;
data->filedigestid = 0;
if (data->filesizechecksum)
{
free(data->filesizechecksum);
data->filesizechecksum = 0;
}
if (data->filedigestchecksum)
{
free(data->filedigestchecksum);
data->filedigestchecksum = 0;
}
}
else if (!strcmp(name, "filelist"))
{
if (data->dircache)
{
if (data->filelistextend)
repodata_set_id(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_FILELIST, data->dircache);
else
repodata_set_id(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_FILELIST_DIRS, data->dircache);
data->dircache = 0;
}
data->filelistextend = 0;
}
else if (!strcmp(name, "changelog"))
{
if (data->lang)
{
repodata_set_str(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_CHANGELOG_AUTHOR, data->lang);
repodata_set_str(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_CHANGELOG_TEXT, data->lang);
free(data->lang);
data->lang = 0;
data->lastlang = 0;
}
}
data->intag = 0;
}
else if (data->intag == 2)
{
if (!strcmp(name, "text"))
{
if (data->lang)
{
if (data->lastlang)
{
Repodata *lndata;
lndata = repodata_new_handle(data->data, data->handle);
repodata_set_str(lndata, data->solvable - data->repo->pool->solvables, SOLVABLE_CHANGELOG_TEXT, data->lang);
repodata_set_str(lndata, data->solvable - data->repo->pool->solvables, SOLVABLE_CHANGELOG_AUTHOR, data->lastlang);
repodata_free_handle(lndata, data->handle++);
free(data->lang);
free(data->lastlang);
data->lang = 0;
data->lastlang = 0;
}
}
}
data->intag = 0;
}
else if (data->intag == 3)
{
if (!strcmp(name, "prestoinfo"))
{
if (data->lang)
{
repodata_set_str(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_PRESTOINFO, data->lang);
free(data->lang);
data->lang = 0;
}
}
data->intag = 0;
}
else if (data->intag)
{
data->intag = 0;
}
else
{
if (!strcmp(name, "package"))
{
if (data->dircache)
{
if (data->filelistextend)
repodata_set_id(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_FILELIST, data->dircache);
else
repodata_set_id(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_FILELIST_DIRS, data->dircache);
data->dircache = 0;
}
data->filelistextend = 0;
data->done = 1;
}
else if (!strcmp(name, "primary"))
{
Queue q;
int i;
if (data->isprimary && !data->inprimary && data->repo->nsolvables)
{
queue_init(&q);
for (i = 0; i < data->dirq.count; i += 3)
queue_push2(&q, data->dirq.elements[i], data->dirq.elements[i + 1]);
repodata_set_dirs(data->data, data->repo->nsolvables - 1, SOLVABLE_FILELIST, &q);
queue_free(&q);
}
queue_free(&data->dirq);
data->inprimary = 0;
}
else if (!strcmp(name, "rpmmd"))
{
data->done = 1;
}
}
data->depth--;
}
static void
rpmmd_start(void *vdata, const char *name, const char **atts)
{
struct rpmmd_solv_data *data = vdata;
const char *lang;
const char *id;
const char *v;
int i;
if (data->done)
return;
if (!strcmp(name, "package"))
{
data->solvable = solvable_create(data->repo, 0);
if (data->isprimary)
{
data->data = repo_add_repodata(data->repo, 0);
data->handle = data->data->start;
queue_init(&data->dirq);
}
for (i = 0; atts[i]; i += 2)
{
if (!strcmp(atts[i], "name"))
{
solvable_set_str(data->solvable, SOLVABLE_NAME, pool_tmpjoin(data->repo->pool, atts[i + 1], 0, 0));
continue;
}
if (!strcmp(atts[i], "version"))
{
solvable_set_str(data->solvable, SOLVABLE_VERSION, pool_tmpjoin(data->repo->pool, atts[i + 1], 0, 0));
continue;
}
if (!strcmp(atts[i], "release"))
{
solvable_set_str(data->solvable, SOLVABLE_RELEASE, pool_tmpjoin(data->repo->pool, atts[i + 1], 0, 0));
continue;
}
if (!strcmp(atts[i], "arch"))
{
int a = pool_str2id(data->repo->pool, atts[i + 1], 1);
if (a && a != ARCH_SRC && a != ARCH_NOSRC)
solvable_set_arch(data->solvable, a);
continue;
}
if (!strcmp(atts[i], "vendor"))
{
int v = pool_str2id(data->repo->pool, atts[i + 1], 1);
if (v)
solvable_set_vendor(data->solvable, v);
continue;
}
}
}
else if (!strcmp(name, "primary"))
{
data->inprimary = 1;
}
else if (!strcmp(name, "file"))
{
for (i = 0; atts[i]; i += 2)
{
if (!strcmp(atts[i], "type") && !strcmp(atts[i + 1], "dir"))
{
data->filesizecount = 0;
data->filedigestcount = 0;
break;
}
if (!strcmp(atts[i], "lang"))
{
if (!strcmp(atts[i + 1], "C"))
lang = 0;
else
lang = atts[i + 1];
if (data->lastdir || data->lastlang != lang || data->dirq.count == 0)
{
if (data->dirq.count && data->dirq.elements[data->dirq.count - 1])
{
data->dirq.count++;
queue_push2(&data->dirq, 0, 0);
}
data->lastlang = lang;
id = pool_tmpjoin(data->repo->pool, data->lastdir ? data->lastdir : "", lang ? lang : "", 0);
i = pool_str2id(data->repo->pool, id, 1);
if (data->dircache)
{
data->dircachebuf[data->dircachelen] = 0;
repodata_set_str(data->data, data->solvable - data->repo->pool->solvables, data->dircache, data->dircachebuf);
data->dircache = 0;
}
data->dircache = repodata_new_handle(data->data, data->handle);
data->dircachelen = 0;
queue_push2(&data->dirq, i, 0);
}
}
else if (!strcmp(atts[i], "name"))
{
data->lastdir = atts[i + 1];
if (data->dircache && !(data->flags & REPO_EXTEND_FILELISTS))
{
data->dircachebuf[data->dircachelen] = 0;
repodata_set_str(data->data, data->solvable - data->repo->pool->solvables, data->dircache, data->dircachebuf);
data->dircache = 0;
}
if (data->flags & REPO_EXTEND_FILELISTS)
{
int l = strlen(atts[i + 1]);
if (data->dircachelen + l + 1 >= sizeof(data->dircachebuf))
{
id = pool_tmpjoin(data->repo->pool, data->dircachebuf, 0, 0);
i = pool_str2id(data->repo->pool, id, 1);
if (data->dircache)
repodata_set_str(data->data, data->solvable - data->repo->pool->solvables, data->dircache, data->dircachebuf);
data->dircache = repodata_new_handle(data->data, data->handle);
data->dircachelen = 0;
queue_push2(&data->dirq, i, 0);
}
if (data->dircachelen)
data->dircachebuf[data->dircachelen++] = '/';
strcpy(data->dircachebuf + data->dircachelen, atts[i + 1]);
data->dircachelen += l;
}
}
}
data->intag = 1;
}
else if (!strcmp(name, "format"))
{
v = 0;
lang = 0;
for (i = 0; atts[i]; i += 2)
{
if (!strcmp(atts[i], "type") && !strcmp(atts[i + 1], "rpm"))
v = atts[i + 1];
else if (!strcmp(atts[i], "lang"))
{
if (!strcmp(atts[i + 1], "C"))
lang = 0;
else
lang = atts[i + 1];
}
}
if (v)
repodata_set_poolstr(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_MEDIA, v);
if (lang)
repodata_set_poolstr(data->data, data->solvable - data->repo->pool->solvables, SOLVABLE_LOCATION_SUBDIR, lang);
}
else if (!strcmp(name, "filelist"))
{
data->intag = 1;
data->filelistextend = 0;
for (i = 0; atts[i]; i += 2)
{
if (!str