[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: iMac G5 "windfarm"



On Sun, Jan 3, 2021 at 4:30 PM John Paul Adrian Glaubitz
<glaubitz@physik.fu-berlin.de> wrote:
>
> On 1/3/21 10:25 PM, John Paul Adrian Glaubitz wrote:
> > The stuff is open source, if anyone is interested in getting this fixed, please
> > start reading the code and help me.
>
> FWIW, the source code is here:
>
> > https://salsa.debian.org/installer-team/partman-base/-/blob/master/parted_server.c
>
> If anyone has any clever idea, please let me know.

Looking at iscan_line ... The function assumes a Linux end-of-line:

void
iscan_line(char **str, int expect_leading_newline)
{
        int c;
        *str = NULL;

        c = fgetc(infifo);
        if (c == EOF)
                return;
        if (c == '\n' && expect_leading_newline) {
                c = fgetc(infifo);
                if (c == EOF)
                        return;
        }
        while (c != EOF && c != '\n') {
                if (isspace((unsigned char) c))
                        c = fgetc(infifo);
                else {
                        ungetc(c, infifo);
                        break;
                }
        }

        if (c == EOF || c == '\n')
                *str = calloc(1, 1);
        else
                iscanf("%m[^\n]", str);
}

The first thing I would do is, make it robust in case an Apple tool
has modified a file. Maybe something like:

/* Existing */
if (c == EOF)
    return;

/* New */
else if (c == '\r') {
    /* silently swallow CR */
    c = fgetc(infifo);
    if (c != '\n') {
        /* CR only. Make it look like a LF */
        fungetc(c, infifo);
        c = '\n';
    }
}

/* Existing */
if (c == '\n' && expect_leading_newline) {
    c = fgetc(infifo);
    if (c == EOF)
        return;
}

It looks like the while loop may need a touch-up, too.

Jeff


Reply to: