Example #1
0
static int
janus_wait(int lmodem)
{
	/* FIXME: erkennt Protokollfehler nicht */
	char c;

	fprintf(stderr, "....\n");
	alarm(10*60);
	do {
		while (read(lmodem, &c, 1) != 1) {
			newlog(DEBUGLOG,
				"can't read from modem: %s", strerror(errno));
			return 1;
		}
	} while (c != NAK);
	alarm(0);
	fprintf(stderr, "Gegenseite hat gepackt\n");

	alarm(15);
	do {
		write(lmodem, "UNIXD", 5);
		while (read(lmodem, &c, 1) != 1) {
			newlog(DEBUGLOG,
				"can't read from modem: %s", strerror(errno));
			return 1;
		}
	} while (c != ACK);
	alarm(0);
	fprintf(stderr, "Seriennummern OK\n");
	return 0;
}
Example #2
0
/** dialstring bauen, Default: AT DT */
static int
make_dialstr(char *dialstr, size_t maxlen, char *intntl)
{
	/* input:
	   dialstr: Zielstring
	   maxlen: max. Laenge desselben
	   phone: Rufnummer
	 * return:
	    0: Erfolg
	   -1: Ueberlauf
	   -2: kein %s im Config-Dialstring
	 */
	int rc;
	char phone[60], telno[60], vorw[60], country[60];
	header_p p;

	while (*intntl && !isspace(*intntl))
		intntl++;
	while (*intntl && isspace(*intntl))
		intntl++;
	setup_dial_info(intntl, country, vorw, telno);
	if (strcmp(country, g_int_prefix) == 0) {
		/* nationaler Anruf */
		if (strcmp(vorw, g_ovst) == 0) {
			/* lokaler Anruf */
			rc = snprintf(phone, sizeof(phone), "%s", telno);
		} else {
			rc = snprintf(phone, sizeof(phone), "%s%s%s",
				 fernwahl, vorw, telno);
		}
	} else {
		/* internationaler Anruf */
		rc = snprintf(phone, sizeof(phone), "%s%s%s%s",
			      international ? international:"00",
			      country, vorw, telno);
	}
	if (rc < 0) return -1;

	p = find(HD_MODEM_DIAL, config);
	if(p && !strstr(p->text, "%s")) {
		newlog(ERRLOG, "Konfiguration hat kein %%s im Dialstring!");
		dialstr[0]='\0';
		return -2;
	}
	rc = snprintf(dialstr, maxlen,
		      p ? p->text : "AT DT %s",
		      phone);
	return rc < 0 ? rc : 0;
}
Example #3
0
static void
anrufdauer( void )
{
	time_t now;

	if ( online_start == 0 )
		return;

	time(&now);
	newlog(logname,
#ifdef ENABLE_DIFFTIME
		"Anrufdauer: ca. %g Sekunden online",
		difftime(now, online_start));
#else
		"Anrufdauer: ca. %ld Sekunden online",
		(long)(now-online_start));
