static void ptable_print(void *arg, const char *pname, const struct ptable_entry *part) { struct ptable *table; struct disk *dp, bsd; char line[80], size[6]; dp = (struct disk *)arg; sprintf(line, " %s%s: %s", dp->file ? "disk0": dp->name, pname, parttype2str(part->type)); humanize_number(size, sizeof(size), (part->end - part->start + 1) * dp->sectorsize, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); printf("%-*s%s\n", PWIDTH, line, size); if (part->type == PART_FREEBSD) { sprintf(line, "%s%s", dp->file ? "disk0": dp->name, pname); bsd.name = line; bsd.fd = dp->fd; bsd.file = 0; /* to use dp->name in the next sprintf */ bsd.offset = dp->offset + part->start; bsd.sectorsize = dp->sectorsize; bsd.mediasize = (part->end - part->start + 1) * dp->sectorsize; table = ptable_open(&bsd, bsd.mediasize / bsd.sectorsize, bsd.sectorsize, diskread); if (table == NULL) return; ptable_iterate(table, &bsd, ptable_print); ptable_close(table); } }
static void inspect_disk(struct disk *dp) { struct ptable *table; table = ptable_open(dp, dp->mediasize / dp->sectorsize, dp->sectorsize, diskread); if (table == NULL) { printf("ptable_open failed\n"); return; } printf("Partition table detected: %s\n", ptable_type2str(table)); ptable_iterate(table, dp, ptable_print); ptable_close(table); }
/* * Inicia o skeleton da tabela. * O main() do servidor deve chamar este método antes de usar a * funço invoke(). O parâmetro n_lists define o número de listas a serem * usadas pela tabela mantida no servidor. O parâmetro filename corresponde ao * nome a ser usado nos ficheiros de log e checkpoint. * Retorna 0 (OK) ou -1 (erro, por exemplo OUT OF MEMORY). */ int table_skel_init(int n_lists, char *filename) { //verifica a validade dos parâmetros if(n_lists <= 0 || filename == NULL) { ERROR("table_skel: NULL filename or invalid nlists"); return -1; } if(!sharedPtable) { //cria e verifica uma nova tabela struct table_t *sharedTable; if((sharedTable = table_create(n_lists)) == NULL) { ERROR("table_skel: table_create"); return -1; } //cria e verifica um novo persistence_manager struct pmanager_t *sharedPmanager; if((sharedPmanager = pmanager_create(filename, MAX_LOG_SIZE, MODE_DSYNC)) == NULL) { ERROR("table_skel: pmanager_create"); table_destroy(sharedTable); return -1; } //cria e verifica um persistent_table if((sharedPtable = ptable_open(sharedTable, sharedPmanager)) == NULL) { ERROR("table_skel: ptable_open"); table_destroy(sharedTable); pmanager_destroy(sharedPmanager); return -1; } // Garbage collection ptable_collect_garbage(sharedPtable); } //em caso de sucesso return 0; }