Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package growlight for openSUSE:Factory checked in at 2025-11-06 18:13:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/growlight (Old) and /work/SRC/openSUSE:Factory/.growlight.new.1980 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "growlight" Thu Nov 6 18:13:17 2025 rev:17 rq:1315768 version:1.2.40 Changes: -------- --- /work/SRC/openSUSE:Factory/growlight/growlight.changes 2022-12-19 14:08:03.622600986 +0100 +++ /work/SRC/openSUSE:Factory/.growlight.new.1980/growlight.changes 2025-11-06 18:14:56.107805978 +0100 @@ -1,0 +2,14 @@ +Wed Nov 5 10:49:18 UTC 2025 - Martin Hauke <[email protected]> + +- Update to version 1.2.40 + * When given -v, growlight-readline now enables ncdirect logging. + * We now search for, and link against, libnotcurses-core instead + of libnotcurses. + +------------------------------------------------------------------- +Thu Oct 30 19:48:48 UTC 2025 - Martin Hauke <[email protected]> + +- Update to version 1.2.39 + * Upstream does not provide a changelog + +------------------------------------------------------------------- Old: ---- growlight-1.2.38.tar.gz New: ---- growlight-1.2.40.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ growlight.spec ++++++ --- /var/tmp/diff_new_pack.1rhcvt/_old 2025-11-06 18:14:57.299856269 +0100 +++ /var/tmp/diff_new_pack.1rhcvt/_new 2025-11-06 18:14:57.303856438 +0100 @@ -1,8 +1,8 @@ # # spec file for package growlight # -# Copyright (c) 2022 SUSE LLC -# Copyright (c) 2020-2021, Martin Hauke <[email protected]> +# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2020-2025, Martin Hauke <[email protected]> # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -23,7 +23,7 @@ %bcond_without pandoc %endif Name: growlight -Version: 1.2.38 +Version: 1.2.40 Release: 0 Summary: Disk manipulation and system setup tool License: GPL-3.0-or-later ++++++ growlight-1.2.38.tar.gz -> growlight-1.2.40.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/.drone.yml new/growlight-1.2.40/.drone.yml --- old/growlight-1.2.38/.drone.yml 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/.drone.yml 2025-11-05 09:32:12.000000000 +0100 @@ -5,11 +5,12 @@ steps: - name: debian-build - image: dankamongmen/unstable_builder:2021-11-14a + image: dankamongmen/unstable_builder:2022-01-29a commands: - export LANG=en_US.UTF-8 + - export TERM=xterm - mkdir build - cd build - cmake -DUSE_LIBZFS=off .. - make - - make test + - ctest -v --output-on-failure diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/.github/workflows/ubuntu_test.yml new/growlight-1.2.40/.github/workflows/ubuntu_test.yml --- old/growlight-1.2.38/.github/workflows/ubuntu_test.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/growlight-1.2.40/.github/workflows/ubuntu_test.yml 2025-11-05 09:32:12.000000000 +0100 @@ -0,0 +1,62 @@ +--- +name: Ubuntu + +on: + pull_request: + push: + branches: + - master + +jobs: + tests: + env: + COLORTERM: truecolor + NPROC: 2 + TERM: xterm + name: 🐧 build, test, & install + runs-on: ubuntu-latest + + steps: + + - name: Install tools and libraries via APT + run: | + sudo apt update + sudo apt install -y \ + build-essential \ + cmake \ + nettle-dev \ + libatasmart-dev \ + libnotcurses-dev \ + libcap-dev \ + libcryptsetup-dev \ + libblkid-dev \ + libdevmapper-dev \ + nettle-dev \ + libudev-dev \ + libpci-dev \ + libpciaccess-dev \ + doctest-dev \ + pandoc + + - uses: actions/checkout@v2 + + - name: cmake + run: | + mkdir build && cd build + cmake .. \ + -DCMAKE_BUILD_TYPE=Release -DUSE_LIBZFS=off + + - name: make + run: | + cd build + make -j${NPROC} + + - name: ctest + run: | + cd build + ctest --output-on-failure + + - name: make install + run: | + cd build + sudo make install diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/CMakeLists.txt new/growlight-1.2.40/CMakeLists.txt --- old/growlight-1.2.38/CMakeLists.txt 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/CMakeLists.txt 2025-11-05 09:32:12.000000000 +0100 @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.14) -project(growlight VERSION 1.2.38 +project(growlight VERSION 1.2.40 DESCRIPTION "Block device and filesystem manager" HOMEPAGE_URL "https://nick-black.com/dankwiki/index.php/Growlight" LANGUAGES C CXX) @@ -34,8 +34,8 @@ find_package(PkgConfig REQUIRED) find_package(Threads) set_package_properties(Threads PROPERTIES TYPE REQUIRED) -find_package(Notcurses 3.0.0 CONFIG) -set_package_properties(Notcurses PROPERTIES TYPE REQUIRED) +find_package(NotcursesCore 3.0.5 CONFIG) +set_package_properties(NotcursesCore PROPERTIES TYPE REQUIRED) pkg_check_modules(LIBATASMART REQUIRED libatasmart>=0.19) pkg_check_modules(LIBBLKID REQUIRED blkid>=2.20.1) pkg_check_modules(LIBCAP REQUIRED libcap>=2.24) @@ -173,6 +173,11 @@ ) endif() +add_test( + NAME blockdev-verbose + COMMAND sh -c "echo 'blockdev -v' | ./growlight-readline -v --notroot" +) + # Pandoc documentation (man pages) if(USE_PANDOC) file(GLOB MANSOURCE8 CONFIGURE_DEPENDS doc/man/man8/*.md) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/README.md new/growlight-1.2.40/README.md --- old/growlight-1.2.38/README.md 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/README.md 2025-11-05 09:32:12.000000000 +0100 @@ -22,7 +22,7 @@ - libcryptsetup 2.1.5+ - libdevmapper 1.02.74+ - libnettle 3.5.1+ - - libnotcurses 3.0.0+ + - libnotcurses 3.0.5+ - libpci 3.1.9+ - libpciaccess 0.13.1+ - libudev 175+ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/doc/man/man8/growlight-readline.8.md new/growlight-1.2.40/doc/man/man8/growlight-readline.8.md --- old/growlight-1.2.38/doc/man/man8/growlight-readline.8.md 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/doc/man/man8/growlight-readline.8.md 2025-11-05 09:32:12.000000000 +0100 @@ -1,6 +1,6 @@ % growlight-readline(8) % nick black <[email protected]> -% v1.2.38 +% v1.2.40 # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/doc/man/man8/growlight.8.md new/growlight-1.2.40/doc/man/man8/growlight.8.md --- old/growlight-1.2.38/doc/man/man8/growlight.8.md 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/doc/man/man8/growlight.8.md 2025-11-05 09:32:12.000000000 +0100 @@ -1,6 +1,6 @@ % growlight(8) % nick black <[email protected]> -% v1.2.38 +% v1.2.40 # NAME diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/gpt.c new/growlight-1.2.40/src/gpt.c --- old/growlight-1.2.38/src/gpt.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/gpt.c 2025-11-05 09:32:12.000000000 +0100 @@ -18,7 +18,8 @@ #define LBA_SIZE 512u #define MBR_SIZE (LBA_SIZE - MBR_OFFSET) -static const unsigned char GPT_PROTECTIVE_MBR[LBA_SIZE - MBR_OFFSET] = +static const unsigned char __attribute__ ((nonstring)) +GPT_PROTECTIVE_MBR[LBA_SIZE - MBR_OFFSET] = "\x00\x00\x00\x00\x00\x00" // 6 bytes of zeros "\x80" // bootable (violation of GPT spec, but some // BIOS/MBR *and* UEFI won't boot otherwise) @@ -32,7 +33,8 @@ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x55\xaa"; // MBR signature -static const unsigned char gpt_signature[8] = +static const unsigned char __attribute__ ((nonstring)) +gpt_signature[8] = "\x45\x46\x49\x20\x50\x41\x52\x54"; uint32_t host_to_le32(uint32_t x){ @@ -338,7 +340,6 @@ const_map_gpt(const device *d, size_t *mapsize, int *fd, size_t lbasize){ const int pgsize = getpagesize(); const unsigned gptlbas = 1 + (MINIMUM_GPT_ENTRIES * sizeof(struct gpt_entry) / lbasize); - uint64_t off; void *map; if(pgsize < 0){ @@ -351,7 +352,7 @@ } // The first copy goes into LBA 1. Calculate offset into map due to // lbasize possibly (probably) not equalling the page size. - if((off = lbasize % pgsize) == 0){ + if(lbasize % pgsize == 0){ *mapsize = 0; }else{ *mapsize = lbasize; @@ -380,7 +381,6 @@ map_gpt(device *d, size_t *mapsize, int *fd, size_t lbasize){ const int pgsize = getpagesize(); const unsigned gptlbas = 1 + (MINIMUM_GPT_ENTRIES * sizeof(struct gpt_entry) / lbasize); - uint64_t off; void *map; if(pgsize < 0){ @@ -397,7 +397,7 @@ } // The first copy goes into LBA 1. Calculate offset into map due to // lbasize possibly (probably) not equalling the page size. - if((off = lbasize % pgsize) == 0){ + if(lbasize % pgsize == 0){ *mapsize = 0; }else{ *mapsize = lbasize; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/growlight.c new/growlight-1.2.40/src/growlight.c --- old/growlight-1.2.38/src/growlight.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/growlight.c 2025-11-05 09:32:12.000000000 +0100 @@ -325,8 +325,8 @@ data = 0; if( (pcicap = pci_find_cap(pcidev, PCI_CAP_ID_EXP, PCI_CAP_NORMAL)) ){ data = pci_read_word(pcidev, pcicap->addr + PCI_EXP_LNKSTA); - }else if( (pcicap = pci_find_cap(pcidev, PCI_CAP_ID_MSI, PCI_CAP_NORMAL)) ){ - // FIXME? + //}else if( (pcicap = pci_find_cap(pcidev, PCI_CAP_ID_MSI, PCI_CAP_NORMAL)) ){ + // FIXME? } if(data){ c->pcie.gen = data & PCI_EXP_LNKSTA_SPEED; @@ -1441,7 +1441,6 @@ verbf("Watching %s on fd %d\n", dfp, *wd); } } - r = 0; if((dir = opendir(dfp)) == NULL){ diag("Couldn't open %s (%s)\n", dfp, strerror(errno)); if(fd >= 0){ inotify_rm_watch(fd, *wd); } @@ -1501,14 +1500,14 @@ static void version(const char *name){ - diag("%s version %s\n", basename(name), VERSION); + diag("%s version %s\n", name, VERSION); } static void usage(const char *name, int disphelp){ diag("usage: %s [ -h|--help ] [ -v|--verbose ] [ -V|--version ]\n" "\t[ -t|--target=path ] [ --notroot ] [ -i|--import ]%s\n", - basename(name), disphelp ? " [ --disphelp ]" : ""); + name, disphelp ? " [ --disphelp ]" : ""); } static int @@ -1618,11 +1617,10 @@ assert(events[r].events == EPOLLIN); while((s = read(em->ifd, buf, buflen)) > 0){ const struct inotify_event *in; - unsigned idx = 0; - if(s - idx >= (ptrdiff_t)sizeof(*in)){ - in = (struct inotify_event *)(buf + idx); - idx += sizeof(*in); + // FIXME can there only be one event per read buffer? + if(s >= (ptrdiff_t)sizeof(*in)){ + in = (struct inotify_event *)(buf); if(in->len == 0){ diag("Nil-file event on unknown watch desc %d\n", in->wd); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/mounts.c new/growlight-1.2.40/src/mounts.c --- old/growlight-1.2.38/src/mounts.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/mounts.c 2025-11-05 09:32:12.000000000 +0100 @@ -145,8 +145,93 @@ return -1; } +static int +handle_mount(const glightui *gui, const char* mnt, const char* dev, const char* ops, char** fs){ + struct statvfs vfs; + device *d; + + if(statvfs(mnt, &vfs)){ + int skip = 0; + + // We might have mounted a new target atop or above an + // already existing one, in which case we'll need + // possibly recreate the directory structure on the + // newly-mounted filesystem. + if(growlight_target){ + if(strncmp(mnt, growlight_target, strlen(growlight_target)) == 0){ + if(make_parent_directories(mnt) == 0){ + skip = 1; + } // FIXME else remount? otherwise writes + // go to new filesystem rather than old...? + } + } + if(!skip){ + diag("Couldn't stat fs %s (%s?)\n", mnt, strerror(errno)); + return 0; + } + } + if(*dev != '/'){ // have to get zfs's etc + if(fstype_virt_p(*fs)){ + return 0; + } + if((d = lookup_device(dev)) == NULL){ + verbf("virtfs %s at %s\n", *fs, mnt); + return 0; + } + }else{ + const char *rp = dev; + struct stat st; + if(lstat(rp, &st) == 0){ + if(S_ISLNK(st.st_mode)){ + char buf[PATH_MAX + 1]; + int r; + if((r = readlink(dev, buf, sizeof(buf))) < 0){ + diag("Couldn't deref %s (%s?)\n", dev, strerror(errno)); + return 0; + } + if((size_t)r >= sizeof(buf)){ + diag("Name too long for %s (%d?)\n", dev, r); + return 0; + } + buf[r] = '\0'; + rp = buf; + } + } + if((d = lookup_device(rp)) == NULL){ + return 0; + } + } + if(d->mnttype && strcmp(d->mnttype, *fs)){ + diag("Already had mounttype for %s: %s (got %s)\n", + d->name, d->mnttype, *fs); + free(d->mnttype); + d->mnttype = NULL; + free_stringlist(&d->mntops); + free_stringlist(&d->mnt); + d->mnttype = *fs; + *fs = NULL; + } + fs = NULL; + if(add_string(&d->mnt, mnt)){ + return -1; + } + if(add_string(&d->mntops, ops)){ + return -1; + } + d->mntsize = (uintmax_t)vfs.f_bsize * vfs.f_blocks; + if(d->layout == LAYOUT_PARTITION){ + d = d->partdev.parent; + } + d->uistate = gui->block_event(d, d->uistate); + if(growlight_target){ + if(strcmp(mnt, growlight_target) == 0){ + mount_target(); + } + } + return 0; +} + int parse_mounts(const glightui *gui, const char *fn){ - char *mnt, *dev, *ops, *fs; off_t len, idx; char *map; int fd; @@ -155,111 +240,25 @@ return -1; } idx = 0; - dev = mnt = fs = ops = NULL; + int ret = 0; while(idx < len){ - char buf[PATH_MAX + 1]; - struct statvfs vfs; - struct stat st; - device *d; - char *rp; + char *mnt, *dev, *ops, *fs; int r; - free(dev); free(mnt); free(fs); free(ops); - dev = mnt = fs = ops = NULL; // don't goto double-free() + dev = mnt = fs = ops = NULL; if((r = parse_mount(map + idx, len - idx, &dev, &mnt, &fs, &ops)) < 0){ - goto err; + ret = -1; + break; } idx += r; - if(statvfs(mnt, &vfs)){ - int skip = 0; - - // We might have mounted a new target atop or above an - // already existing one, in which case we'll need - // possibly recreate the directory structure on the - // newly-mounted filesystem. - if(growlight_target){ - if(strncmp(mnt, growlight_target, strlen(growlight_target)) == 0){ - if(make_parent_directories(mnt) == 0){ - skip = 1; - } // FIXME else remount? otherwise writes - // go to new filesystem rather than old...? - } - } - if(!skip){ - diag("Couldn't stat fs %s (%s?)\n", mnt, strerror(errno)); - continue; - } - } - if(*dev != '/'){ // have to get zfs's etc - if(fstype_virt_p(fs)){ - continue; - } - if((d = lookup_device(dev)) == NULL){ - verbf("virtfs %s at %s\n", fs, mnt); - continue; - } - }else{ - rp = dev; - if(lstat(rp, &st) == 0){ - if(S_ISLNK(st.st_mode)){ - if((r = readlink(dev, buf, sizeof(buf))) < 0){ - diag("Couldn't deref %s (%s?)\n", dev, strerror(errno)); - continue; - } - if((size_t)r >= sizeof(buf)){ - diag("Name too long for %s (%d?)\n", dev, r); - continue; - } - buf[r] = '\0'; - rp = buf; - } - } - if((d = lookup_device(rp)) == NULL){ - continue; - } - } - free(dev); - dev = NULL; - if(d->mnttype && strcmp(d->mnttype, fs)){ - diag("Already had mounttype for %s: %s (got %s)\n", - d->name, d->mnttype, fs); - free(d->mnttype); - d->mnttype = NULL; - free_stringlist(&d->mntops); - free_stringlist(&d->mnt); - d->mnttype = fs; - }else{ - free(fs); - } - fs = NULL; - if(add_string(&d->mnt, mnt)){ - goto err; - } - if(add_string(&d->mntops, ops)){ - goto err; - } - d->mntsize = (uintmax_t)vfs.f_bsize * vfs.f_blocks; - if(d->layout == LAYOUT_PARTITION){ - d = d->partdev.parent; - } - d->uistate = gui->block_event(d, d->uistate); - if(growlight_target){ - if(strcmp(mnt, growlight_target) == 0){ - mount_target(); - } + if(handle_mount(gui, mnt, dev, ops, &fs)){ + ret = -1; // don't exit out of loop } + free(dev); free(mnt); free(fs); free(ops); } - free(dev); free(mnt); free(fs); free(ops); - dev = mnt = fs = ops = NULL; munmap_virt(map, len); close(fd); - return 0; - -err: - diag("Error parsing %s\n", fn); - munmap_virt(map, len); - close(fd); - return -1; + return ret; } int mmount(device *d, const char *targ, unsigned mntops, const void *data){ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/notcurses/notcurses.c new/growlight-1.2.40/src/notcurses/notcurses.c --- old/growlight-1.2.38/src/notcurses/notcurses.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/notcurses/notcurses.c 2025-11-05 09:32:12.000000000 +0100 @@ -780,7 +780,7 @@ // is managed here; only the rows needed for display ought be provided. static int new_display_panel(struct ncplane* nc, struct panel_state* ps, - int rows, int cols, const char* hstr, + int rows, unsigned cols, const char* hstr, const char* bstr, int borderpair){ unsigned ybelow, yabove; unsigned x, y; @@ -1685,7 +1685,6 @@ for(unsigned z = 1 ; z < maxz ; ++z){ unsigned op = ((z - 1) + fs->scrolloff) % fs->opcount; - assert(op >= 0); assert(op < fs->opcount); ncplane_off_styles(fsw, NCSTYLE_BOLD); compat_set_fg(fsw, FORMBORDER_COLOR); @@ -1738,7 +1737,6 @@ for(unsigned z = 1 ; z < maxz ; ++z){ unsigned op = ((z - 1) + fs->scrolloff) % fs->opcount; - assert(op >= 0); assert(op < fs->opcount); ncplane_off_styles(fs->p, NCSTYLE_BOLD); compat_set_fg(fs->p, FORMBORDER_COLOR); @@ -1782,7 +1780,6 @@ for(unsigned z = 1 ; z < rows - 3 ; ++z){ unsigned op = ((z - 1) + fs->scrolloff) % fs->opcount; - assert(op >= 0); assert(op < fs->opcount); compat_set_fg(fs->p, FORMTEXT_COLOR); cmvwprintw(fs->p, z + 1, START_COL * 2, "%-*.*s ", @@ -1811,7 +1808,7 @@ ncplane_dim_yx(n, NULL, &cols); --cols; tot = 0; - for(y = 0 ; (unsigned)y < sizeof(linepre) / sizeof(*linepre) ; ++y){ + for(y = 0 ; y < sizeof(linepre) / sizeof(*linepre) ; ++y){ while(isspace(text[tot])){ ++tot; } @@ -1861,9 +1858,9 @@ compat_set_fg(ps->n, FORMBORDER_COLOR); bevel_all(ps->n); compat_set_fg(ps->n, FORMTEXT_COLOR); - do{ + while(y--){ ncplane_printf_yx(ps->n, y + 1, 1, "%.*s", linelen[y], text + linepre[y]); - }while(y--); + } screen_update(); return ps; } @@ -2143,7 +2140,7 @@ void raise_str_form(const char* str, void (*fxn)(const char*), const char* def, const char* text){ struct form_state* fs; - int cols; + unsigned cols; unsigned x, y; assert(str && fxn); @@ -2272,7 +2269,7 @@ if(zz >= *selections){ typeof(*selarray) tmp; - if((tmp = realloc(*selarray, sizeof(*selarray) * (*selections + 1))) == NULL){ + if((tmp = realloc(*selarray, sizeof(**selarray) * (*selections + 1))) == NULL){ free(fo[zz].option); free(fo[zz].desc); goto err; @@ -2532,7 +2529,7 @@ return; } raise_form("select a filesystem type", fs_callback, ops_fs, - opcount, defidx, FSTYPE_TEXT); + opcount, defidx, FSTYPE_TEXT); return; } fs_do(name); @@ -2581,6 +2578,7 @@ return NULL; } *count = 0; + *defidx = 0; for(pt = ptypes ; pt->name ; ++pt){ const size_t KEYSIZE = 5; // 4 hex digit code char *key, *desc; @@ -2713,6 +2711,7 @@ if(mbsrtowcs(wstr, &n, wcs + 1, &ps) != wcs){ locked_diag("Error converting multibyte '%s'", name); cleanup_new_partition(); + free(wstr); return; } sps = show_splash(L"Creating partition..."); @@ -2854,7 +2853,8 @@ } if(psects == NULL){ // go back to partition type struct form_option *ops_ptype; - int opcount, defidx; + int opcount; + int defidx; if((ops_ptype = ptype_table(b->d, &opcount, pending_ptype, &defidx)) == NULL){ if(opcount == 0){ @@ -4289,7 +4289,7 @@ if(zz >= *selections){ typeof(*selarray) tmp; - if((tmp = realloc(*selarray, sizeof(*selarray) * (*selections + 1))) == NULL){ + if((tmp = realloc(*selarray, sizeof(**selarray) * (*selections + 1))) == NULL){ free(fo[zz].option); free(fo[zz].desc); goto err; @@ -4399,7 +4399,7 @@ if(flags & ul){ typeof(*selarray) tmp; - if((tmp = realloc(*selarray, sizeof(*selarray) * (*selections + 1))) == NULL){ + if((tmp = realloc(*selarray, sizeof(**selarray) * (*selections + 1))) == NULL){ // FIXME backfree return -1; } @@ -5713,7 +5713,7 @@ // b->zone->p: partition static void update_blockobj(blockobj* b, device* d){ - zobj *z, *lastz, *firstchoice; + zobj *z, *lastz, *firstchoice, *tmpz; uintmax_t sector; int zonesel = -1; // -1 for no choice (b->zone == NULL on entry) int zones; @@ -5737,38 +5737,43 @@ sector = d->size / d->logsec + 1; }else{ if( (sector = first_usable_sector(d)) ){ - if((z = create_zobj(z, zones, zones, sector - 1, NULL, REP_METADATA)) == NULL){ + if((tmpz = create_zobj(z, zones, zones, sector - 1, NULL, REP_METADATA)) == NULL){ goto err; } + z = tmpz; ++zones; } } for(p = d->parts ; p ; p = p->next){ if(sector != p->partdev.fsector){ - if((z = create_zobj(z, zones, sector, p->partdev.fsector - 1, NULL, REP_EMPTY)) == NULL){ + if((tmpz = create_zobj(z, zones, sector, p->partdev.fsector - 1, NULL, REP_EMPTY)) == NULL){ goto err; } + z = tmpz; ++zones; } - if((z = create_zobj(z, zones, p->partdev.fsector, p->partdev.lsector, p, L'\0')) == NULL){ + if((tmpz = create_zobj(z, zones, p->partdev.fsector, p->partdev.lsector, p, L'\0')) == NULL){ goto err; } + z = tmpz; ++zones; sector = p->partdev.lsector + 1; } if(d->logsec && d->size){ if(sector < d->size / d->logsec){ if(sector < last_usable_sector(d) + 1){ - if((z = create_zobj(z, zones, sector, last_usable_sector(d), NULL, REP_EMPTY)) == NULL){ + if((tmpz = create_zobj(z, zones, sector, last_usable_sector(d), NULL, REP_EMPTY)) == NULL){ goto err; } + z = tmpz; ++zones; sector = last_usable_sector(d); } if(sector < d->size / d->logsec){ - if((z = create_zobj(z, zones, sector, d->size / d->logsec - 1, NULL, REP_METADATA)) == NULL){ + if((tmpz = create_zobj(z, zones, sector, d->size / d->logsec - 1, NULL, REP_METADATA)) == NULL){ goto err; } + z = tmpz; ++zones; sector = d->size / d->logsec; } @@ -5967,7 +5972,7 @@ cols = fs->longop; // FIXME? 40 for input currently struct ncplane* stdn = notcurses_stdplane(NC); ncplane_dim_yx(stdn, &y, &x); - assert(x >= cols + 3); + assert(x >= (unsigned)cols + 3); assert(y >= 3); // It could be more than this due to line breaking, so add a fudge // factor of 2...FIXME @@ -6017,6 +6022,7 @@ raise_info_form("Press any key to continue...", buf); unlock_notcurses_growlight(); va_end(v); + free(buf); } static struct ncmenu* @@ -6055,17 +6061,17 @@ struct ncmenu_section sections[] = { { .name = "Growlight", .items = glight_items, .itemcount = sizeof(glight_items) / sizeof(*glight_items), - .shortcut = { .id = 'g', .alt = true, }, }, + .shortcut = { .id = 'g', .modifiers = NCKEY_MOD_ALT, }, }, { .name = "Blockdevs", .items = block_items, .itemcount = sizeof(block_items) / sizeof(*block_items), - .shortcut = { .id = 'b', .alt = true, }, }, + .shortcut = { .id = 'b', .modifiers = NCKEY_MOD_ALT, }, }, { .name = "Partitions", .items = part_items, .itemcount = sizeof(part_items) / sizeof(*part_items), - .shortcut = { .id = 'p', .alt = true, }, }, + .shortcut = { .id = 'p', .modifiers = NCKEY_MOD_ALT, }, }, { .name = NULL, .items = NULL, .itemcount = 0, }, { .name = "Info", .items = help_items, .itemcount = sizeof(help_items) / sizeof(*help_items), - .shortcut = { .id = 'i', .alt = true, }, }, + .shortcut = { .id = 'i', .modifiers = NCKEY_MOD_ALT, }, }, }; struct ncmenu_options mopts = { .sections = sections, @@ -6104,7 +6110,6 @@ pthread_sigmask(SIG_SETMASK, &sigmask, NULL); notcurses_options opts = { }; opts.flags = NCOPTION_INHIBIT_SETLOCALE; - // opts.loglevel = NCLOGLEVEL_TRACE; if((NC = notcurses_core_init(&opts, stdout)) == NULL){ return EXIT_FAILURE; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/ptypes.c new/growlight-1.2.40/src/ptypes.c --- old/growlight-1.2.38/src/ptypes.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/ptypes.c 2025-11-05 09:32:12.000000000 +0100 @@ -68,6 +68,11 @@ .gpt_guid = "\x39\x33\xA6\x8D\x07\x00\xC0\x60\xC4\x36\x08\x3A\xC8\x23\x09\x08", .mbr_code = 0, }, { + .code = 0x8400, + .name = "Intel Rapid Start Technology", + .gpt_guid = "\xD3\xBF\xE2\xDE\x3D\xAF\x11\xDF\xBA\x40\xE3\xA5\x56\xD8\x95\x93", + .mbr_code = 0x84, + }, { .code = 0x8e00, .name = "Linux Logical Volume Manager", .gpt_guid = "\x79\xD3\xD6\xE6\x07\xF5\xC2\x44\xA2\x3C\x23\x8F\x2A\x3D\xF9\x28", @@ -376,17 +381,17 @@ // Pass in the common code, get the scheme-specific identifier filled in. // Returns 0 for a valid code, or -1 if there's no ident for the scheme. -int get_gpt_guid(unsigned code,void *guid){ +int get_gpt_guid(unsigned code, void *guid){ const ptype *pt; for(pt = ptypes ; pt->name ; ++pt){ if(pt->code == code){ static const uint8_t zguid[GUIDSIZE] = {0}; - if(memcmp(pt->gpt_guid,zguid,sizeof(zguid)) == 0){ + if(memcmp(pt->gpt_guid, zguid, sizeof(zguid)) == 0){ return -1; } - memcpy(guid,pt->gpt_guid,GUIDSIZE); + memcpy(guid, pt->gpt_guid, GUIDSIZE); return 0; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/ptypes.h new/growlight-1.2.40/src/ptypes.h --- old/growlight-1.2.38/src/ptypes.h 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/ptypes.h 2025-11-05 09:32:12.000000000 +0100 @@ -16,7 +16,8 @@ typedef struct ptype { uint16_t code; // [fg]disk/parted code (2 bytes) const char *name; // Human-readable name - uint8_t gpt_guid[GUIDSIZE]; // GPT Type GUID (16 bytes) or 0s + // GPT Type GUID (16 bytes) or 0s + uint8_t gpt_guid[GUIDSIZE] __attribute__ ((nonstring)); uint8_t mbr_code; // MBR code (1 byte) or 0 unsigned aggregable; // Can it go into an aggregate? } ptype; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/readline/readline.c new/growlight-1.2.40/src/readline/readline.c --- old/growlight-1.2.38/src/readline/readline.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/readline/readline.c 2025-11-05 09:32:12.000000000 +0100 @@ -2170,8 +2170,11 @@ if(growlight_init(argc, argv, &ui, NULL)){ return EXIT_FAILURE; } - const uint64_t flags = NCDIRECT_OPTION_INHIBIT_SETLOCALE; - if((ncd = ncdirect_init(NULL, NULL, flags)) == NULL){ + uint64_t flags = NCDIRECT_OPTION_INHIBIT_SETLOCALE; + if(verbose){ + flags |= NCDIRECT_OPTION_VERBOSE; + } + if((ncd = ncdirect_core_init(NULL, NULL, flags)) == NULL){ fprintf(stderr, "Couldn't set up notcurses\n"); growlight_stop(EXIT_FAILURE); return EXIT_FAILURE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/src/target.c new/growlight-1.2.40/src/target.c --- old/growlight-1.2.38/src/target.c 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/src/target.c 2025-11-05 09:32:12.000000000 +0100 @@ -153,13 +153,13 @@ } if((fstab = dump_targets()) == NULL){ diag("Couldn't write targets to %s/etc/fstab (%s?)\n", growlight_target, strerror(errno)); - close(fd); + fclose(fp); return -1; } if((r = fprintf(fp, "%s", fstab)) < 0 || (size_t)r < strlen(fstab)){ diag("Couldn't write data to %s/etc/fstab (%s?)\n", growlight_target, strerror(errno)); free(fstab); - close(fd); + fclose(fp); return -1; } free(fstab); @@ -181,13 +181,13 @@ } if((ftargs = dump_controller_modules()) == NULL){ diag("Couldn't write targets to %s/etc/initramfs-tools/modules (%s?)\n", growlight_target, strerror(errno)); - close(fd); + fclose(fp); return -1; } if((r = fprintf(fp, "%s", ftargs)) < 0 || (size_t)r < strlen(ftargs)){ diag("Couldn't write data to %s/etc/initramfs-tools/modules (%s?)\n", growlight_target, strerror(errno)); free(ftargs); - close(fd); + fclose(fp); return -1; } free(ftargs); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/tools/debrelease new/growlight-1.2.40/tools/debrelease --- old/growlight-1.2.38/tools/debrelease 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/tools/debrelease 2025-11-05 09:32:12.000000000 +0100 @@ -8,6 +8,7 @@ VERSION="$1" +rm debian/files dch -v $VERSION-1 dch -r uscan --force --repack --compression xz @@ -16,7 +17,7 @@ git push --tags dpkg-buildpackage --build=source cd .. -sudo pbuilder build *dsc +xterm -e sudo pbuilder build growlight*dsc cd - git push rm debian/files diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/growlight-1.2.38/tools/release new/growlight-1.2.40/tools/release --- old/growlight-1.2.38/tools/release 2021-12-04 21:03:38.000000000 +0100 +++ new/growlight-1.2.40/tools/release 2025-11-05 09:32:12.000000000 +0100 @@ -17,7 +17,6 @@ sed -i -e "s/% v$OLDVERSION/% v$VERSION/" "$i" done - BUILDDIR="build-$VERSION" mkdir "$BUILDDIR" cd "$BUILDDIR" @@ -41,5 +40,7 @@ echo "The bastards are trying to immanentize the Eschaton" # requires token in ~/.netrc -github-release dankamongmen/growlight create v$VERSION --name "v$VERSION" --publish $TARBALL.asc -rm $TARBALL.asc +tar czvf growlight-doc-$VERSION.tar.gz *.8 +gh release create v$VERSION --title "$VERSION" $TARBALL.asc "growlight-doc-$VERSION.tar.gz" +rm $TARBALL.asc "growlight-doc-$VERSION.tar.gz" +cd -