#endif
	online_start = 0;
}
Example #4
0
int
backup3(const char *backupdir, const char *file,
	const char *sysname, const char *arcer)
{
	int rc = -1;

	if ( file == NULL )
		return rc;

	if ( backupdir != NULL ) {
		if ( backupnumber ) {
			return backup2( backupdir, file, sysname, arcer );
		};
		rc = backup( backupdir, file, sysname, BACKUP_LINK );
	};
	if(remove(file) && errno != ENOENT) {
		newlog(ERRLOG,
		       "cannot remove file %s: %s",
		       file, strerror(errno));
		rc = 1;
	}
	return rc;
}
Example #5
0
/* -------------------------------------------------------------------- */
void newUser(char *initials, char *password)
{
    label fullnm;
    char InitPw[80];
    char Initials[80];
    char passWord[80];
    char *semicolon;
    int  lines;
    
    int abort, good = 0;
    char  firstime = 1;

    if (!CARRIER)  return;

    unlisted = FALSE;  /* default to [Y] for list in userlog for new users */
    roomtell = TRUE;   /* default to [Y] for display of room descriptions  */

    /* this only initializes log.buf, does not write it out */
    if (newlog() == ERROR) return;

    logBuf.linesScreen = cfg.linesScreen;
    /* askTerm(); */
    configure(TRUE);      /* make sure new users configure reasonably     */
    lines = logBuf.linesScreen;
    
    tutorial("password.blb");
    
    do
    {
        do
        {
            /* getNormStr("full name", fullnm, NAMESIZE, ECHO); */
            enterName(cfg.enter_name, fullnm, NULL);
            
            if ( (personexists(fullnm) != ERROR )
            ||   (strcmpi(fullnm, "Sysop") == SAMESTRING)
            ||   (strcmpi(fullnm, "Aide") == SAMESTRING)
            ||   !strlen(fullnm) )
            {
                mPrintf("We already have a %s\n", fullnm);
                good = FALSE;
            }        
            else (good = TRUE);
        }
        while(!good && CARRIER);

        if (!CARRIER)  return;

        if (firstime)
        {
            strcpy(Initials, initials);
        }
        else
        {
            getNormStr("your initials", InitPw, 40, NO_ECHO);
            dospCR();

            semicolon = strchr(InitPw, ';');

            if( semicolon )
            {
               normalizepw(InitPw, Initials, passWord);
            }
            else
            {
                strcpy(Initials, InitPw);
            }

            /* dont allow anything over 19 characters */
            Initials[19] = '\0';
        }

        do
        {
            if (firstime)
            {
                strcpy(passWord, password);
            }
            else if (!semicolon)
            {
                getNormStr("password",  passWord, NAMESIZE, NO_ECHO);
                dospCR();
            }
            
            firstime  = FALSE;  /* keeps from going in infinite loop */
            semicolon = FALSE;

            if ( pwexists(passWord) != ERROR || strlen(passWord) < 2)
            {
                good = FALSE;
                mPrintf("\n Poor password\n ");
            }
            else good = TRUE;
        }
        while( !good  && CARRIER );

        displaypw(fullnm, Initials, passWord);

        abort = getYesNo("OK",2);

        if (abort == 2) return;  /* check for Abort at (Y/N/A)[A]: */
    }
    while ( (!abort) && CARRIER);

    if (CARRIER)
    {
        /* Moved from newlog() */
        strcpy(logBuf.lbname, fullnm);
        strcpy(logBuf.lbin, Initials);
        strcpy(logBuf.lbpw, passWord);

        /* This stuff moved from newlog()
        time(&logBuf.calltime);

        setsysconfig();

        /*
         * trap it 
         */
        sprintf( msgBuf->mbtext, "New user %s", logBuf.lbname);
        if (onConsole)
            strcat(msgBuf->mbtext, " (Console)");
        trap(msgBuf->mbtext, T_LOGIN);

        loggedIn = TRUE;
        slideLTab(thisSlot);
        storeLog();

        /* End of stuff moved from newlog() */
    }

    logBuf.linesScreen = (uchar)lines;
}
Example #6
0
/* backup
 * inputs:
 *
 *
 * returns:
 * 0: okay
 * 1: error during execution
 * 2: not a regular file
 * 3: file not found
 * -1: file, backup or sysname have been NULL or an illegal backup_type
 *     has been specified
 */
