struct pt_section *pt_mk_section(const char *filename, uint64_t offset, uint64_t size) { struct pt_section *section; uint64_t fsize; void *status; int errcode; errcode = pt_section_mk_status(&status, &fsize, filename); if (errcode < 0) return NULL; /* Fail if the requested @offset lies beyond the end of @file. */ if (fsize <= offset) goto out_status; /* Truncate @size so the entire range lies within @file. */ fsize -= offset; if (fsize < size) size = fsize; section = malloc(sizeof(*section)); if (!section) goto out_status; memset(section, 0, sizeof(*section)); section->filename = dupstr(filename); section->status = status; section->offset = offset; section->size = size; section->ucount = 1; #if defined(FEATURE_THREADS) errcode = mtx_init(§ion->lock, mtx_plain); if (errcode != thrd_success) { free(section->filename); free(section); goto out_status; } #endif /* defined(FEATURE_THREADS) */ return section; out_status: free(status); return NULL; }
int pt_mk_section(struct pt_section **psection, const char *filename, uint64_t offset, uint64_t size) { struct pt_section *section; uint64_t fsize; size_t flen; void *status; char *fname; int errcode; if (!psection) return -pte_internal; flen = strnlen(filename, FILENAME_MAX); if (FILENAME_MAX <= flen) return -pte_invalid; flen += 1; fname = malloc(flen); if (!fname) return -pte_nomem; memcpy(fname, filename, flen); errcode = pt_section_mk_status(&status, &fsize, fname); if (errcode < 0) goto out_fname; /* Fail if the requested @offset lies beyond the end of @file. */ if (fsize <= offset) { errcode = -pte_invalid; goto out_status; } /* Truncate @size so the entire range lies within @file. */ fsize -= offset; if (fsize < size) size = fsize; section = malloc(sizeof(*section)); if (!section) { errcode = -pte_nomem; goto out_status; } memset(section, 0, sizeof(*section)); section->filename = fname; section->status = status; section->offset = offset; section->size = size; section->ucount = 1; #if defined(FEATURE_THREADS) errcode = mtx_init(§ion->lock, mtx_plain); if (errcode != thrd_success) { free(section); errcode = -pte_bad_lock; goto out_status; } errcode = mtx_init(§ion->alock, mtx_plain); if (errcode != thrd_success) { mtx_destroy(§ion->lock); free(section); errcode = -pte_bad_lock; goto out_status; } #endif /* defined(FEATURE_THREADS) */ *psection = section; return 0; out_status: free(status); out_fname: free(fname); return errcode; }