/* *************************************************************************** * Read header data sent by sadc. *************************************************************************** */ void read_header_data(void) { struct file_magic file_magic; struct file_activity file_act; int rc, i, p; char version[16]; /* Read magic header */ rc = sa_read(&file_magic, FILE_MAGIC_SIZE); sprintf(version, "%d.%d.%d.%d", file_magic.sysstat_version, file_magic.sysstat_patchlevel, file_magic.sysstat_sublevel, file_magic.sysstat_extraversion); if (!file_magic.sysstat_extraversion) { version[strlen(version) - 2] = '\0'; } if (rc || (file_magic.sysstat_magic != SYSSTAT_MAGIC) || (file_magic.format_magic != FORMAT_MAGIC) || strcmp(version, VERSION)) { /* sar and sadc commands are not consistent */ if (!rc && (file_magic.sysstat_magic == SYSSTAT_MAGIC)) { fprintf(stderr, _("Using a wrong data collector from a different sysstat version\n")); } goto input_error; } /* * Read header data. * No need to take into account file_magic.header_size. We are sure that * sadc and sar are from the same version (we have checked FORMAT_MAGIC * but also VERSION above) and thus the size of file_header is FILE_HEADER_SIZE. */ if (sa_read(&file_hdr, FILE_HEADER_SIZE)) { print_read_error(); } if (file_hdr.sa_act_nr > NR_ACT) goto input_error; /* Read activity list */ for (i = 0; i < file_hdr.sa_act_nr; i++) { if (sa_read(&file_act, FILE_ACTIVITY_SIZE)) { print_read_error(); } p = get_activity_position(act, file_act.id, RESUME_IF_NOT_FOUND); if ((p < 0) || (act[p]->fsize != file_act.size) || !file_act.nr || !file_act.nr2 || (act[p]->magic != file_act.magic)) /* Remember that we are reading data from sadc and not from a file... */ goto input_error; id_seq[i] = file_act.id; /* We necessarily have "i < NR_ACT" */ act[p]->nr = file_act.nr; act[p]->nr2 = file_act.nr2; } while (i < NR_ACT) { id_seq[i++] = 0; } /* Check that all selected activties are actually sent by sadc */ reverse_check_act(file_hdr.sa_act_nr); return; input_error: /* Strange data sent by sadc...! */ fprintf(stderr, _("Inconsistent input data\n")); exit(3); }
/* * Fetch all subdirectories and append those that match the pattern to the list. */ static u_int32_t NI_query_all(agent_private *ap, char *path, int single_item, int stamp, dsrecord *pattern, dsrecord **list) { ni_idlist idl; ni_proplist pl; ni_id dir; int dx, i; ni_status status; dsrecord *r, *lastrec; lastrec = NULL; for (dx = 0; dx < ap->domain_count; dx++) { if (stamp == 1) { r = dsrecord_new(); NI_add_validation(ap, r, dx); if (*list == NULL) *list = r; else lastrec->next = r; lastrec = r; continue; } NI_INIT(&dir); syslock_lock(rpcLock); status = sa_pathsearch(ap->domain[dx].handle, &dir, path); syslock_unlock(rpcLock); if (status != NI_OK) continue; NI_INIT(&idl); syslock_lock(rpcLock); status = sa_children(ap->domain[dx].handle, &dir, &idl); syslock_unlock(rpcLock); if (status != NI_OK) continue; for (i = 0; i < idl.ni_idlist_len; i++) { dir.nii_object = idl.ni_idlist_val[i]; dir.nii_instance = 0; NI_INIT(&pl); syslock_lock(rpcLock); status = sa_read(ap->domain[dx].handle, &dir, &pl); syslock_unlock(rpcLock); if (status != NI_OK) continue; r = nitods(&pl); NI_add_validation(ap, r, dx); ni_proplist_free(&pl); if (r == NULL) continue; if (dsrecord_match(r, pattern)) { if (*list == NULL) *list = r; else lastrec->next = r; lastrec = r; if (single_item == 1) { ni_idlist_free(&idl); return 0; } } else { dsrecord_release(r); } } ni_idlist_free(&idl); } return 0; }
/* * Use ni_lookup to match key=value, * Fetch matching subdirectories and append those that match the pattern to the list. */ static u_int32_t NI_query_lookup(agent_private *ap, char *path, int single_item, u_int32_t where, dsrecord *pattern, dsrecord **list) { ni_idlist idl; ni_proplist pl; ni_id dir; int dx, i, try_realname; ni_status status; dsrecord *r, *lastrec; char *key, *val; dsattribute *a; lastrec = NULL; a = dsattribute_retain(pattern->attribute[where]); key = dsdata_to_cstring(a->key); val = dsdata_to_cstring(a->value[0]); dsrecord_remove_attribute(pattern, a, SELECT_ATTRIBUTE); /* * SPECIAL CASE For category user, key "name": * if no matches for "name", try "realname". */ try_realname = 0; if ((!strcmp(path, "/users")) && (!strcmp(key, "name"))) try_realname = 1; for (dx = 0; dx < ap->domain_count; dx++) { NI_INIT(&dir); syslock_lock(rpcLock); status = sa_pathsearch(ap->domain[dx].handle, &dir, path); syslock_unlock(rpcLock); if (status != NI_OK) continue; NI_INIT(&idl); syslock_lock(rpcLock); status = sa_lookup(ap->domain[dx].handle, &dir, key, val, &idl); if ((idl.ni_idlist_len == 0) && (try_realname == 1)) { status = sa_lookup(ap->domain[dx].handle, &dir, "realname", val, &idl); } syslock_unlock(rpcLock); if (status != NI_OK) continue; for (i = 0; i < idl.ni_idlist_len; i++) { dir.nii_object = idl.ni_idlist_val[i]; dir.nii_instance = 0; NI_INIT(&pl); syslock_lock(rpcLock); status = sa_read(ap->domain[dx].handle, &dir, &pl); syslock_unlock(rpcLock); if (status != NI_OK) continue; r = nitods(&pl); NI_add_validation(ap, r, dx); ni_proplist_free(&pl); if (r == NULL) continue; if (dsrecord_match(r, pattern)) { if (*list == NULL) *list = r; else lastrec->next = r; lastrec = r; if (single_item == 1) { ni_idlist_free(&idl); dsattribute_release(a); return 0; } } else { dsrecord_release(r); } } ni_idlist_free(&idl); } dsattribute_release(a); return 0; }
/* *************************************************************************** * Read header data sent by sadc. *************************************************************************** */ void read_header_data(void) { struct file_magic file_magic; struct file_activity file_act; int rc, i, p; char version[16]; /* Read magic header */ rc = sa_read(&file_magic, FILE_MAGIC_SIZE); sprintf(version, "%d.%d.%d.%d", file_magic.sysstat_version, file_magic.sysstat_patchlevel, file_magic.sysstat_sublevel, file_magic.sysstat_extraversion); if (!file_magic.sysstat_extraversion) { version[strlen(version) - 2] = '\0'; } if (rc || (file_magic.sysstat_magic != SYSSTAT_MAGIC) || (file_magic.format_magic != FORMAT_MAGIC) || strcmp(version, VERSION)) { /* sar and sadc commands are not consistent */ fprintf(stderr, _("Invalid data format\n")); if (!rc && (file_magic.sysstat_magic == SYSSTAT_MAGIC)) { fprintf(stderr, _("Using a wrong data collector from a different sysstat version\n")); } exit(3); } /* Read header data */ if (sa_read(&file_hdr, FILE_HEADER_SIZE)) { print_read_error(); } /* Read activity list */ for (i = 0; i < file_hdr.sa_nr_act; i++) { if (sa_read(&file_act, FILE_ACTIVITY_SIZE)) { print_read_error(); } p = get_activity_position(act, file_act.id); if ((p < 0) || (act[p]->fsize != file_act.size) || !file_act.nr || !file_act.nr2 || (act[p]->magic != file_act.magic)) { /* Remember that we are reading data from sadc and not from a file... */ fprintf(stderr, _("Inconsistent input data\n")); exit(3); } id_seq[i] = file_act.id; /* We necessarily have "i < NR_ACT" */ act[p]->nr = file_act.nr; act[p]->nr2 = file_act.nr2; } while (i < NR_ACT) { id_seq[i++] = 0; } /* Check that all selected activties are actually sent by sadc */ reverse_check_act(file_hdr.sa_nr_act); }