From 4bcea76663008bf0c9b0b5516716702f243bc9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Sat, 23 Dec 2023 22:46:44 +0100 Subject: OpenFilesScreen: Make column sizing dynamic for file size, offset and inode Previously this limited the size to single-digit-gigabytes(!). Now it can be single-digit-petabytes before going out of alignment. Fixes: Debian#1059369 --- OpenFilesScreen.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'OpenFilesScreen.c') diff --git a/OpenFilesScreen.c b/OpenFilesScreen.c index 29540247..b3f94314 100644 --- a/OpenFilesScreen.c +++ b/OpenFilesScreen.c @@ -34,6 +34,7 @@ typedef struct OpenFiles_Data_ { typedef struct OpenFiles_ProcessData_ { OpenFiles_Data data; int error; + int cols[8]; struct OpenFiles_FileData_* files; } OpenFiles_ProcessData; @@ -92,6 +93,9 @@ static void OpenFilesScreen_draw(InfoScreen* this) { static OpenFiles_ProcessData* OpenFilesScreen_getProcessData(pid_t pid) { OpenFiles_ProcessData* pdata = xCalloc(1, sizeof(OpenFiles_ProcessData)); + pdata->cols[getIndexForType('s')] = 8; + pdata->cols[getIndexForType('o')] = 8; + pdata->cols[getIndexForType('i')] = 8; int fdpair[2] = {0, 0}; if (pipe(fdpair) == -1) { @@ -164,6 +168,10 @@ static OpenFiles_ProcessData* OpenFilesScreen_getProcessData(pid_t pid) { { size_t index = getIndexForType(cmd); free_and_xStrdup(&item->data[index], line + 1); + size_t dlen = strlen(item->data[index]); + if (dlen > (size_t)pdata->cols[index]) { + pdata->cols[index] = (int)CLAMP(dlen, 0, INT16_MAX); + } break; } case 'o': /* file's offset */ @@ -174,6 +182,10 @@ static OpenFiles_ProcessData* OpenFilesScreen_getProcessData(pid_t pid) { } else { free_and_xStrdup(&item->data[index], line + 1); } + size_t dlen = strlen(item->data[index]); + if (dlen > (size_t)pdata->cols[index]) { + pdata->cols[index] = (int)CLAMP(dlen, 0, INT16_MAX); + } break; } case 'c': /* process command name */ @@ -249,17 +261,30 @@ static void OpenFilesScreen_scan(InfoScreen* this) { } else if (pdata->error == 1) { InfoScreen_addLine(this, "Failed listing open files."); } else { + char hdrbuf[128] = {0}; + snprintf(hdrbuf, sizeof(hdrbuf), "%5.5s %-7.7s %-4.4s %6.6s %*s %*s %*s %s", + "FD", "TYPE", "MODE", "DEVICE", + pdata->cols[getIndexForType('s')], "SIZE", + pdata->cols[getIndexForType('o')], "OFFSET", + pdata->cols[getIndexForType('i')], "NODE", + "NAME" + ); + Panel_setHeader(panel, hdrbuf); + OpenFiles_FileData* fdata = pdata->files; while (fdata) { OpenFiles_Data* data = &fdata->data; char* entry = NULL; - xAsprintf(&entry, "%5.5s %-7.7s %-4.4s %-10.10s %10.10s %10.10s %10.10s %s", + xAsprintf(&entry, "%5.5s %-7.7s %-4.4s %6.6s %*s %*s %*s %s", getDataForType(data, 'f'), getDataForType(data, 't'), getDataForType(data, 'a'), getDataForType(data, 'D'), + pdata->cols[getIndexForType('s')], getDataForType(data, 's'), + pdata->cols[getIndexForType('o')], getDataForType(data, 'o'), + pdata->cols[getIndexForType('i')], getDataForType(data, 'i'), getDataForType(data, 'n')); InfoScreen_addLine(this, entry); -- cgit v1.2.3