int
backup(const char *backupdir, const char *file,
       const char *sysname, enum backup_type backup_type)
{
	logcwd("backup");

	if (backupdir && file && sysname) {
		char backupname[FILENAME_MAX];
		const char *shortname, *btype;
		int rc;
		struct stat st;

		if(lstat(file, &st)) {
			newlog(ERRLOG, "backup: cannot stat %s: %s",
			       file, strerror(errno));
			return 3;
		}
		if(!S_ISREG(st.st_mode)) {
			newlog(ERRLOG,
			       "backup: %s is not a regular file, mode: 0%o",
			       file, st.st_mode);
			return 2;
		}

		shortname = strrchr(file, '/');
		if (!shortname) shortname = file;
		else shortname++;
		snprintf(backupname, sizeof(backupname),
			 "%s/%s.%s.%ld",
			 backupdir, sysname,
			 shortname, (long)time(NULL));
		newlog(DEBUGLOG, "Backup: %s -> %s\n", file, backupname);
		if(remove(backupname) && errno != ENOENT) {
			newlog(ERRLOG,
			       "cannot remove backup destination %s: %s",
			       backupname, strerror(errno));
			return 1;
		}

		switch(backup_type) {
		case BACKUP_MOVE:
			rc=rename(file, backupname);
			btype="mv";
			break;
		case BACKUP_LINK:
			rc=link(file, backupname);
			btype="ln";
			break;
		default:
			return -1;
		}
		if(rc) {
			newlog(ERRLOG,
			       "cannot backup: %s %s %s: %s",
			       btype, file, backupname,
			       strerror(errno));
			return 1;
		} else {
			return 0;
		}
	}
	return -1;
}
Example #7
0
int
backup2(const char *backupdir, const char *file,
	const char *sysname, const char *arcer)
{
	char backupname[FILENAME_MAX];
	char backupnamenew[FILENAME_MAX];
	long i;
	long backupnr;
	struct stat st;

	if ( backupdir == NULL )
		return -1;
	if ( file == NULL )
		return -1;
	if ( sysname == NULL )
		return -1;
	if ( arcer == NULL )
		arcer = "non";

	if(lstat(file, &st)) {
		newlog(ERRLOG, "backup: cannot stat %s: %s",
		       file, strerror(errno));
		return 3;
	}
	if(!S_ISREG(st.st_mode)) {
		newlog(ERRLOG,
		       "backup: %s is not a regular file, mode: 0%o",
		       file, st.st_mode);
		return 2;
	}

	if (backupnumber == NULL) {
		backupnr = 5;
		newlog(ERRLOG,
			"Warnung: Backup-Zahl ist nicht definiert.");
	} else {
		backupnr = atoi(backupnumber);
		if (backupnr < 1) {
			backupnr = 5;
			newlog(ERRLOG,
			"Warnung: Backup-Zahl ist 0. Nehme stattdessen 5.");
		}
	}

	/* Rotieren */
	for (i = (backupnr-1);i > 0;i--) {
		snprintf(backupname,sizeof(backupname),
			"%s/%s.%ld.%s",
			backupdir, sysname, i, arcer );
		snprintf(backupnamenew,sizeof(backupnamenew),
			"%s/%s.%ld.%s",
			backupdir, sysname, i+1, arcer );
		/* Wenns die Datei nicht gibt,
		   oder sie eine normale Datei ist, ok */
		if ( lstat(backupnamenew,&st) != ENOENT ) {
		    if  (!S_ISREG(st.st_mode) ) {
			snprintf(backupname,sizeof(backupname)-1,
				"%s/%s.%ld.%s",
				backupdir, sysname,
				(long)time(NULL), arcer );
			newlog(ERRLOG,
				"Backup: Fehler %s ist keine regulaere Datei."
				" Speichere Backup unter %s",
				backupnamenew, backupname );
			break;
		    }
		}
		newlog(DEBUGLOG,"rename: %s -> %s",backupname,backupnamenew);
		rename(backupname,backupnamenew);
	}
	/* Wenn die Schleife durch ist,
	   steht in backupname system.1.arcer, oder
	   backupname hat einen Wert auf den geschrieben werden kann */
	newlog(DEBUGLOG,"rename %s -> %s",file,backupname);
	rename(file,backupname);
	return 0;
}
Example #8
0
int
anruf( header_p sys, header_p ich, int lmodem, int tries )
{
	char dialstr[80];
	char lockname[FILENAME_MAX];
	header_p p;
	char *name, *pw;
	const char **v;
	int i, err;
	int dial_cnt = 1;

	/* fuer Janus */
	char *arcer=NULL, *arcerin=NULL, *transfer=NULL, *domain;
	header_p t, d;
	int netcall_error;
	char filename[FILENAME_MAX];
	char tmpname[FILENAME_MAX];
	char outname[FILENAME_MAX];
	char inname[FILENAME_MAX];
	char sysname[FILENAME_MAX];
	struct stat st;
	/* ende fuer Janus */

	t = find(HD_ARCEROUT, sys);
	if (!t) {
		newlog(ERRLOG,
			"Kein ausgehender Packer definiert");
		return 1;
	}
	arcer = t->text;
	strlwr(arcer);

	t = find(HD_ARCERIN, sys);
	if (!t) {
		newlog(ERRLOG,
			"Kein eingehender Packer definiert");
		return 1;
	}
	arcerin = t->text;
	strlwr(arcerin);

	t = find(HD_PROTO, sys);
	if (!t) {
		newlog(ERRLOG,
			"Kein Uebertragungsprotokoll definiert");
		return 1;
	}
	transfer = t->text;
	strlwr(transfer);

	name = NULL;
	p = find(HD_SYS, ich);
	if (p) name = p->text;

	pw = NULL;
	p = find(HD_PASSWD, sys);
	if (p) pw = p->text;

	p = find(HD_X_CALL, sys);
	if (!p) {
		fprintf(stderr, "Welches Netcall-Verfahren????\n");
		exit(20);
	}
	for (i = 0, v = verf; *v; i++, v++)
		if (stricmp(*v, p->text) == 0)
			break;
	if (!*v) return 1;

	if (i < ZCONNECT) {
		t = find(HD_SYS, sys);
		if (!t) {
			newlog(ERRLOG,
				"Illegale Systemdatei: Kein " HN_SYS
				": Header oder falscher Name: %s", filename);
			return 1;
		}
		d = find(HD_DOMAIN, sys);
		if (!d) {
			newlog(ERRLOG,
				"Illegale Systemdatei: Kein " HN_DOMAIN
				": Header: %s", filename);
			return 1;
		}

		for (domain = strtok(d->text, " ;,:");
				domain;
				domain = strtok(NULL, " ;,:")) {
			sprintf(sysname, "%s.%s", t->text, domain);
			strlwr(sysname);
			sprintf(tmpname, "%s/%s", netcalldir, sysname);
			newlog(logname,
				"Suche Verzeichnis, versuche %s...", tmpname);
			if (access(tmpname, R_OK|X_OK) == 0)
				break;
		}

		if(access(tmpname, R_OK|X_OK)) {
			/* Problem: temp. Verzeichnis nicht zu haben */
			newlog(logname,
				"Problem beim Netcall: Verzeichnis "
				"nicht gefunden");
			return 1;
		}
	}

	/* ##### HIER WIRD ANGEWAEHLT ##### */
	p = find(HD_TEL, sys);
	while(tries) {
		if(!p) p = find(HD_TEL, sys);
		make_dialstr(dialstr, sizeof(dialstr), p->text);

		fprintf(stderr, "%3d. Anwahlversuch (noch %d): %-.25s\n",
			dial_cnt++, tries, dialstr);                     

		if (redial(dialstr, lmodem, 1) != 0 ) {
			tries--;
			p = p->other;
		} else {
			/* connect */
			break;
		}
	}

	set_local(lmodem, 0);
	time(&online_start);

	if (i < ZCONNECT) {
		if (name) dfree(name);
		name = dstrdup(boxstat.boxname);
		strupr(name);
#ifdef ENABLE_CAPS_IN_PASSWORD
		strupr(pw);
#endif
	}
	if(login(lmodem, i, name, pw)) return 0;

	if (i < ZCONNECT) { /* JANUS */
		int have_file = 0;

		netcall_error = 0;

		if ( janus_wait(lmodem) != 0 )
			return 0;

		sprintf(tmpname, "%s/%s.%d.dir", netcalldir, sysname, getpid());
		mkdir(tmpname, 0755);
		chdir(tmpname);
		/* outname: ausgehendes Archiv
		 * filename: */
		sprintf(outname, "%s/caller.%s", tmpname, arcer);
		sprintf(filename, "%s/%s.%s", netcalldir, sysname, arcer);
		sprintf(lockname, "%s/%s/" PREARC_LOCK, netcalldir, sysname);
		if (access(filename, R_OK) != 0) {
			FILE *f;
			if(access(filename, F_OK) == 0) {
				newlog(ERRLOG,
					"Leerer Puffer, weil keine Erlaubnis "
					"zum Lesen von %s: %s",
					outname, strerror(errno));
			}

			f = fopen(outname, "wb");
			if (!f) {
				newlog(ERRLOG,
					"Kann Netcall %s nicht erzeugen: %s",
					outname, strerror(errno));
				fclose(deblogfile);
				return 1;
			}
			fputs("\r\n", f);
			fclose(f);
		} else { /* can read filename */
			if (waitnolock(lockname, 180)) {
				fclose(deblogfile);
				newlog(OUTGOING, "System %s Prearc LOCK: %s",
					sysname, lockname );
				return 1;
			}
			fprintf(stderr, "Link: %s -> %s\n",
				filename, outname);
			if(link(filename, outname)) {
				fclose(deblogfile);
				newlog(ERRLOG,
					"Linken: %s -> %s fehlgeschlagen: %s",
					filename, outname, strerror(errno));
				netcall_error = 1;
				goto finish;
			}
			have_file = 1;
		}
		sprintf(inname, "called.%s", arcer);

		st.st_size = 0;
		if(stat(outname, &st)) {
			fprintf(stderr,
				"Zugriff auf %s fehlgeschlagen: %s\n",
				outname, strerror(errno));
			netcall_error = 1;
			goto finish;
		}

		newlog(logname, "Sende %s (%ld Bytes) per %s",
		       outname, (long)st.st_size, transfer);

		err = sendfile(transfer, outname);
		if (err) {
			newlog(logname,
				"Versand der Daten fehlgeschlagen");
			netcall_error = 1;
			goto finish;
		}

		newlog(logname, "Empfange mit %s", transfer);
		if (recvfile(transfer, inname)) {
			newlog(logname,
				"Empfang der Daten fehlgeschlagen");
			netcall_error = 1;
			goto finish;
		}
		st.st_size = 0;
		if(stat(inname, &st)) {
			newlog(logname,
				"Zugriff auf %s fehlgeschlagen: %s",
				inname, strerror(errno));
		}
		newlog(logname, "%ld Bytes empfangen", (long)st.st_size);


	finish:

		/* Fertig, Modem auflegen */
		signal(SIGHUP, SIG_IGN);
		fclose(stdin);
		fclose(stdout);
		hayes_hangup(lmodem); DMLOG("hayes hangup modem");
		hangup(lmodem); DMLOG("hangup modem");
		anrufdauer();

		restore_linesettings(lmodem);
		DMLOG("restoring modem parameters");
		close(lmodem); lmodem=-1; DMLOG("close modem");
		/* neuer stdin */
		fopen("/dev/null", "r");
		/* stderr wird in stdout kopiert */
		dup2(fileno(stderr),fileno(stdout));

		if(!netcall_error) {
			/* Netcall war erfolgreich, also Daten loeschen */
		if(have_file) {
			/* Backups von Nullpuffern sind
			   uninteressant */
			backup3(backoutdir,filename,sysname,arcer);
		}
		/* das ist nur ein Link, den putzen wir weg */
		if ( unlink(outname)) {
			newlog(ERRLOG,
			       "Loeschen von %s fehlgeschlagen: %s",
			       outname, strerror(errno));
		}

		fclose(deblogfile);

		/*
		 * Und empfangene Daten (im Hintergrund) einlesen,
		 * das Modem wird sofort wieder freigegeben.
		 */
		switch(fork()) {
		case -1:
			{ /* cannot fork */
				perror("forking import");
				newlog(ERRLOG,
				       "Forken des Importteils "
				       "fehlgeschlagen: %s",
				       strerror(errno));
				break;
			}
		case 0:
			{
				/* Ich bin child */
				deblogfile=fopen("/tmp/import.deblogfile", "a");
				DMLOG("child forked");
				import_all(arcerin, sysname);
				chdir ("/");
				if(rmdir(tmpname)) {
					newlog(ERRLOG,
						"Loeschen von %s "
						"fehlgeschlagen: %s",
						tmpname, strerror(errno));
				}
				fclose(deblogfile);
				exit(0);
			}
		default: /* parent */
			break;
		}
		}
		return(1);

	} else {
		/* ZCONNECT */

		system_master(ich, sys);
		if (auflegen) return 1;
		bereitstellen();
		files = 1;
		senden_queue = todo;
		todo = NULL;
		while (!auflegen) {
			datei_master(ich, sys);
		}
		anrufdauer();
		close(lmodem); DMLOG("close modem");
		aufraeumen();
		exit (0);
	}

	return 1;
}
Example #9
0
int
main(int argc, const char **argv)
{
	const char *sysname, *speed;
	char sysfile[FILENAME_MAX];
	char deblogname[FILENAME_MAX];
	FILE *f;
	header_p sys, ich, p;
	int i;

	initlog("call");

	if (0 == strcmp(argv[0], "-h")) usage();
	if (argc < 4 || argc > 5) usage();

	gmodem=-1;
	atexit(cleanup);

	sysname = strlwr( dstrdup( argv[1] ));
	if (!strchr(argv[2], '/'))
		snprintf(tty, sizeof(tty), "/dev/%s", argv[2]);
	else
		strcpy(tty, argv[2]);

	speed = argv[3];

	maxtry = 1;
	if (argc > 4)
		maxtry = atoi(argv[4]);

	minireadstat();
	sprintf(deblogname, "%s/" DEBUGLOG_FILE, logdir);
	if(debuglevel>0) {
		deblogfile = fopen(deblogname, "w");
		if (!deblogfile) {
			printf("Ich kann das Logfile nicht oeffnen. "
				"Probiere /dev/null...\n");
			deblogfile = fopen("/dev/null", "w");
			if (!deblogfile) {
				printf("Hmm... - /dev/null "
					"nicht schreibbar??\n");
				return 10;
			}
		}
	} else {
		deblogfile = fopen("/dev/null", "w");
		if (!deblogfile) {
			printf("Arghl! - kann /dev/null "
				"nicht zum Schreiben oeffnen!\n\n");
			return 10;
		}
	}
	sprintf(sysfile, "%s/%s", systemedir, sysname);
	f = fopen(sysfile, "r");
	if (!f) {
		perror(sysfile);
		newlog(ERRLOG, "File <%s> not readable: %s",
			sysfile, strerror(errno));
		return 1;
	}
	sys = rd_para(f);
	fclose(f);

	ich = get_myself();

	for (i=maxtry; i; i--) {
	   if (lock_device(1, tty)) break;
	   fputs(" ... unser Modem ist belegt\n", stderr);
	   sleep(60);
	}
	if (!i) {
		newlog(ERRLOG, "Cannot lock device: %s", tty);
		return 9;
	}

#ifdef LEAVE_CTRL_TTY
	/*
	 * Bisheriges Controlling-TTY verlassen, damit "modem" das neue
	 * wird.
	 */
#ifdef BSD
	setpgrp(0, getpid());	/* set process group id to process id */
#ifdef SIGTTOU
	signal(SIGTTOU, SIG_IGN);
#endif
#ifdef SIGTTIN
	signal(SIGTTIN, SIG_IGN);
#endif
#ifdef SIGTSTP
	signal(SIGTSTP, SIG_IGN);
#endif
#else	/* !BSD */
#if !defined(USE_SETSID) && !defined(USE_SETPGRP)
#error Controlling TTY kann nicht verlassen werden: definieren Sie eine Methode dazu
#endif /* !BSD und keine SysV-Methode definiert */

#ifdef USE_SETSID
#error	Dies funktioniert nicht!
	setsid();
#endif /* USE_SETSID */
#ifdef USE_SETPGRP
	setpgrp();
#endif /* USE_SETPGRP */
#endif /* !BSD */
#endif /* LEAVE_CTRL_TTY */

	gmodem = open(tty,
#if !defined(__NetBSD__)
			O_RDWR | O_NDELAY
#else
			O_RDWR
#endif
		); DMLOG("open modem");
	if (gmodem < 0) {
		newlog(ERRLOG,
			"Can not access device %s: %s", tty, strerror(errno));
		return 10;
	}
#if !defined(__NetBSD__)
	else {
		/* Nonblock abschalten */
		int n;
		n=fcntl(gmodem, F_GETFL, 0);
		(void)fcntl(gmodem, F_SETFL, n & ~O_NDELAY);
	}
#endif
	save_linesettings(gmodem); DMLOG("saving modem parameters");
	set_rawmode(gmodem); DMLOG("set modem to rawmode");
	set_local(gmodem, 1);
	set_speed(gmodem, speed); DMLOG("set modem speed");
#ifdef TIOCSCTTY
	ioctl(gmodem, TIOCSCTTY, NULL);
#endif

	files = 0;
	online_start = 0;
	fprintf(stderr, "Netcall bei %s [%s]\n", sysname, tty);

	fclose(stdin);
	fclose(stdout);
	dup(gmodem); dup(gmodem); DMLOG("dup modem 2x to stdin and stdout");

	if (setjmp(timeout)) {
		newlog(ERRLOG, "ABBRUCH: Timeout");
		lock_device(0, tty);
		anrufdauer();
		if (files) aufraeumen();

		return 11;
	}
	if (setjmp(nocarrier)) {
		if (!auflegen) {
			newlog(ERRLOG, "ABBRUCH: Gegenstelle hat aufgelegt");
		}
		lock_device(0, tty);
		anrufdauer();
		if (files) aufraeumen();

		return auflegen ? 0 : 12;
	}
	signal(SIGHUP, handle_nocarrier);
	signal(SIGALRM, handle_timeout);
	setup_dial_info(ortsnetz, g_int_prefix, g_ovst, NULL);

	p = find(HD_TEL, sys);
	if (!p) {
		newlog(ERRLOG,
			"Keine Telefonnummer fuer %s gefunden",
			sysname);
		return 2;
	}

	anruf(sys, ich, gmodem, maxtry);

	if (online_start) {
		anrufdauer();
	} else {
		fprintf(stderr, "Keine Verbindung hergestellt.\n");
	}

	lock_device(0, tty);
	/* Device ist freigegeben, aber wir warten noch auf das Ende
	   der Importphase, bevor wir zurueckkehren. */
	wait(NULL);
	return 0;
}