From: wusel@hactar.hanse.de (Kai 'wusel' Siering)
Newsgroups: de.comp.sys.amiga.uucp
Subject: Re: Filesystem Crash
Date: Tue, 29 Dec 1992 22:41:54 +0100
 <1992Dec29.015928.13943@cs.tu-berlin.de>
Organization: Villa Straylight, Hamburg, FRG
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Newsreader: Arn V1.00

In article <1992Dec29.015928.13943@cs.tu-berlin.de>, Andreas M. Kirchwitz writes:

% In <281292e0811@hamburg.uucp> wusel@hactar.hanse.de (Kai 'wusel' Siering) writes:
%
% >% Wie kann man bei UUCP (Cnews) verhindern, dass Crosspostings mit
% >% Links angelegt werden?   (Source neu compilieren scheidet aus)
% >
% >     Gar nicht. Leg' NEWSARTS: auf eine FFS-Partition und freue Dich des
% >Lebens -- Dir sollte dann nichts schlimmes mehr widerfahren.
%
% Das Problem scheinen weniger die Crosspostings zu sein als vielmehr
% das File "NewsCtl:LOCK".  Nach kurzer Zeit hab ich mehrere (!) Files
% namens "NewsCtl:LOC" (ohne 'K' am Ende) rumzuliegen.  Als Zugabe hab
% ich auch noch einige Checksum-Errors... und als Bonus manchmal auch
% gleich noch eine Platte mit bleibendem Status "Validating".

     Nett =:-< Ein hnliches Problem gab's doch auch bei AUUCP? Da lagen
bei mir auch hufiger `uulib:news/LOCK.TMPXXXXX'-Files rum. Moment ...

cn:libcnews/lock.c
---------------------------------------8<---------------------------------------
/*
 * C news system locking.
 * It's compatible with B 2.10.1 news, except that locks are never
 * declared stale (blow 'em away in /etc/rc).
 * Only permit relaynews to run on a file server to make this sane.
 */

#include <stdio.h>
#include <errno.h>
#include "fixerrno.h"
#ifdef unix
# include <sys/types.h>
#else
# ifdef AMIGA
#  include <exec/types.h>
#  include <dos/dos.h>
# endif /* AMIGA */
#endif /* unix */
#include "libc.h"
#include "news.h"
#include "config.h"

#ifndef AMIGA
#define LOCKNAME "LOCK"
#define LOCKTEMP "LOCKTMXXXXXX"
#define INTERVAL 25             /* seconds to sleep on a busy lock */
#else /* AMIGA */
#define LOCKNAME "t:LockedCNews"
#define INTERVAL 5              /* seconds to sleep on a busy lock */
#endif /* AMIGA */

static boolean debug = NO;
static boolean mylock = NO;

void
lockdebug(state)
boolean state;
{
        debug = state;
}

/*
 * lock the news system.
 * create a temporary name in $NEWSCTL for linking, store my pid in it.
 * repeatedly try to link the temporary name to LOCKNAME.
 */
#ifndef AMIGA
void
newslock()
{
        register char *tempnm, *lockfile;
        register FILE *tempfp;
        int locktries = 0;

        tempnm = strsave(ctlfile(LOCKTEMP));
        (void) mktemp(tempnm);
        tempfp = fopen(tempnm, "w");
        if (tempfp == NULL)
                error("can't create lock temporary `%s'", tempnm);
        (void) fprintf(tempfp, "%d\n", getpid());
        (void) fclose(tempfp);

        lockfile = strsave(ctlfile(LOCKNAME));
        while (link(tempnm, lockfile) < 0) {
                if (errno != EEXIST)
                        error("can't link `%s' to LOCK", tempnm);
                /*
                 * Could decide here if the lock is stale.
                 * If so, remove it and try again to lock.
                 */
                if (debug && ++locktries == 1)
                        (void) printf("%s: sleeping on LOCK\n", progname);
                sleep(INTERVAL);
        }
        free(lockfile);
        (void) unlink(tempnm);
        free(tempnm);
        mylock = YES;
}

void
newsunlock()
{
        if (mylock) {
                (void) unlink(ctlfile(LOCKNAME));
                mylock = NO;
        }
}
#else /* AMIGA */
extern void LockFile(const char *);
extern void UnLockFile(const char *);
extern void UnLockFiles(void);

void
newslock()
{
        LockFile(LOCKNAME);
        mylock = YES;
        if(debug)
           printf("%s: locked the news system with `%s'.\n", progname, LOCKNAME);
}

void
newsunlock()
{
        if (mylock) {
                UnLockFile(LOCKNAME);
                mylock = NO;
        }
}
#endif /* AMIGA */

