retvalue trackingdata_remove(struct trackingdata *data, /*@only@*/char*oldsource, /*@only@*/char*oldversion, const struct strlist *oldfilekeys) { retvalue result, r; struct trackedpackage *pkg; assert(oldsource != NULL && oldversion != NULL && oldfilekeys != NULL); if (data->pkg != NULL && strcmp(oldversion, data->pkg->sourceversion) == 0 && strcmp(oldsource, data->pkg->sourcename) == 0) { /* Unlikely, but it may also be the same source version as * the package we are currently adding */ free(oldsource); free(oldversion); return trackedpackage_removefilekeys(data->tracks, data->pkg, oldfilekeys); } result = tracking_get(data->tracks, oldsource, oldversion, &pkg); if (RET_WAS_ERROR(result)) { free(oldsource); free(oldversion); return result; } if (result == RET_NOTHING) { fprintf(stderr, "Could not found tracking data for %s_%s in %s to remove old files from it.\n", oldsource, oldversion, data->tracks->codename); free(oldsource); free(oldversion); return RET_OK; } r = trackedpackage_removefilekeys(data->tracks, pkg, oldfilekeys); RET_UPDATE(result, r); r = tracking_save(data->tracks, pkg); RET_UPDATE(result, r); r = trackingdata_remember(data, oldsource, oldversion); RET_UPDATE(result, r); return result; }
retvalue tracking_getornew(trackingdb tracks, const char *name, const char *version, /*@out@*/struct trackedpackage **pkg) { retvalue r; r = tracking_get(tracks, name, version, pkg); if (r == RET_NOTHING) r = tracking_new(name, version, pkg); return r; }
retvalue trackingdata_finish(trackingdb tracks, struct trackingdata *d) { retvalue r; assert (d->tracks == tracks); if (d->pkg != NULL) { r = trackedpackage_tidy(tracks, d->pkg); r = tracking_save(tracks, d->pkg); } else r = RET_OK; d->pkg = NULL; /* call for all remembered actions... */ while (d->remembered != NULL) { struct trackingdata_remember *h = d->remembered; struct trackedpackage *pkg; d->remembered = h->next; r = tracking_get(tracks, h->name, h->version, &pkg); free(h->name); free(h->version); free(h); if (RET_IS_OK(r)) { r = trackedpackage_tidy(tracks, pkg); r = tracking_save(tracks, pkg); } } d->tracks = NULL; return r; }
retvalue tracking_removepackages(trackingdb t, struct distribution *distribution, const char *sourcename, /*@null@*/const char *version) { struct trackedpackage *pkg; retvalue result, r; if (version == NULL) return tracking_foreachversion(t, distribution, sourcename, removesourcepackage); result = tracking_get(t, sourcename, version, &pkg); if (RET_IS_OK(result)) { result = removesourcepackage(t, pkg, distribution); if (RET_IS_OK(result)) { r = trackedpackage_tidy(t, pkg); RET_ENDUPDATE(result, r); r = tracking_save(t, pkg); RET_ENDUPDATE(result, r); } else trackedpackage_free(pkg); } return result; }
void net_get(nut_ctype_t *client, int numarg, const char **arg) { if (numarg < 1) { send_err(client, NUT_ERR_INVALID_ARGUMENT); return; } /* GET TRACKING [ID] */ if (!strcasecmp(arg[0], "TRACKING")) { if (numarg < 2) { sendback(client, "%s\n", (client->tracking) ? "ON" : "OFF"); } else { if (client->tracking) sendback(client, "%s\n", tracking_get(arg[1])); else send_err(client, NUT_ERR_FEATURE_NOT_CONFIGURED); } return; } if (numarg < 2) { send_err(client, NUT_ERR_INVALID_ARGUMENT); return; } /* GET NUMLOGINS UPS */ if (!strcasecmp(arg[0], "NUMLOGINS")) { get_numlogins(client, arg[1]); return; } /* GET UPSDESC UPS */ if (!strcasecmp(arg[0], "UPSDESC")) { get_upsdesc(client, arg[1]); return; } if (numarg < 3) { send_err(client, NUT_ERR_INVALID_ARGUMENT); return; } /* GET VAR UPS VARNAME */ if (!strcasecmp(arg[0], "VAR")) { get_var(client, arg[1], arg[2]); return; } /* GET TYPE UPS VARNAME */ if (!strcasecmp(arg[0], "TYPE")) { get_type(client, arg[1], arg[2]); return; } /* GET DESC UPS VARNAME */ if (!strcasecmp(arg[0], "DESC")) { get_desc(client, arg[1], arg[2]); return; } /* GET CMDDESC UPS CMDNAME */ if (!strcasecmp(arg[0], "CMDDESC")) { get_cmddesc(client, arg[1], arg[2]); return; } send_err(client, NUT_ERR_INVALID_ARGUMENT); return; }