• Another new CP/M utility program: copyq

    From ladislau szilagyi@21:1/5 to All on Sun May 28 12:23:53 2023
    Hi,

    COPYQ ( https://github.com/Laci1953/RC2014-CPM/tree/main/copyq )

    Copy with query

    Use: copyq filename.ext d:

    copy files to destination disk (d:), with a query for each file
    ( and an extra query to allow overwriting files )
    ( ambiguous file references may be used, e.g. *.c or test?.asm )
    ( up to 512 files can be copied )

    Example:

    dir *.1
    C: Y 1 : X 1
    dir d:*.1
    D: Y 1
    copyq *.1 d:

    Copy file Y.1 ? (Y/y = yes) :y
    Overwrite destination file ? (Y/y = yes) :y
    Copy file X.1 ? (Y/y = yes) :y
    dir d:*.1
    D: Y 1 : X 1


    Ladislau

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From fridtjof.martin.weigel@gmail.com@21:1/5 to ladislau szilagyi on Sun Jun 4 12:05:23 2023
    On Sunday, May 28, 2023 at 3:23:55 PM UTC-4, ladislau szilagyi wrote:
    Hi,

    COPYQ ( https://github.com/Laci1953/RC2014-CPM/tree/main/copyq )

    Copy with query

    Use: copyq filename.ext d:

    copy files to destination disk (d:), with a query for each file
    ( and an extra query to allow overwriting files )
    ( ambiguous file references may be used, e.g. *.c or test?.asm )
    ( up to 512 files can be copied )

    Example:

    dir *.1
    C: Y 1 : X 1
    dir d:*.1
    D: Y 1
    copyq *.1 d:

    Copy file Y.1 ? (Y/y = yes) :y
    Overwrite destination file ? (Y/y = yes) :y
    Copy file X.1 ? (Y/y = yes) :y
    dir d:*.1
    D: Y 1 : X 1


    Ladislau
    Ladislau

    Thank you for those utilities. "Back in the day"... we used sweep (nsweep)
    A0% r sweep

    NSWEEP - Version 2.08a 05/06/1985
    (c) Dave Rand, 1983, 1984
    Edmonton, Alberta

    Sort directory alphabetically (Y/N)? y

    Drive A0: 2952K in 121 files. 1376K free.
    1. A0: !README .TXT 4K :
    2. A0: +630 . 4K :


    Now -
    2. A0: +630 . 4K : ?
    NSWEEP - Version 2.08a 05/06/1985
    (c) Dave Rand, 1983, 1984
    Edmonton, Alberta


    A - Retag files | Q - Squeeze/Unsqueeze tagged files
    B - Back one file | R - Rename file(s)
    C - Copy file | S - Check remaining space
    D - Delete file | T - Tag file for transfer
    E - Erase T/U files | U - Untag file
    F - Find file | V - View file
    L - Log new disk/user | W - Wildcard tag of files
    M - Mass file copy | Y - Set file status.
    P - Print file | ? - Display this help
    X - Exit to CP/M | cr, sp - Forward one file

    2952K in 121 files. 1376K free.
    Tagged files = 0K ( 0K).

    2. A0: +630 . 4K :

    M for mass copy, E for erase (tagged or untagged) T to tag, U to untag

    Now, to achieve ERAQ we:

    invoke nsweep,
    W (wildcard) *.Y
    (shows files tagged)
    E (erase) T (tagged) Y (yes, prompt)
    then, Y, N or A (abort) for each file.

    Now copy (M = mass copy) did NOT have a query option -- could be added, I guess. The other program I used (and still use) is VFILER -- kind of the same as SWEEP, but visual. That one looks like:
    VFILER, Version 1.7 [Z80 Code]

    -- Screen Directory --
    !README .TXT +630 . +DEFAULT. ASSIGN .SYS
    AUTOEXEC.SUB AUXDICT .TXT BASLIB .REL BBC .TXT
    BBCBASIC.COM BCLOAD . BRUN .COM BUFMOD .MAC
    BUFMOD .REL CCP .SPR CDANSI .REL CLS .DAT
    COBLBX .REL COBLIB .REL COBLOC . COBOL1 .OVR
    COBOL2 .OVR COBOL3 .OVR COBOL4 .OVR COBOLX .COM
    COMMAND .LBR COMPILE .MCD CONFIG .GMK CPM22 .LBR
    CPMINSID.SIX CPNETLDX.COM CRCKLIST.CRC CREDIR .COM
    CRTDRV .REL CSUP .REL D630 .LTP DDXTEK .PRL
    DEBUG .REL DESPOOL .COM DICT .BIN DICT .D
    DICTION .000 DICTIONX.COM DINDEX .BIN DSD .COM
    DSD .HLP DSDZ .COM EMPTYDIC.BIN ENCODE .HLP
    ENVIRON . ERRMSGS .OVR EXTRA .LBR FORLIB .REL
    GENZ80 .MCD GMK .COM GMKX .COM GSX .SYS
    GSXBASIX.COM INIT .SUB INIT-NOX.SUB LIBC .REL
    LIBF .REL LIBRARY .MCD LINK .MCD LU .COM

    A 0: Command (? for Help)?
    Current File: !README .TXT

    ...again monospace - again, again, mass delete has a "verify" option, mass copy does not. My preference is VFILER (I think it was part of ZCPR, but I just use it stand-alone -- then and now).

    SWEEP works like LU; I don't have a "Visual LU" If that exists, would like to add that! Note that LU
    even has a command -F which enters Filesweep mode. Again, that has Tag/Untag, and Mass operations.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From fridtjof.martin.weigel@gmail.com@21:1/5 to All on Sun Jun 4 12:13:20 2023
    Ladislau

    Now, I took an old program called CHDIR, and renamed it to CREDIR (from TOPS-10 CREATE DIRECTORY, that being where most of CP/M command design is from... like PIP and DIR). This is HiTech C, but is "special" in that it updates itself, in place with the
    database of Drive/User to Name. It also has the "system password" in it... The directory and/or password could be masked with XOR PASSWORD if you want a bit more security. Have fun with this...

    Find attached: <-->snip
    /* CREDIR.C
    *
    * Also the database for directory information, and system password
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <cpm.h>
    #include <unixio.h>
    #include <sys.h>

    #define defname "0:A:CREDIR.COM"
    #define dirmax 64
    /* #define syspass "password" */
    #define syspass "bf109g"
    #define sysuser 15
    #define tryent 1
    #define tryset 3

    static char pass[21];

    static char spass[21] = syspass;
    /*
    static char directory[dirmax][9] = { "SYS" };
    static char dirdisk[dirmax] = { 'A' };
    static char dirun[dirmax] = { 0 };
    */
    static char directory[dirmax][9] = {
    "SYS", "C", "GAMES", "SYSB",
    "BAKSYS", "BAKC", "BAKGAMES", "SBASIC",
    "BBCBASIC", "PROFOR", "SSFORT", "BASIC/Z" };
    static char dirdisk[dirmax] = {
    'A', 'A', 'A', 'B',
    'E', 'E', 'E', 'E',
    'E', 'E', 'E', 'E' };
    static char dirun[dirmax] = {
    0, 2, 3, 0,
    0, 2, 3, 4,
    5, 6, 7, 8 };
    static char cend = 0;

    static int tou(int c) {
    if (islower(c))
    return toupper(c);
    return c;
    }

    static void strcap(char *str) {
    while (*str) {
    *str = tou(*str);
    ++str;
    }
    }

    #if 0
    static int strscan(char *str) {
    while (*str)
    if (*str++ == '.')
    return 1;
    return 0;
    }
    #endif

    static int tonum(char *str) {
    int value, digit;
    value = 0;
    while (*str) {
    digit = *str++ - '0';
    if ((digit < 0) || (digit > 9))
    return -1; /* Error */
    value = value * 10 + digit;
    }
    return value;
    }

    static void help(void) {
    printf("\nCREDIR\n\n");
    printf("CREDIR is a program used to name drive/user areas, logically,\n");
    printf("rather than by letter/number. From TOPS-10.\n\n");
    printf(" CREDIR dirname select directory\n");
    printf(" CREDIR dirname du name directory for disk d user u\n");
    printf(" CREDIR /PRINT print name of current disk/user\n");
    printf(" CREDIR /DISPLAY display all known names\n");
    printf(" CREDIR /SETUP enter interactive setup\n");
    printf(" CREDIR /HELP print HELP information\n");
    }

    static void disp2(void) {
    int un, defined, dir;
    char disk;
    printf("\nCurrent Directory");
    un = bdos(32, 0xff);
    disk = bdos(25, 0) + 'A';
    defined = 0;
    printf(" %c%d: ", disk, un);
    for (dir = 0; dir < dirmax; ++dir)
    if ((dirdisk[dir] == disk) && (dirun[dir] == un)) {
    printf("%s", directory[dir]);
    defined = 1;
    }
    if (defined == 0)
    printf("Not defined by name");
    printf("\n");
    }

    static void display(int flag) {
    /* If flag == 0, only display system files if in system dir */
    int count, dir, user;
    user = bdos(32, 0xff); /* Get current user number */
    printf("\nDefined Directory Names");
    count = 0;
    for (dir = 0; dir < dirmax; ++dir) {
    if ((directory[dir][0]) &&
    ((user >= sysuser) ||
    (flag) ||
    (dirun[dir] < sysuser))) {
    if (count % 4 == 0)
    printf("\n");
    printf("%c%2d: %8s ",dirdisk[dir], dirun[dir],
    directory[dir]);
    }
    if (directory[dir][0])
    ++count;
    }
    printf("\n%d directory names defined, space left for %d more names\n",
    count, dirmax - count);
    disp2();
    }

    static void dots(int num) {
    int i;
    for (i = 0; i < num; ++i)
    putchar('.');
    for (i = 0; i < num; ++i)
    putchar('\010');
    }

    static void password(int n) {
    int i;
    if (bdos(32, 0xff) >= sysuser)
    return;
    printf("\n\n** System password required for access/permission **");
    for (i = 0; i < n; ++i) {
    printf("\nSystem Password? ");
    dots(20);
    scanf("%s", pass);
    if (strlen(pass) > 20) {
    printf("\n** Violation attempt **");
    exit(-1);
    }
    if (strcmp(spass, pass) == 0) {
    printf("** Access granted **");
    return;
    }
    printf("Invalid password given");
    }
    printf("\n** Access denied **");
    exit(-1);
    }

    static int cdir(char *dirname) {
    int dir, index;
    unsigned udflag;
    unsigned char *p = (unsigned char *)0x004;
    index = -1;
    for (dir = 0; dir < dirmax; ++dir)
    if (strcmp(directory[dir], dirname) == 0)
    index = dir;
    if (index == -1) {
    printf("\nCan't find directory");
    display(0);
    return -1;
    }
    if (dirun[index] >= sysuser)
    password(tryent);
    udflag = dirun[index] << 4;
    udflag |= dirdisk[index] - 'A';
    *p = udflag;
    setuid(dirun[index]); /* for SH.COM */
    return 0;
    }

    static int yn(void) {
    char s[20];
    printf(" (Y/N)? ");
    dots(3);
    scanf("%s", s);
    return tou(s[0]) == 'Y';
    }

    static void initdir(void) {
    int i;
    printf("Verify initialization");
    if (!yn()) {
    printf("\nInitialization aborted");
    return;
    }
    strcpy(spass, syspass);
    for (i = 0; i < dirmax; ++i) {
    directory[i][0] = '\0';
    dirdisk[i] = '\0';
    dirun[i] = 0;
    }
    printf("\nDirectory cleared");
    }

    static int finddir(void) {
    int dir;
    for (dir = 0; dir < dirmax; ++dir)
    if (directory[dir][0] == '\0')
    return dir;
    return -1;
    }

    static int setdir(void) {
    int un, repl, dir;
    char disk, name[20];
    printf("\n\tDisk and user (Q=Done or A-P 0-15, like A10)? ");
    scanf("%s", name);
    if (strlen(name) == 0)
    return 1;
    disk = tou(name[0]);
    if (disk == 'Q')
    return 1;
    if ((disk < 'A') || (disk > 'P')) {
    printf("\nInvalid disk");
    return 0;
    }
    if ((un = tonum(name + 1)) == -1)
    return 1;
    if ((un < 0) || (un > 15)) {
    printf("\nInvalid user");
    return 0;
    }
    do {
    printf("Directory name (. = Delete old name)? ");
    dots(8);
    scanf("%s", name);
    strcap(name);
    if (strlen(name) > 8)
    printf("Directory name too long\n");
    } while (strlen(name) > 8);
    if (name[0] == '.')
    name[0] = '\0';
    repl = 0;
    for (dir = 0; dir < dirmax; ++dir)
    if ((dirdisk[dir] == disk) && (dirun[dir] == un)) {
    repl = dir;
    directory[dir][0] = '\0';
    }
    if (repl == 0) {
    repl = finddir();
    if (repl == -1) {
    printf("\nDirectory full");
    return 1;
    }
    }
    dirdisk[repl] = '\0';
    dirun[repl] = 0;
    if (strlen(name)) {
    dirdisk[repl] = disk;
    dirun[repl] = un;
    strcat(directory[repl], name);
    return 0;
    }
    printf("\nDirectory name for %c%2d: deleted", disk, un);
    return 0;
    }

    static void swap(int i, int j) {
    char disk, name;
    int un, k;
    disk = dirdisk[i];
    dirdisk[i] = dirdisk[j];
    dirdisk[j] = disk;
    un = dirun[i];
    dirun[i] = dirun[j];
    dirun[j] = un;
    for (k = 0; k < 9; ++k) {
    name = directory[i][k];
    directory[i][k] = directory[j][k];
    directory[j][k] = name;
    }
    }

    static void compare(int i, int j) {
    if (dirdisk[i] < dirdisk[j])
    return;
    if (dirdisk[i] > dirdisk[j]) {
    swap(i, j);
    return;
    }
    if (dirun[i] > dirun[j])
    swap(i, j);
    }

    static void sort(void) {
    int i, j;
    for (i = 0; i < dirmax; ++i)
    for (j = i + 1; j < dirmax; ++j)
    if (dirdisk[i] && dirdisk[j])
    compare(i, j);
    }

    static void sethlp(void) {
    printf("CREDIR Setup subsystem command summary\n");
    printf(" D - Display currently-defined directory names\n");
    printf(" I - Initialize and clear all directory names\n");
    printf(" N - Create a new directory name\n");
    printf(" P - Set system password\n");
    printf(" Q - Quit without changing program on disk\n");
    printf(" S - Sort directory by disk and user number\n");
    printf(" X - Exit and update program on disk\n");
    }

    static int writepgm(char *fname) {
    int fd;
    unsigned u;
    printf("\nSorting directory by disk and user number");
    sort();
    printf("\nUpdating file %s ...", fname);
    fd = open(fname, O_RDWR);
    if (fd < 0) {
    printf("\nCan't open file %s", fname);
    return -1;
    }
    u = (unsigned)&cend - (unsigned)spass;
    lseek(fd, (long)spass - (long)0x100, SEEK_SET);
    write(fd, (void *)spass, u);
    close(fd);
    printf("File %s updated to disk (%d bytes)\n", fname, u);
    }

    static void readpgm(void) {
    int fd;
    unsigned u;
    fd = open("0:A:CREDIR.COM", O_RDWR);
    if (fd < 0)
    return;
    u = (unsigned)&cend - (unsigned)directory;
    lseek(fd, (long)directory - (long)0x100, SEEK_SET);
    read(fd, (void *)directory, u);
    close(fd);
    }

    /* Set up Mnemonic Names */

    static void setup(void) {
    char cmd, fname[40];
    printf("\nCREDIR setup");
    password(tryset); /* Ask for password */
    do {
    printf("\nSetup command (? for help)? ");
    dots(2);
    scanf("%s", fname);
    cmd = tou(fname[0]); /* Get Response */
    switch (cmd) {
    case 'D':
    printf("\nSystem password is %s", spass);
    printf("\nProgram is %s", defname);
    display(1);
    break;
    case 'I':
    initdir();
    break;
    case 'N':
    printf("\nSystem user areas start at %d", sysuser);
    while (setdir() == 0)
    ;
    break;
    case 'P':
    printf("\nNew system password? ");
    dots(20);
    scanf("%s", spass);
    break;
    case 'Q':
    printf("\tVerify abort");
    if (yn())
    return;
    break;
    case 'S':
    sort();
    printf("\nSort complete"); break;
    case 'X':
    break;
    default:
    sethlp();
    break;
    }
    } while (cmd != 'X');
    printf("\tUpdate disk");
    if (!yn())
    return;
    /*
    printf("\nName of file (. = %s)? ", defname);
    dots(12);
    scanf("%s", fname);
    strcap(fname);
    if (fname[0] == '.')
    strcpy(fname, defname);
    if (strscan(fname) == 0)
    strcat(fname, ".COM");
    writepgm(fname);
    */
    writepgm("0:A:CREDIR.COM");
    }

    static int scandir(char *name) {
    int dir;
    for (dir = 0; dir < dirmax; ++dir)
    if (strcmp(directory[dir], name) == 0)
    return -1;
    return 0;
    }

    static int set(char *dirname, char *duser) {
    char disk, *dutemp;
    int un, dir;
    dutemp = duser;
    disk = *duser;
    if ((disk < 'A') || (disk > 'P')) {
    printf("\nInvalid disk (not A-P)");
    return -1;
    }
    un = tonum(++dutemp);
    if ((un < 0) || (un > 31)) {
    printf("\nInvalid user (not 0-31)");
    return -1;
    }
    if (scandir(dirname)) {
    printf("Duplicate directory name");
    return -1;
    }
    if (un >= sysuser)
    password(tryset);
    dir = finddir();
    if (dir == -1) {
    printf("\nDirectory Full");
    return -1;
    }
    strcpy(directory[dir], dirname);
    dirdisk[dir] = disk;
    dirun[dir] = un;
    writepgm(/* defname */ "0:A:CREDIR.COM");
    return 0;
    }

    static void option(char *s) {
    ++s;
    if (*s == 'D' || *s == 'd')
    display(0);
    else if (*s == 'S' || *s == 's')
    setup();
    else if (*s == 'P' || *s == 'p')
    disp2();
    else
    help();
    }

    int main(int argc, char **argv) {
    readpgm();
    if (argc == 2) {
    if (*argv[1] == '/')
    option(argv[1]);
    else
    cdir(argv[1]);
    } else if (argc == 3) {
    set(argv[1], argv[2]);
    } else {
    help();
    }
    return 0;
    }

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From ladislau szilagyi@21:1/5 to All on Mon Jun 5 05:10:36 2023
    Hi Fred,

    I have problems when compiling your source file.

    I tried compiling-it on a RC2014.

    The results:

    -------------------------
    (using the original HiTech C)

    c -v -c credir.c
    HI-TECH C COMPILER (CP/M-80) V3.09
    Copyright (C) 1984-87 HI-TECH SOFTWARE
    0:CPP -DCPM -DHI_TECH_C -Dz80 -I CREDIR.C $CTMP1.$$$
    0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
    sys.h:
    24: extern int getuid(void);
    getuid: type redeclared ^
    25: extern int setuid(int);
    setuid: type redeclared ^
    CREDIR.C: disp2()
    91: int un, defined, dir;
    ^ un: storage class redeclared
    ^ defined: storage class redeclared
    ^ dir: storage class redeclared
    ^ identifier redefined: dir
    94: un = bdos(32, 0xff);
    ^ only lvalues may be assigned to or modified
    ^ illegal conversion
    96: defined = 0;
    ^ not a variable identifier: defined
    ^ only lvalues may be assigned to or modified
    ^ illegal conversion
    98: for (dir = 0; dir < 64; ++dir)
    ^ undefined identifier: dir
    99: if ((dirdisk[dir] == disk) && (dirun[dir] == un)) {
    type conflict ^
    simple type required for == ^
    101: defined = 1;
    ^ not a variable identifier: defined
    ^ only lvalues may be assigned to or modified
    ^ illegal conversion
    103: if (defined == 0)
    ^ not a variable identifier: defined
    ^ illegal use of void expression
    106: }
    ^ unused member: dir (warning)
    CREDIR.C: cdir()
    164: int dir, index;
    ^ index: storage class redeclared
    ^ identifier redefined: index
    167: index = -1;
    ^ not a variable identifier: index
    ^ only lvalues may be assigned to or modified
    ^ illegal conversion
    170: index = dir;
    ^ not a variable identifier: index
    ^ only lvalues may be assigned to or modified
    ^ illegal conversion
    171: if (index == -1) {
    ^ not a variable identifier: index
    ^ illegal use of void expression
    176: if (dirun[index] >= 15)
    ^ not a variable identifier: index
    ^ illegal type for index expression
    type conflict ^
    178: udflag = dirun[index] << 4;
    ^ not a variable identifier: index
    ^ illegal type for index expression
    type conflict ^
    179: udflag |= dirdisk[index] - 'A';
    ^ not a variable identifier: index
    ^ illegal type for index expression
    type conflict ^
    181: setuid(dirun[index]);
    ^ not a variable identifier: index
    ^ illegal type for index expression
    type conflict ^
    CREDIR.C: writepgm()
    320: unsigned u;
    ^ u: storage class redeclared
    ^ identifier redefined: u
    324: fd = open(fname, O_RDWR);
    ^ undefined identifier: O_RDWR
    329: u = (unsigned)&cend - (unsigned)spass;
    ^ only lvalues may be assigned to or modified
    illegal conversion ^
    330: lseek(fd, (long)spass - (long)0x100, SEEK_SET);
    undefined identifier: SEEK_SET ^
    331: write(fd, (void *)spass, u);
    illegal conversion ^
    334: }
    ^ unused variable definition: ÜÞï#ª>Ïc"Ç;»Æà(ª¢è:+\
    ­ö< ?
    ï?p?í (warning)
    CREDIR.C: readpgm()
    339: fd = open("0:A:CREDIR.COM", O_RDWR);
    ^ undefined identifier: O_RDWR
    342: u = (unsigned)&cend - (unsigned)directory;
    ^ undefined identifier: u
    illegal conversion ^
    343: lseek(fd, (long)directory - (long)0x100, SEEK_SET);
    illegal conversion ^
    not a variable identifier: SEEK_SET ^
    illegal conversion ^
    344: read(fd, (void *)directory, u);
    ^ : storage class redeclared
    illegal conversion ^

    (********************************** here, P1 crashes... rebooting...then replacing P1 with 'my' P1...)

    Small Computer Monitor - S3
    *cpm
    RC2014 CP/M BIOS 1.2 by G. Searle 2007-18

    CP/M 2.2 Copyright 1979 (c) by Digital Research

    d:
    pip p1.com=newp1.com

    c -v -c credir.c
    HI-TECH C COMPILER (CP/M-80) V3.09
    Copyright (C) 1984-87 HI-TECH SOFTWARE
    0:CPP -DCPM -DHI_TECH_C -Dz80 -I CREDIR.C $CTMP1.$$$
    0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
    sys.h:
    24: extern int getuid(void);
    getuid: type redeclared ^
    25: extern int setuid(int);
    setuid: type redeclared ^
    CREDIR.C: writepgm()
    324: fd = open(fname, O_RDWR);
    ^ Error #72 O_RDWR
    330: lseek(fd, (long)spass - (long)0x100, SEEK_SET);
    Error #72 SEEK_SET ^
    CREDIR.C: readpgm()
    339: fd = open("0:A:CREDIR.COM", O_RDWR);
    Error #72 O_RDWR ^
    343: lseek(fd, (long)directory - (long)0x100, SEEK_SET);
    Error #72 SEEK_SET ^
    ERA $CTMP1.$$$
    ERA $CTMP2.$$$
    ERA $CTMP3.$$$
    ERA $$EXEC.$$$

    grep *.h

    please enter the string to be searched, followed by a <CR>:getuid
    CPM.H
    SYS.H
    grep *.h

    please enter the string to be searched, followed by a <CR>:O_RDWR
    grep *.h

    please enter the string to be searched, followed by a <CR>:SEEK_SET

    ----------------------

    So, it seems there is a conflict between CPM.H and SYS.H (both contain a (different) prototype of getuid ...), and I cannot find any .H containing the definitions of O_RDWR and SEEK_SET.

    Ladislau

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From ladislau szilagyi@21:1/5 to All on Mon Jun 5 10:58:35 2023
    Hi,

    problem solved: I commented-out sys.h and added two defines:

    //#include <sys.h>

    #define O_RDWR _IORW
    #define SEEK_SET 0

    Ladislau

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)