void
errunlock(fmt, s)               /* like error(3), but unlock before exit */
char *fmt, *s;
{
        warning(fmt, s);
        newsunlock();
#ifdef AMIGA
        UnLockFiles();
#endif /* AMIGA */
        exit(1);
        /* NOTREACHED */
}
--------------------------------------->8---------------------------------------

     Mit anderen Worten: das orginale CNews erzeugt ein temporres File
`NewsCtl:LOCKTMxxx' und versucht das auf `NewsCtl:LOCK' zu linken.  In wie
weit das nun sinnvoll ist ... Bei mir klappte das irgendwie nie zuverlssig
(und unter 1.3 luft das wegen des link()-Aufrufs auch nicht!), nicht nur
deshalb habe ich die Routinen in wCNews wie oben zu sehen (#ifdef AMIGA)
abgendert ...

cn:libamiga/link.c
---------------------------------------8<---------------------------------------
/*      :ts=4
 *      This is an Amiga version of the Unix link() system call
 *
 *      $Id$
 *
 *      $Log$
 */

#include <stdio.h>                                      /* For file_i/o stuff */
#include <exec/types.h>
#include <dos/dos.h>
#include <clib/exec_protos.h>           /* For FindTask() */
#include <clib/dos_protos.h>            /* For *Lock*(), MakeLink() */

#if INCLUDE_VERSION >= 36
# include <pragma/dos.h>
#endif

FILE **Link_a;                                          /* The address of art->a_artf  */

link(char *from, char *to)
{
        register int ret = 0;
#if INCLUDE_VERSION >= 36
        static short flag;
        BPTR lock;
        fpos_t pos;

        if (flag == 0) {
                extern struct DosLibrary *SysBase;
                flag = (short) SysBase->dl_lib.lib_Version;
        }
        if (flag > 35) {
                pos = (fpos_t) -1;
                if (Link_a && *Link_a) {
                        if (!fgetpos(*Link_a, &pos))
                                fclose(*Link_a);
                }
                if (lock = Lock((UBYTE *)from, ACCESS_READ)) {
                        if (!MakeLink((UBYTE *)to, lock, LINK_HARD)) {
                                ret = IoErr();
#if 0
                                warning("Couldn't make link (%s) from `%s' to `%s'",
                                        strerror(IoErr()), from, to);
#endif
                        }
                        UnLock(lock);
                } else {
                        ret = IoErr();
#if 0
                        warning("Couldn't obtain lock (%s) on `%s' during link to `%s'",
                                strerror(IoErr()), from, to);
#endif
                }
                if (pos != (fpos_t) -1) {
                        *Link_a = fopen(from, "a+");
                        fsetpos(*Link_a, &pos);
                }
        }
#endif /* INCLUDE_VERSION */
        return( ret );
}
--------------------------------------->8---------------------------------------

     Ich frage mich grade, ob *Linka in diesem Fall eigentlich schon
gesetzt ist und falls ja, ob er RICHTIG gesetzt ist? Sollte man bei
Gelegenheit vielleicht mal berprfen =:->

% (reines FFS -- nix INTL, nix DIRCACHE)
%
% Das passiert uebrigens auch mit OFS.
%
% Inzwischen liegt "NewsCtl:" bei mir im RAM:, denn dort funktionieren
% die Links anscheinend.  (auf Disketten funktionieren sie ebenfalls)
%
% Der Witz dabei ist eigentlich, dass das Problem so ploetzlich aufge-
% taucht ist.  Vorher hab ich nie was bemerkt.  Aber jetzt gibt es ganz
% schnell Abstuerze.  (habe extra ein paar alte FSs/Kickfiles ausge-
% graben - der Fehler bleibt)   Ich werd das Problem beim besten Willen
% nicht mehr los.

     Ist das Haltbarkeitsdatum Deines Rechners vielleicht abgelaufen?
Siehe Bodenprgung =:->

% Warum muss eigentlich immer ICH auf solche Bugs stossen?
%
%       Ich wuerde viel lieber auf Goldadern stossen...  Andreas

Wer wrde DAS nicht leiber? =;->
			kai

--  _
 _ //   Kai 'wusel' Siering, Villa Straylight, Hamburg, Germany. Go for MIME!
 \X/: <wusel@hactar.hanse.de>  Exile: <wusel@wolfhh.hanse.de>  iso-8859-1: 

              /away 18.12.1992 - 04.01.1993 (Phone: +49-4755-648)

"Ich wollte nicht hierher kommen - und ich wollte auch nicht geboren werden."
                                      -- Kelly, "Eine schrecklich nette Familie"