Ejemplo n.º 1
0
Archivo: mball.c Proyecto: bbs-io/mbse
void MakeArc()
{
    char    *cmd;

    if (!getarchiver((char *)"ZIP")) {
	WriteError("ZIP Archiver not available");
	return;
    }

    cmd = xstrcpy(archiver.farc);

    if (cmd == NULL) {
	WriteError("ZIP archive command not available");
	return;
    }

    Nopper();
    if (!do_quiet)
	printf("Creating allfiles.zip\n");
    if (!execute_str(cmd, (char *)"allfiles.zip allfiles.txt allfiles.utf", (char *)NULL, (char *)"/dev/null", 
			(char *)"/dev/null", (char *)"/dev/null") == 0)
	WriteError("Create allfiles.zip failed");

    Nopper();
    if (!do_quiet)
	printf("Creating newfiles.zip\n");
    if (!execute_str(cmd, (char *)"newfiles.zip newfiles.txt newfiles.utf", (char *)NULL, (char *)"/dev/null", 
			(char *)"/dev/null", (char  *)"/dev/null") == 0)
	WriteError("Create newfiles.zip failed");

    free(cmd);
    cmd = NULL;
}
Ejemplo n.º 2
0
Archivo: mbfile.c Proyecto: bbs-io/mbse
/*
 * Buffered file copy, filetime is preserved.
 */
int file_cp(char *from, char *to)
{
	char	*line;
	FILE	*stfrom, *stto;
	int	dummy, bread;
	static	int error;
	struct	stat sb;
	struct	utimbuf ut;

	stfrom = fopen(from, "r");
	if (stfrom == NULL)
		return errno;

	stto = fopen(to, "w");
	if (stto == NULL) {
		error = errno;
		fclose(stfrom);
		return error;
	}

	line = malloc(16384);

	do {
		bread = fread(line, 1, 16384, stfrom);
		dummy = fwrite(line, 1, bread, stto);
		if (bread != dummy) {
			error = errno;
			fclose(stfrom);
			fclose(stto);
			unlink(to);
			free(line);
			return error;
		}
		Nopper();  // For large files on slow systems
	} while (bread != 0);

	free(line);
	fclose(stfrom);
	if (fclose(stto) != 0) {
		error = errno;
		unlink(to);
		return error;
	}
  
	/*
	 * copy successfull, now copy file- and modification-time
	 */
	if (stat(from, &sb) == 0) {
		ut.actime = mktime(localtime(&sb.st_atime));
		ut.modtime = mktime(localtime(&sb.st_mtime));
		if (utime(to, &ut) != 0) {
			error = errno;
			unlink(to);
			return error;
		}
		chmod(to, sb.st_mode);
	}

	return 0;
}
Ejemplo n.º 3
0
unsigned char testkey(int y, int x)
{
    int             rc;
    unsigned char   ch = 0;

    Nopper();
    locate(y, x);

    rc = Waitchar(&ch, 50);
    if (rc == 1) {
	if (ch == KEY_ESCAPE)
	rc = Escapechar(&ch);
    }
    if (rc == 1)
	return ch;
    else
	return '\0';
}
Ejemplo n.º 4
0
static int tcp_sblk(char *buf, int len, int typ)
{
    Nopper();
    if (typ == TCP_CMD)
	Syslog('a', "tcp_sblk: cmd: %s", buf);
    else
	Syslog('a', "tcp_sblk: data: %d bytes", len);

    PUTCHAR(TCP_BLKSTRT);
    PUTCHAR(typ);
    PUTCHAR((len >> 8) & 0x0ff);
    PUTCHAR(len & 0x0ff);
    PUT(buf, len);
    PUTCHAR(TCP_BLKEND);
    FLUSHOUT();

    if (tty_status)
	WriteError("TCP: send error: %s", ttystat[tty_status]);
    return tty_status;
}
Ejemplo n.º 5
0
Archivo: mbfile.c Proyecto: bbs-io/mbse
/*
 * Calculate the 32 bit CRC of a file. Return -1 if file not found.
 */
int file_crc(char *path, int slow)
{
    static int	crc;
    int		bread;
    FILE	*fp;
    char	*line;

    if ((fp = fopen(path, "r")) == NULL) 
	return -1;

    line = malloc(32768);
    crc = 0xffffffff;

    do {
	bread = fread(line, 1, 32768, fp);
	crc = upd_crc32(line, crc, bread);
	Nopper(); // For large files on slow systems.
    } while (bread > 0);

    free(line);
    fclose(fp);
    return crc ^ 0xffffffff;
}
Ejemplo n.º 6
0
Archivo: mball.c Proyecto: bbs-io/mbse
void Masterlist()
{
    FILE	    *fp, *np, *fu, *nu, *pAreas, *pHeader;
    int		    AreaNr = 0, z, x = 0, New;
    unsigned int    AllFiles = 0, AllKBytes = 0, NewFiles = 0, NewKBytes = 0;
    unsigned int    AllAreaFiles, AllAreaBytes, popdown, down, NewAreaFiles, NewAreaBytes;
    char	    *sAreas, temp[PATH_MAX], pop[81];
    struct _fdbarea *fdb_area = NULL;

    sAreas	= calloc(PATH_MAX, sizeof(char));

    IsDoing("Create Allfiles list");

    snprintf(sAreas, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT"));

    if(( pAreas = fopen (sAreas, "r")) == NULL) {
	WriteError("Can't open File Areas File: %s", sAreas);
	mbse_colour(LIGHTGRAY, BLACK);
	die(MBERR_GENERAL);
    }
    fread(&areahdr, sizeof(areahdr), 1, pAreas);

    if (!do_quiet)
	printf("Processing file areas\n");

    if ((fp = fopen("allfiles.tmp", "a+")) == NULL) {
 	WriteError("$Can't open allfiles.tmp");
	die(MBERR_GENERAL);
    }
    if ((np = fopen("newfiles.tmp", "a+")) == NULL) {
	WriteError("$Can't open newfiles.tmp");
	fclose(fp);
	die(MBERR_GENERAL);
    }
    if ((fu = fopen("allfiles.ump", "a+")) == NULL) {
	WriteError("$Can't open allfiles.ump");
	fclose(fp);
	fclose(np);
	die(MBERR_GENERAL);
    }
    if ((nu = fopen("newfiles.ump", "a+")) == NULL) {
	WriteError("$Can't open newfiles.ump");
	fclose(fp);
	fclose(np);
	fclose(fu);
	die(MBERR_GENERAL);
    }

    chartran_init((char *)"CP437", (char *)"UTF-8", 'B');

    TopBox(fp, fu, TRUE);
    TopBox(np, nu, TRUE);
    snprintf(temp, 81, "All available files at %s", CFG.bbs_name);
    MidLine(temp, fp, fu, TRUE);
    snprintf(temp, 81, "New available files since %d days at %s", CFG.newdays, CFG.bbs_name);
    MidLine(temp, np, nu, TRUE);
    BotBox(fp, fu, TRUE);
    BotBox(np, nu, TRUE);

    snprintf(temp, PATH_MAX, "%s/etc/header.txt", getenv("MBSE_ROOT"));
    if (( pHeader = fopen(temp, "r")) != NULL) {
	Syslog('+', "Inserting %s", temp);

	while( fgets(temp, 80 ,pHeader) != NULL) {
	    Striplf(temp);
	    fprintf(fp, "%s\r\n", temp);
	    fprintf(np, "%s\r\n", temp);
	    fprintf(fu, "%s\r\n", chartran(temp));
	    fprintf(nu, "%s\r\n", chartran(temp));
	}
	fclose(pHeader);
    }

    while (fread(&area, areahdr.recsize, 1, pAreas) == 1) {
	AreaNr++;
	AllAreaFiles = 0;
	AllAreaBytes = 0;
	NewAreaFiles = 0;
	NewAreaBytes = 0;

	if (area.Available && (area.LTSec.level <= CFG.security.level)) {

	    Nopper();

	    if ((fdb_area = mbsedb_OpenFDB(AreaNr, 30)) == 0) {
		WriteError("Can't open Area %d (%s)! Skipping ...", AreaNr, area.Name);
	    } else {
		popdown = 0;
		while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) {
		    if (!fdb.Deleted) {
			/*
			 * The next is to reduce system load.
			 */
			x++;
			if (CFG.slow_util && do_quiet && ((x % 3) == 0))
			    msleep(1);
			AllFiles++;
			AllAreaFiles++;
			AllAreaBytes += fdb.Size;
			down = fdb.TimesDL;
			if (down > popdown) {
			    popdown = down;
			    snprintf(pop, 81, "%s", fdb.Name);
			}
			if (((t_start - fdb.UploadDate) / 84400) <= CFG.newdays) {
			    NewFiles++;
			    NewAreaFiles++;
			    NewAreaBytes += fdb.Size;
			}
		    }
		}

		AllKBytes += AllAreaBytes / 1024;
		NewKBytes += NewAreaBytes / 1024;
				
		/*
		 * If there are files to report do it.
		 */
		if (AllAreaFiles) {
		    TopBox(fp, fu, TRUE);
		    TopBox(np, nu, NewAreaFiles);

		    snprintf(temp, 81, "Area %d - %s", AreaNr, area.Name);
		    MidLine(temp, fp, fu, TRUE);
		    MidLine(temp, np, nu, NewAreaFiles);

		    snprintf(temp, 81, "File Requests allowed");
		    MidLine(temp, fp, fu, area.FileReq);
		    MidLine(temp, np, nu, area.FileReq && NewAreaFiles);

		    snprintf(temp, 81, "%d KBytes in %d files", AllAreaBytes / 1024, AllAreaFiles);
		    MidLine(temp, fp, fu, TRUE);
		    snprintf(temp, 81, "%d KBytes in %d files", NewAreaBytes / 1024, NewAreaFiles);
		    MidLine(temp, np, nu, NewAreaFiles);
		    if (popdown) {
			snprintf(temp, 81, "Most popular file is %s", pop);
			MidLine(temp, fp, fu, TRUE);
		    }

		    BotBox(fp, fu, TRUE);
		    BotBox(np, nu, NewAreaFiles);

		    fseek(fdb_area->fp, fdbhdr.hdrsize, SEEK_SET);
		    while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) {
			if (!fdb.Deleted) {
			    New = (((t_start - fdb.UploadDate) / 84400) <= CFG.newdays);

			    snprintf(temp, 81, "%s", fdb.LName);
			    WriteFiles(fp, fu, np, nu, New, temp);

			    snprintf(temp, 81, "%-12s%10u K %s [%04d] Uploader: %s", 
				fdb.Name, (int)(fdb.Size / 1024), StrDateDMY(fdb.UploadDate), fdb.TimesDL, 	 
				strlen(fdb.Uploader)?fdb.Uploader:"");
			    WriteFiles(fp, fu, np, nu, New, temp);

			    for (z = 0; z < 25; z++) {
				if (strlen(fdb.Desc[z])) {
				    if ((fdb.Desc[z][0] == '@') && (fdb.Desc[z][1] == 'X')) {
					snprintf(temp, 81, "                         %s", fdb.Desc[z]+4);
				    } else {
					snprintf(temp, 81, "                         %s", fdb.Desc[z]);
				    }
				    WriteFiles(fp, fu, np, nu, New, temp);
				}
			    }

			    if (strlen(fdb.Magic)) {
				snprintf(temp, 81, "                         Magic filerequest: %s", fdb.Magic);
				WriteFiles(fp, fu, np, nu, New, temp);
			    }
			    WriteFiles(fp, fu, np, nu, New, (char *)"");
			}
		    }
		}
		mbsedb_CloseFDB(fdb_area);
    		}
	}
    } /* End of While Loop Checking for Areas Done */

    fclose(pAreas);

    TopBox(fp, fu, TRUE);
    TopBox(np, nu, TRUE);
    snprintf(temp, 81, "Total %d files, %d KBytes", AllFiles, AllKBytes);
    MidLine(temp, fp, fu, TRUE);
    snprintf(temp, 81, "Total %d files, %d KBytes", NewFiles, NewKBytes);
    MidLine(temp, np, nu, TRUE);

    MidLine((char *)"", fp, fu, TRUE);
    MidLine((char *)"", np, nu, TRUE);

    snprintf(temp, 81, "Created by MBSE BBS v%s (%s-%s) at %s", VERSION, OsName(), OsCPU(), StrDateDMY(t_start));
    MidLine(temp, fp, fu, TRUE);
    MidLine(temp, np, nu, TRUE);

    BotBox(fp, fu, TRUE);
    BotBox(np, nu, TRUE);

    snprintf(temp, PATH_MAX, "%s/etc/footer.txt", getenv("MBSE_ROOT"));
    if(( pHeader = fopen(temp, "r")) != NULL) {
	Syslog('+', "Inserting %s", temp);

	while( fgets(temp, 80 ,pHeader) != NULL) {
	    Striplf(temp);
	    fprintf(fp, "%s\r\n", temp);
	    fprintf(np, "%s\r\n", temp);
	    fprintf(fu, "%s\r\n", chartran(temp));
	    fprintf(nu, "%s\r\n", chartran(temp));
	}
	fclose(pHeader);
    }

    fclose(fp);
    fclose(np);
    fclose(fu);
    fclose(nu);
    chartran_close();

    if ((rename("allfiles.tmp", "allfiles.txt")) == 0)
	unlink("allfiles.tmp");
    if ((rename("newfiles.tmp", "newfiles.txt")) == 0)
	unlink("newfiles.tmp");
    if ((rename("allfiles.ump", "allfiles.utf")) == 0)
	unlink("allfiles.ump");
    if ((rename("newfiles.ump", "newfiles.utf")) == 0)
	unlink("newfiles.ump");

    Syslog('+', "Allfiles: %ld, %ld MBytes", AllFiles, AllKBytes / 1024);
    Syslog('+', "Newfiles: %ld, %ld MBytes", NewFiles, NewKBytes / 1024);
    free(sAreas);
}
Ejemplo n.º 7
0
Archivo: mbmsg.c Proyecto: bbs-io/mbse
void DoMsgBase()
{
    FILE    *pAreas;
    char    *sAreas, *Name;
    int	    arearec;
    int	    Del = 0;

    sAreas  = calloc(PATH_MAX, sizeof(char));
    Name    = calloc(PATH_MAX, sizeof(char ));

    IsDoing("Msg Maintenance");

    if (do_area)
	Syslog('+', "Processing message area %ld", do_area);
    else
	Syslog('+', "Processing all message areas");

    if (do_kill) {
	Syslog('-', " Total Max. Days/Killed  Max. Nr/Killed Area name");
	Syslog('-', "------    ------ ------   ------ ------ ----------------------------------");
    }

    snprintf(sAreas, PATH_MAX, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
    if(( pAreas = fopen (sAreas, "r")) == NULL) {
	WriteError("$Can't open %s", sAreas);
	die(MBERR_GENERAL);
    }
    fread(&msgshdr, sizeof(msgshdr), 1, pAreas);

    if (do_area) {
	if (fseek(pAreas, (msgshdr.recsize + msgshdr.syssize) * (do_area - 1), SEEK_CUR) == 0) {
	    fread(&msgs, msgshdr.recsize, 1, pAreas);
	    if (msgs.Active) {

		if (enoughspace(CFG.freespace) == 0)
		    die(MBERR_DISK_FULL);

		if (!do_quiet) {
		    mbse_colour(CYAN, BLACK);
		    printf("\r%5d .. %-40s", do_area, msgs.Name);
		    fflush(stdout);
		}
		are_tot++;
		mkdirs(msgs.Base, 0770);
		if (do_kill)
		    KillArea(msgs.Base, msgs.Name, msgs.DaysOld, msgs.MaxMsgs, do_area);
		if (do_pack || msg_del)
		    PackArea(msgs.Base, do_area);
		if (do_link)
		    LinkArea(msgs.Base, do_area);
		if (processed)
		    are_proc++;
	    }
	}
    } else {
	arearec = 0;
	while (fread(&msgs, msgshdr.recsize, 1, pAreas) == 1) {
	    fseek(pAreas, msgshdr.syssize, SEEK_CUR);
	    arearec++;
	    if (msgs.Active) {

		if (enoughspace(CFG.freespace) == 0)
		    die(MBERR_DISK_FULL);

		Nopper();
		if (!do_quiet) {
		    mbse_colour(CYAN, BLACK);
		    printf("\r%5d .. %-40s", arearec, msgs.Name);
		    fflush(stdout);
		}
		are_tot++;
		mkdirs(msgs.Base, 0770);
		processed = FALSE;
		if (do_kill)
		    KillArea(msgs.Base, msgs.Name, msgs.DaysOld, msgs.MaxMsgs, arearec);
		if (do_pack || (Del != msg_del)) {
		    PackArea(msgs.Base, arearec);
		}
		Del = msg_del;
		if (do_link)
		    LinkArea(msgs.Base, arearec);
		if (processed)
		    are_proc++;
	    }
	}
    }
    fclose(pAreas);

    if (!do_area) {
	snprintf(sAreas, PATH_MAX, "%s/etc/users.data", getenv("MBSE_ROOT"));
	if ((pAreas = fopen (sAreas, "r")) == NULL) {
	    WriteError("$Can't open %s", sAreas);
	    die(MBERR_GENERAL);
	}
	fread(&usrconfighdr, sizeof(usrconfighdr), 1, pAreas);

	while (fread(&usrconfig, usrconfighdr.recsize, 1, pAreas) == 1) {
	    if (usrconfig.Email && strlen(usrconfig.Name)) {
		Nopper();
		snprintf(Name, PATH_MAX, "User %s email area: mailbox", usrconfig.Name);
		if (!do_quiet) {
		    mbse_colour(CYAN, BLACK);
		    printf("\r      .. %-40s", Name);
		    fflush(stdout);
		}
		snprintf(sAreas, PATH_MAX, "%s/%s/mailbox", CFG.bbs_usersdir, usrconfig.Name);
		are_tot++;
		processed = FALSE;
		if (do_kill)
		    KillArea(sAreas, Name, 0, CFG.defmsgs, 0);
		if (do_pack || (Del != msg_del)) {
		    PackArea(sAreas, 0);
		}
		Del = msg_del;
		if (do_link)
		    LinkArea(sAreas, 0);
		if (processed)
		    are_proc++;
		snprintf(sAreas, PATH_MAX, "%s/%s/archive", CFG.bbs_usersdir, usrconfig.Name);
		snprintf(Name, 80, "User %s email area: archive", usrconfig.Name);
		are_tot++;
		processed = FALSE;
		if (do_kill)
		    KillArea(sAreas, Name, 0, CFG.defmsgs, 0);
		if (do_pack || (Del != msg_del))
		    PackArea(sAreas, 0);
		Del = msg_del;
		if (do_link)
		    LinkArea(sAreas, 0);
		if (processed)
		    are_proc++;
		snprintf(sAreas, PATH_MAX, "%s/%s/trash", CFG.bbs_usersdir, usrconfig.Name);
		snprintf(Name, 80, "User %s email area: trash", usrconfig.Name);
		are_tot++;
		processed = FALSE;
		if (do_kill)
		    KillArea(sAreas, Name, CFG.defdays, CFG.defmsgs, 0);
		if (do_pack || (Del != msg_del))
		    PackArea(sAreas, 0);
		Del = msg_del;
		if (do_link)
		    LinkArea(sAreas, 0);
		if (processed)
		    are_proc++;

	    }
	}

	fclose(pAreas);
    }

    if (do_link)
	RemoveSema((char *)"msglink");

    free(sAreas);
    free(Name);
    die(MBERR_OK);
}
Ejemplo n.º 8
0
int get_xover(char *grpname, int startnr, int endnr, List **art)
{
    char	    cmd[81], *ptr, *ptr2, *resp, *p;
    int		    retval, dupe, done = FALSE;
    int		    nr;
    unsigned int    crc;
    POverview	    pov;

    snprintf(cmd, 81, "XOVER %d-%d\r\n", startnr, endnr);
    if ((retval = nntp_cmd(cmd, 224))) {
	switch (retval) {
	    case 412:	WriteError("No newsgroup selected");
			return RETVAL_NOXOVER;
	    case 502:	WriteError("Permission denied");
			return RETVAL_NOXOVER;
	    case 420:	Syslog('m', "No articles in group %s", grpname);
			return RETVAL_OK;
	}
    }

    while (done == FALSE) {
	resp = nntp_receive();
	if ((strlen(resp) == 1) && (strcmp(resp, ".") == 0)) {
	    done = TRUE;
	} else {
	    Marker();
	    Nopper();
	    pov = xoverview;
	    ptr = resp;
	    ptr2 = ptr;

	    /*
	     * First item is the message number.
	     */
	    while (*ptr2 != '\0' && *ptr2 != '\t')
		ptr2++;
	    if (*ptr2 != '\0')
		*(ptr2) = '\0';
	    nr = atol(ptr);
	    ptr = ptr2;
	    ptr++;

	    /*
	     * Search the message-id
	     */
	    while (*ptr != '\0' && pov != NULL && strcmp(pov->header, "Message-ID:") != 0) {
		/*
		 * goto the next field, past the tab.
		 */
		pov = pov->next;

		while (*ptr != '\t' && *ptr != '\0')
		    ptr++;
		if (*ptr != '\0')
		    ptr++;
	    }
	    if (*ptr != '\0' && pov != NULL) {
		/*
		 * Found it, now find start of msgid
		 */
		while (*ptr != '\0' && *ptr != '<')
		    ptr++;
		if(ptr != '\0') {
		    ptr2 = ptr;
		    while(*ptr2 != '\0' && *ptr2 != '>')
			ptr2++;
		    if (*ptr2 != '\0') {
			*(ptr2+1) = '\0';
			p = xstrcpy(ptr);
			p = xstrcat(p, grpname);
			crc = str_crc32(p);
			dupe = CheckDupe(crc, D_NEWS, CFG.nntpdupes);
			fill_artlist(art, ptr, nr, dupe);
			free(p);
			if (CFG.slow_util && do_quiet)
			    msleep(1);
		    }
		}
	    }
	}
    }

    return RETVAL_OK;
}
Ejemplo n.º 9
0
/*
 *  Scan for new news available at the nntp server.
 */
void ScanNews(void)
{
    List		*art = NULL;
    POverview		tmp, old;
    FILE		*pAreas;
    char		*sAreas;
    struct msgareashdr	Msgshdr;
    struct msgareas	Msgs;

    IsDoing((char *)"Scan News");
    if (nntp_connect() == -1) {
	WriteError("Can't connect to newsserver");
	return;
    }
    if (get_xoverview()) {
	return;
    }

    if (!do_quiet) {
	mbse_colour(LIGHTGREEN, BLACK);
	printf("Scan for new news articles\n");
    }

    sAreas = calloc(PATH_MAX, sizeof(char));
    snprintf(sAreas, PATH_MAX, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
    if(( pAreas = fopen (sAreas, "r")) == NULL) {
	WriteError("$Can't open Messages Areas File.");
	return;
    }
    fread(&Msgshdr, sizeof(Msgshdr), 1, pAreas);

    while (fread(&Msgs, Msgshdr.recsize, 1, pAreas) == 1) {
	fseek(pAreas, Msgshdr.syssize, SEEK_CUR);
#ifdef USE_NEWSGATE
	if ((Msgs.Active) && strlen(Msgs.Newsgroup)) {
#else
	if ((Msgs.Active) && strlen(Msgs.Newsgroup) && (Msgs.Type == NEWS)) {
#endif
	    if (IsSema((char *)"upsalarm")) {
		Syslog('+', "Detected upsalarm semafore, aborting newsscan");
		break;
	    }
	    Syslog('m', "Scan newsgroup: %s", Msgs.Newsgroup);
	    if (!do_quiet) {
		mbse_colour(CYAN, BLACK);
		printf("\r%-40s", Msgs.Newsgroup);
		fflush(stdout);
	    }
	    Nopper();
	    if (do_one_group(&art, Msgs.Newsgroup, Msgs.Tag, Msgs.MaxArticles) == RETVAL_ERROR)
		break;
	    /*
	     * To be safe, update the dupes database after each area.
	     */
	    CloseDupes();
	}
    }
    fclose(pAreas);
    free(sAreas);

    for (tmp = xoverview; tmp; tmp = old) {
	old = tmp->next;
	if (tmp->header)
	    free(tmp->header);
	if (tmp->field)
	    free(tmp->field);
	free(tmp);
    }

    nntp_close();

    do_flush = TRUE;
    if (!do_quiet)
	printf("\r                                                    \r");
}



int do_one_group(List **art, char *grpname, char *ftntag, int maxarticles)
{
    List    *tmp;
    char    temp[128], *resp;
    int	    retval, fetched = 0;
    int	    total, start, end;

    Syslog('m', "do_one_group(%s, %s)", grpname, ftntag);
    IsDoing((char *)"Scan %s", grpname);
    snprintf(temp, 128, "GROUP %s\r\n", grpname);
    nntp_send(temp);
    resp = nntp_receive();
    retval = atoi(strtok(resp, " "));
    if (retval == 480) {
	/*
	 * We must login
	 */
	if (nntp_auth() == FALSE) {
	    WriteError("Authorisation failure");
	    nntp_close();
	    return RETVAL_NOAUTH;
	}
	nntp_send(temp);
	resp = nntp_receive();
	retval = atoi(strtok(resp, " "));
    }
    if (retval != 211) {
	if (retval == 411) {
	    WriteError("No such newsgroup: %s", grpname);
	    return RETVAL_UNEXPECTEDANS;
	}
	WriteError("Unknown response %d to GROUP command", retval);
	return RETVAL_ERROR;
    }

    total = atol(strtok(NULL, " "));
    start = atol(strtok(NULL, " "));
    end   = atol(strtok(NULL, " '\0'"));
    Syslog('m', "GROUP total %d, start %d, end %d, max %d", total, start, end, maxarticles);
    if ((maxarticles) && (total > maxarticles)) {
	start = end - maxarticles;
	total = maxarticles;
	Syslog('m', "NEW:  total %d, start %d, end %d", total, start, end);
    }
    if (!total) {
	Syslog('+', "Fetched 0 articles from %s", grpname);
	return RETVAL_NOARTICLES;
    }

    retval = get_xover(grpname, start, end, art);
    if (retval != RETVAL_OK) {
	tidy_artlist(art);
	return retval;
    }

    if (!do_learn) {
	for (tmp = *art; tmp; tmp = tmp->next) {
	    if (!tmp->isdupe) {
		/*
		 *  If the message isn't a dupe, it must be new for us.
		 */
		get_article(tmp->msgid, ftntag);
		fetched++;
	    }
	}
    }

    tidy_artlist(art);

    if ((maxarticles) && (fetched == maxarticles))
	Syslog('!', "Warning: the max. articles value in newsgroup %s might be to low", grpname);

    Syslog('+', "Fetched %d article%s from %s", fetched, (fetched == 1) ? "":"s", grpname);
    return RETVAL_OK;
}
Ejemplo n.º 10
0
void Marker(void)
{
    /*
     * Keep the connection with the server alive
     */
    Nopper();

    /*
     * Release system resources when running in the background
     */
    if (CFG.slow_util && do_quiet)
        msleep(1);

    if (do_quiet)
        return;

    switch (marker) {
    case 0:
        printf(">---");
        break;

    case 1:
        printf(">>--");
        break;

    case 2:
        printf(">>>-");
        break;

    case 3:
        printf(">>>>");
        break;

    case 4:
        printf("<>>>");
        break;

    case 5:
        printf("<<>>");
        break;

    case 6:
        printf("<<<>");
        break;

    case 7:
        printf("<<<<");
        break;

    case 8:
        printf("-<<<");
        break;

    case 9:
        printf("--<<");
        break;

    case 10:
        printf("---<");
        break;

    case 11:
        printf("----");
        break;
    }
    printf("\b\b\b\b");
    fflush(stdout);

    if (marker < 11)
        marker++;
    else
        marker = 0;
}
Ejemplo n.º 11
0
/*
 * Receive a file with ZMODEM protocol
 *  Assumes file name frame is in secbuf
 */
int rzfile(void)
{
    int	c, n;

    Eofseen=FALSE;
    rxbytes = 0l;
    if ((c = procheader(secbuf))) {
	return (tryzhdrtype = c);
    }

    n = 20;

    for (;;) {
	stohdr(rxbytes);
	zshhdr(ZRPOS, Txhdr);
nxthdr:
	switch (c = zgethdr(Rxhdr)) {
	    default:	    Syslog('z', "rzfile: Wrong header %d", c);
			    if ( --n < 0) {
				Syslog('+', "Zmodem: wrong header %d", c);
				return TERROR;
			    }
			    continue;
	    case ZCAN:	    Syslog('+', "Zmodem: sender CANcelled");
			    return TERROR;
	    case ZNAK:	    if ( --n < 0) {
				Syslog('+', "Zmodem: Got ZNAK");
				return TERROR;
			    }
			    continue;
	    case TIMEOUT:   if ( --n < 0) {
				Syslog('z', "Zmodem: TIMEOUT");
				return TERROR;
			    }
			    continue;
	    case ZFILE:	    zrdata(secbuf, MAXBLOCK);
			    continue;
	    case ZEOF:	    if (rclhdr(Rxhdr) != rxbytes) {
				/*
				 * Ignore eof if it's at wrong place - force
				 *  a timeout because the eof might have gone
				 *  out before we sent our zrpos.
				 */
				errors = 0;
				goto nxthdr;
			    }
			    if (closeit(1)) {
				tryzhdrtype = ZFERR;
				Syslog('+', "Zmodem: error closing file");
				return TERROR;
			    }
			    fout = NULL;
			    Syslog('z', "rzfile: normal EOF");
			    return c;
	    case HANGUP:    Syslog('+', "Zmodem: Lost Carrier");
			    return TERROR;
	    case TERROR:    /* Too much garbage in header search error */
			    if (--n < 0) {
				Syslog('+', "Zmodem: Too many errors");
				return TERROR;
			    }
			    zmputs(Attn);
			    continue;
	    case ZSKIP:	    Modtime = 1;
			    closeit(1);
			    Syslog('+', "Zmodem: Sender SKIPPED file");
			    return c;
	    case ZDATA:	    if (rclhdr(Rxhdr) != rxbytes) {
				if ( --n < 0) {
				    Syslog('+', "Zmodem: Data has bad address");
				    return TERROR;
				}
				zmputs(Attn);  
				continue;
			    }
moredata:
			    Nopper();
			    alarm_on();
			    switch (c = zrdata(secbuf, MAXBLOCK)) {
				case ZCAN:	Syslog('+', "Zmodem: sender CANcelled");
						return TERROR;
				case HANGUP:	Syslog('+', "Zmodem: Lost Carrier");
						return TERROR;
				case TERROR:	/* CRC error */
						if (--n < 0) {
						    Syslog('+', "Zmodem: Too many errors");
						    return TERROR;
						}
						zmputs(Attn);
						continue;
				case TIMEOUT:	if ( --n < 0) {
						    Syslog('+', "Zmodem: TIMEOUT");
						    return TERROR;
						}
						continue;
				case GOTCRCW:	n = 20;
						putsec(secbuf, Rxcount);
						rxbytes += Rxcount;
						stohdr(rxbytes);
						PUTCHAR(XON);
						zshhdr(ZACK, Txhdr);
						goto nxthdr;
				case GOTCRCQ:	n = 20;
						putsec(secbuf, Rxcount);
						rxbytes += Rxcount;
						stohdr(rxbytes);
						zshhdr(ZACK, Txhdr);
						goto moredata;
				case GOTCRCG:	n = 20;
						putsec(secbuf, Rxcount);
						rxbytes += Rxcount;
						goto moredata;
				case GOTCRCE:	n = 20;
						putsec(secbuf, Rxcount);
						rxbytes += Rxcount;
						goto nxthdr;
			    }
	}
    }
}
Ejemplo n.º 12
0
Archivo: m_fdb.c Proyecto: bbs-io/mbse
/*
 * Init files database. Since version 0.51.2 the format is changed.
 * Check this and automagic upgrade the database.
 */
void InitFDB(void)
{
    int			    records, i;
    int			    Area = 0;
    char		    *temp, Magic[21];
    FILE		    *fp1, *fp2, *fil, *ft, *fp;
    DIR			    *dp;
    struct dirent	    *de;
    struct OldFILERecord    old;
    struct stat		    sb;
    struct _fdbarea	    *fdb_area = NULL;

    records = CountFilearea();
    if (records <= 0)
	return;
    
    temp = calloc(PATH_MAX, sizeof(char));
    snprintf(temp, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT"));
    if ((fil = fopen(temp, "r")) != NULL) {
	fread(&areahdr, sizeof(areahdr), 1, fil);

	while (fread(&area, areahdr.recsize, 1, fil)) {
	    Area++;
	    if (area.Available) {
		snprintf(temp, PATH_MAX, "%s/var/fdb/fdb%d.data", getenv("MBSE_ROOT"), Area);
		if ((fp1 = fopen(temp, "r")) != NULL) {
		    /*
		     * Old area available, upgrade.
		     */
		    snprintf(temp, PATH_MAX, "%s/var/fdb/file%d.data", getenv("MBSE_ROOT"), Area);
		    if ((fp2 = fopen(temp, "w+")) == NULL) {
			WriteError("$Can't create %s", temp);
		    } else {
			fdbhdr.hdrsize = sizeof(fdbhdr);
			fdbhdr.recsize = sizeof(fdb);
			fwrite(&fdbhdr, sizeof(fdbhdr), 1, fp2);

			while (fread(&old, sizeof(old), 1, fp1)) {
			    Nopper();
			    memset(&fdb, 0, fdbhdr.recsize);
			    strncpy(fdb.Name, old.Name, sizeof(fdb.Name) -1);
			    strncpy(fdb.LName, old.LName, sizeof(fdb.LName) -1);
			    snprintf(temp, PATH_MAX, "%s/etc/tic.data", getenv("MBSE_ROOT"));
			    if ((ft = fopen(temp, "r")) != NULL) {
				fread(&tichdr, sizeof(tichdr), 1, ft);
				while (fread(&tic, tichdr.recsize, 1, ft)) {
				    if (StringCRC32(tic.Name) == old.TicAreaCRC) {
					strncpy(fdb.TicArea, tic.Name, sizeof(fdb.TicArea) -1);
					break;
				    }
				    fseek(ft, tichdr.syssize, SEEK_CUR);
				}
				fclose(ft);
			    }
			    fdb.Size = old.Size;
			    fdb.Crc32 = old.Crc32;
			    strncpy(fdb.Uploader, old.Uploader, sizeof(fdb.Uploader) -1);
			    fdb.UploadDate = old.UploadDate;
			    fdb.FileDate = old.FileDate;
			    fdb.LastDL = old.LastDL;
			    fdb.TimesDL = old.TimesDL + old.TimesFTP + old.TimesReq;
			    strncpy(fdb.Password, old.Password, sizeof(fdb.Password) -1);
			    for (i = 0; i < 25; i++)
				strncpy(fdb.Desc[i], old.Desc[i], 48);

			    /*
			     * Search the magic directory to see if this file is a magic file.
			     */
			    snprintf(temp, 81, "%s", CFG.req_magic);
			    if ((dp = opendir(temp)) != NULL) {
				while ((de = readdir(dp))) {
				    if (de->d_name[0] != '.') {
					snprintf(temp, PATH_MAX, "%s/%s", CFG.req_magic, de->d_name);
					/*
					 * Only regular files without execute permission are magic requests.
					 */
					if ((lstat(temp, &sb) != -1) && (S_ISREG(sb.st_mode)) && (! (sb.st_mode & S_IXUSR))) {
					    if ((fp = fopen(temp, "r"))) {
						fgets(Magic, sizeof(Magic) -1, fp);
						Striplf(Magic);
						if ((strcasecmp(Magic, fdb.Name) == 0) || (strcasecmp(Magic, fdb.LName) == 0)) {
						    strncpy(fdb.Magic, de->d_name, sizeof(fdb.Magic) -1);
						}
						fclose(fp);
					    }
					}
				    }
				}
				closedir(dp);
			    } else {
				WriteError("$Can't open directory %s", temp);
			    }
			    fdb.Deleted = old.Deleted;
			    fdb.NoKill = old.NoKill;
			    fdb.Announced = old.Announced;
			    fdb.Double = old.Double;
			    fwrite(&fdb, fdbhdr.recsize, 1, fp2);
			}
			fclose(fp2);
			Syslog('+', "Upgraded file area database %d", Area);
		    }
		    fclose(fp1);
		    snprintf(temp, PATH_MAX, "%s/var/fdb/fdb%d.data", getenv("MBSE_ROOT"), Area);
		    unlink(temp);
		} // Old area type upgrade.

		/*
		 * Current area, check
		 */
		if ((fdb_area = mbsedb_OpenFDB(Area, 30)) == NULL)
		    WriteError("InitFDB(): database area %d might be corrupt", Area);
		else
		    mbsedb_CloseFDB(fdb_area);
	    }
	}
	fclose(fil);
    }
    free(temp);
}
Ejemplo n.º 13
0
Archivo: file.c Proyecto: bbs-io/mbse
/*
 * Scan for new files, called from menu.
 */
int NewfileScan(int AskStart) 
{ 
    FILE    *pAreas;
    int	    ifDate, itDate;
    char    *temp, *Date;
    int	    Found, Count = 0;
    _Tag    T;
    struct _fdbarea *fdb_area = NULL;

    Date     = calloc(81, sizeof(char));
    temp     = calloc(81, sizeof(char));

    iLineCount = 2;
    arecno     = 1; /* Reset Area Number to One  */

    if (AskStart) {
	Enter(2);
	/* Search for new since your last call [Y/n]: */
	pout(LIGHTCYAN, BLACK, (char *) Language(273));
	colour(CFG.InputColourF, CFG.InputColourB);

	if (toupper(Readkey()) == Keystroke(273, 1)) {
	    Enter(1);
	    /* Enter new date to search for [DD-MM-YYYY]: */
	    pout(GREEN, BLACK, (char *) Language(274));
	    colour(CFG.InputColourF, CFG.InputColourB);
	    GetDate(temp, 10);
	} else {
	    strcpy(temp, LastLoginDate);
	}
    } else {
	strcpy(temp, LastLoginDate);
    }

    Syslog('+', "NewfileScan() since %s", temp);
    clear();
    /* File Search by Date */
    pout(WHITE, BLACK, (char *) Language(275));
    Enter(2);

    Date[0] = temp[6];	/* Swap the date around      */
    Date[1] = temp[7];	/* Instead of   DD-MM-YYYY   */
    Date[2] = temp[8];	/* Let it equal YYYYMMDD     */
    Date[3] = temp[9];	/* Swap the date around      */
    Date[4] = temp[3];	/* Swap the date around      */
    Date[5] = temp[4];	/* because when you convert  */
    Date[6] = temp[0];	/* a string to an int you    */
    Date[7] = temp[1];	/* loose the front Zero      */
    Date[8] = '\0';   	/* making the number smaller */
    itDate = atol(Date);

    InitTag();

    if ((pAreas = OpenFareas(FALSE)) == NULL)
	return 0;

    while (fread(&area, areahdr.recsize, 1, pAreas) == 1) {

	if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0) && (area.New)) {

	    if ((fdb_area = mbsedb_OpenFDB(arecno, 30))) {
		Sheader();
		Found = FALSE;
		Nopper();

		while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) {
		    strcpy(temp, StrDateDMY(fdb.UploadDate));	/* Realloc Space for Date */
		    Date[0] = temp[6];	    /* Swap the date around      */
		    Date[1] = temp[7];	    /* Instead of   DD-MM-YYYY   */
		    Date[2] = temp[8];	    /* Let it equal YYYYMMDD     */
		    Date[3] = temp[9];	    /* Swap the date around      */
		    Date[4] = temp[3];	    /* Swap the date around      */
		    Date[5] = temp[4];	    /* because when you convert  */
		    Date[6] = temp[0];	    /* a string to an int you    */
		    Date[7] = temp[1];	    /* loose the front Zero      */
		    Date[8] = '\0';	    /* making the number smaller */
					    /* and invalid to this cause */
		    ifDate = atol(Date);

		    if (ifDate >= itDate) {
			if (!Found) {
			    Enter(2);
			    if (iLC(2) == 1) {
				free(Date);
				free(temp);
				mbsedb_CloseFDB(fdb_area);
				fclose(pAreas);
				return 1;
			    }
			    Found = TRUE;
			}

			memset(&T, 0, sizeof(T));
			T.Area   = arecno;
			T.Active = FALSE;
			T.Size   = fdb.Size;
			strncpy(T.SFile, fdb.Name, 12);
			strncpy(T.LFile, fdb.LName, 80);
			SetTag(T);

			Count++;
			if (ShowOneFile() == 1) {
			    free(Date);
			    free(temp);
			    mbsedb_CloseFDB(fdb_area);
			    fclose(pAreas);
			    return 1;
			}
		    } /* End of if */
		} /* End of while */

		mbsedb_CloseFDB(fdb_area);
		
		/*
		 * Add 2 blank lines after found files.
		 */
		if (Found) {
		    Enter(2);
		    if (iLC(2) == 1) {
			free(Date);
			free(temp);
			fclose(pAreas);
			return 1;
		    }
		}

	    } /* End of open filebase */

	} /* End of check new files scan */
	arecno++; /* Go to next file area */
    } /* End of Main */

    if (Count)
	Syslog('+', "Found %d new files", Count);
    fclose(pAreas);
    Enter(1);
    if (Count)
	Mark();
    else
	Pause();

    free(temp);
    free(Date);
    return 1;
}
Ejemplo n.º 14
0
Archivo: file.c Proyecto: bbs-io/mbse
/*
 * Search for a file, called from the menu.
 */
int FilenameScan()
{
    FILE	    *pAreas;
    int		    Found, Count = 0;
    char	    mask[256];
    char	    *Name;
    _Tag	    T;
    unsigned int    OldArea;
    struct _fdbarea *fdb_area = NULL;

    Name     = calloc(81, sizeof(char));
    OldArea  = iAreaNumber;

    iLineCount = 2; /* Reset Line Counter to Zero */
    arecno     = 1; /* Reset Area Number to One  */

    Enter(2);
    /* Accepts wildcards such as : *.zip, *.gz, *.* */
    pout(WHITE, BLACK, (char *) Language(269));

    Enter(2);
    /* Enter filename to search for : */
    pout(LIGHTCYAN, BLACK, (char *) Language(271));

    colour(CFG.InputColourF, CFG.InputColourB);
    GetstrC(Name, 80);

    if ((strcmp(Name, "")) == 0) {
	free(Name);
	return 0;
    }

    strcpy(mask, re_mask(Name, TRUE));
    Syslog('+', "FilenameScan(): \"%s\" -> \"%s\"", Name, mask);
    free(Name);
    re_comp(mask);

    clear();
    /* File Search by Filename */
    pout(WHITE, BLACK, (char *) Language(272));
    Enter(1);
    InitTag();

    if ((pAreas = OpenFareas(FALSE)) == NULL)
	return 0;

    while (fread(&area, areahdr.recsize, 1, pAreas) == 1) {
	if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0)) {

	    if ((fdb_area = mbsedb_OpenFDB(arecno, 30))) {
		Found = FALSE;
		Sheader();
		Nopper();

		while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) {
		    if (re_exec(fdb.Name) || re_exec(fdb.LName)) {
			if (!Found) {
			    Enter(2);
			    if (iLC(2) == 1) {
				SetFileArea(OldArea);
				return 1;
			    }
			    Found = TRUE;
			}

			memset(&T, 0, sizeof(T));
			T.Area   = arecno;
			T.Active = FALSE;
			T.Size   = fdb.Size;
			strncpy(T.SFile, fdb.Name, 12);
			strncpy(T.LFile, fdb.LName, 81);
			SetTag(T);
			Count++;
			if (ShowOneFile() == 1) {
			    SetFileArea(OldArea);
			    return 1;
			}
		    }

		} /* End of while */

		mbsedb_CloseFDB(fdb_area);
		if (Found) {
		    Enter(2);
		    if (iLC(2) == 1) {
			SetFileArea(OldArea);
			return 1;
		    }
		}

	    } /* End Check for LTSec */
	} /* if access */
	arecno++; /* Go to next file area */

    } /* End of Main */

    Syslog('+', "Found %d files", Count);
    fclose(pAreas);
    Enter(1);
    if (Count)
	Mark();
    else
	Pause();
    SetFileArea(OldArea);
    return 1;
}
Ejemplo n.º 15
0
Archivo: file.c Proyecto: bbs-io/mbse
/*
 * Search for keyword, called from menu.
 */
int KeywordScan()
{
    FILE	    *pAreas;
    int		    i, z, y, Found, Count = 0;
    char	    *Name, *tmpname, *BigDesc, temp[81];
    _Tag	    T;
    unsigned int    OldArea;
    struct _fdbarea *fdb_area = NULL;

    Name     = calloc(81, sizeof(char));
    tmpname  = calloc(81, sizeof(char));
    BigDesc  = calloc(1230, sizeof(char));
    OldArea  = iAreaNumber;

    iLineCount = 2; /* Reset Line Counter to Zero */
    arecno     = 1; /* Reset Area Number to One */

    Enter(2);
    /* Enter keyword to use for Search: */
    pout(LIGHTCYAN, BLACK, (char *) Language(267));

    colour(CFG.InputColourF, CFG.InputColourB);
    GetstrC(Name, 80);

    if ((strcmp(Name, "")) == 0)
	return 0;

    strcpy(tmpname, tl(Name));
    strcpy(Name, "");
    y = strlen(tmpname);
    for (z = 0; z <  y; z++) {
	if (tmpname[z] != '*') {
	    snprintf(temp, 81, "%c", tmpname[z]);
	    strcat(Name, temp);
	}
    }
    Syslog('+', "KeywordScan(): \"%s\"", Name);

    clear();
    /* File search by keyword */
    pout(WHITE, BLACK, (char *) Language(268));
    Enter(1);
    InitTag();

    if ((pAreas = OpenFareas(FALSE)) == NULL)
	return 0;

    while (fread(&area, areahdr.recsize, 1, pAreas) == 1) {

	if ((Access(exitinfo.Security, area.LTSec)) && (area.Available) && (strlen(area.Password) == 0)) {

	    if ((fdb_area = mbsedb_OpenFDB(arecno, 30))) {
		Nopper();
		Found = FALSE;
		Sheader();

		while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) {
		    for (i = 0; i < 25; i++)
			snprintf(BigDesc, 1230, "%s%s", BigDesc, *(fdb.Desc + i));

		    if ((strstr(fdb.Name,Name) != NULL) || (strstr(tl(BigDesc), Name) != NULL)) {

			if (!Found) {
			    Enter(2);
			    if (iLC(2) == 1) {
				free(BigDesc);
				free(Name);
				free(tmpname);
				SetFileArea(OldArea);
				return 1;
			    }
			    Found = TRUE;
			}

			memset(&T, 0, sizeof(T));
			T.Area   = arecno;
			T.Active = FALSE;
			T.Size   = fdb.Size;
			strncpy(T.SFile, fdb.Name, 12);
			strncpy(T.LFile, fdb.LName, 80);
			SetTag(T);
			Count++;
			if (ShowOneFile() == 1) {
			    free(BigDesc);
			    free(Name);
			    free(tmpname);
			    SetFileArea(OldArea);
			    return 1;
			}
		    }
		    strcpy(BigDesc, "");  /* Clear BigDesc */

		} /* while */

		mbsedb_CloseFDB(fdb_area);
		if (Found) {
		    Enter(2);
		    if (iLC(2) == 1) {
			free(BigDesc);
			free(Name);
			free(tmpname);
			SetFileArea(OldArea);
			return 1;
		    }
		}

	    } /* End check for LTSec */
	} /* if access */
	arecno++; /* Go to next file area */
    } /* End of Main */

    Syslog('+', "Found %d files", Count);
    free(BigDesc);
    free(Name);
    free(tmpname);
    fclose(pAreas);
    Enter(1);
    if (Count)
	Mark();
    else
	Pause();
    SetFileArea(OldArea);
    return 1;
}
Ejemplo n.º 16
0
Archivo: fsedit.c Proyecto: bbs-io/mbse
int Fs_Edit()
{
    unsigned char   ch;
    int		    i, Changed = FALSE;
    char	    *filname, *tmpname;
    FILE	    *fd;

    Syslog('b', "FSEDIT: Entering FullScreen editor");
    if (utf8)
	chartran_init((char *)"CP437", (char *)"UTF-8", 'B');

    clear();
    InsMode = TRUE;
    TopVisible = 1;
    Col = 1;
    Row = 1;
    Refresh();

    while (TRUE) {
	Nopper();
	alarm_on();
	ch = Readkey();
	CurRow = Row + TopVisible - 1;

	switch (ch) {
	    case KEY_ENTER:
			    if (Col == 1) {
				/* Enter at beginning of line */
				for (i = Line; i >= CurRow; i--) {
				    snprintf(Message[i+1], TEXTBUFSIZE +1, "%s", Message[i]);
				}
				Message[i+1][0] = '\0';
			    } else {
				for (i = Line; i > CurRow; i--) {
				    snprintf(Message[i+1], TEXTBUFSIZE +1, "%s", Message[i]);
				}
				Message[CurRow+1][0] = '\0';
				if (Col <= strlen(Message[CurRow])) {
				    /* Enter in middle of line */
				    for (i = Col-1; i <= strlen(Message[CurRow]); i++) {
					snprintf(Message[CurRow+1] + strlen(Message[CurRow+1]), 5, "%c", Message[CurRow][i]);
				    }
				    Message[CurRow][Col-1] = '\0';
				}
				/* else Enter at end of line */
			    }
			    Line++;
			    Row++;
			    Col = 1;
			    if (Row >= (rows -1)) 
				ScrollDown();
			    Refresh();
			    Changed = TRUE;
			    break;

	    case ('N' - 64):  /* Insert line, scroll down */
			    for (i = Line; i >= CurRow; i--)
				snprintf(Message[i+1], TEXTBUFSIZE +1, "%s", Message[i]);
			    Message[CurRow][0] = '\0';
			    Line++;
			    Col = 1;
			    Refresh();
			    Changed = TRUE;
			    break;

	    case ('Y' - 64):  /* Erase line, scroll up */
			    if (Line == CurRow) {
				/* Erasing last line */
				if ((Line > 1) || (strlen(Message[CurRow]) > 0)) {
				    Message[CurRow][0] = '\0';
				    if (Line > 1) {
					Line--;
					if (Row == 1) 
					    ScrollUp();
					Row--;
				    }
				    if (Col > strlen(Message[CurRow]))
					Col = strlen(Message[CurRow]);
				    Refresh();
				    Changed = TRUE;
				} else
				    Beep();
			    } else {
				/* Erasing line in the middle */
				for (i = CurRow; i < Line; i++) {
				    snprintf(Message[i], TEXTBUFSIZE +1, "%s", Message[i+1]);
				}
				Message[i+1][0] = '\0';
				Line--;
				if (Col > strlen(Message[CurRow]) + 1)
				    Col = strlen(Message[CurRow]) + 1;
				Refresh();
				Changed = TRUE;
			    }
			    break;

	    case KEY_UP:
	    case ('E' - 64):
			    FsMove(KEY_UP);
			    break;

	    case KEY_DOWN:
	    case ('X' - 64):
			    FsMove(KEY_DOWN);
			    break;

	    case KEY_LEFT:
	    case ('S' - 64):
			    FsMove(KEY_LEFT);
			    break;

	    case KEY_RIGHT:
	    case ('D' - 64):
			    FsMove(KEY_RIGHT);
			    break;

	    case KEY_DEL:
			    if (Col <= strlen(Message[CurRow])) {
				/*
				 * If before the end of the line...
				 */
				Setcursor();
				for (i = Col; i <= strlen(Message[CurRow]); i++) {
				    Message[CurRow][i-1] = Message[CurRow][i];
				    PUTCHAR(Message[CurRow][i]);
				}
				PUTCHAR(' ');
				PUTCHAR('\b');
				Message[CurRow][i-1] = '\0';
				Setcursor();
			    } else if (((strlen(Message[CurRow]) + strlen(Message[CurRow+1]) < 75) 
				    || (strlen(Message[CurRow]) == 0)) && (CurRow < Line)) {
				for (i = 0; i < strlen(Message[CurRow+1]); i++)
				    snprintf(Message[CurRow] + strlen(Message[CurRow]), 5, "%c", Message[CurRow+1][i]);
				for (i = CurRow+1; i < Line; i++)
				    snprintf(Message[i], TEXTBUFSIZE +1, "%s", Message[i+1]);
				Message[Line][0] = '\0';
				Line--;
				Refresh();
			    } else
                                Beep();

			    /* 
			     * Trap the extra code so it isn't
			     * inserted in the text
			     */
			    if (ch == KEY_DEL) 
				Readkey();
			    break;

	    case KEY_BACKSPACE:
	    case KEY_RUBOUT:
			    if (Col == 1 && CurRow == 1) {
				/* BS on first character in message */
				Beep();
			    } else if (Col == 1) {
				/* BS at beginning of line */
				if ((strlen(Message[CurRow-1]) + strlen(Message[CurRow]) < 75) || strlen(Message[CurRow]) == 0) {
				    Col = strlen(Message[CurRow-1]) + 1;
				    strcat(Message[CurRow-1], Message[CurRow]);
				    for ( i = CurRow; i < Line; i++)
					snprintf(Message[i], TEXTBUFSIZE +1, "%s", Message[i+1]);
				    Message[i+1][0] = '\0';
				    Line--;
				    if (Row == 1) 
					ScrollUp();
				    Row--;
				    Refresh();
				    Changed = TRUE;
				} else {
				    i = strlen(Message[CurRow-1]) + strlen(Message[CurRow]);
				    Beep();
				}
			    } else {
				if (Col == strlen(Message[CurRow]) + 1) {
				    /* BS at end of line */
				    BackErase();
				    Col--;
				    Message[CurRow][Col-1] = '\0';
				    Changed = TRUE;
				} else {
				    /* BS in middle of line */
				    Col--;
				    Setcursor();
				    for (i = Col; i <= strlen(Message[CurRow]); i++) {
					Message[CurRow][i-1] = Message[CurRow][i];
					PUTCHAR(Message[CurRow][i]);
				    }
				    PUTCHAR(' ');
				    PUTCHAR('\b');
				    Message[CurRow][strlen(Message[CurRow])] = '\0';
				    Setcursor();
				    Changed = TRUE;
				}
			    }
			    break;

	    case KEY_INS:  /* Toggle Insert Mode */
	    case ('V' - 64):
			    InsMode = !InsMode;
			    Show_Ins();
			    colour(CFG.TextColourF, CFG.TextColourB);
			    Setcursor();
			    /* 
			     * Trap the extra code so it isn't
			     * inserted in the text
			     */
			    if (ch == KEY_INS) 
				Readkey();
			    break;

	    case ('L' - 64):  /* Refresh screen */
			    Refresh();
			    break;

	    case ('R' - 64):  /* Read from file */
			    Syslog('b', "FSEDIT: Read from file");

			    tmpname = calloc(PATH_MAX, sizeof(char));
			    filname = calloc(PATH_MAX, sizeof(char));

			    Enter(1);
			    /* Please enter filename: */
			    pout(YELLOW, BLACK, (char *) Language(245));
			    colour(CFG.InputColourF, CFG.InputColourB);
			    GetstrLC(filname, 80);

			    if ((strcmp(filname, "") == 0)) {
				Enter(2);
				/* No filename entered, aborting */
				pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(246));
				Enter(1);
				Pause();
				free(filname);
				free(tmpname);
				Refresh();
				break;
			    }

			    if (*(filname) == '/' || *(filname) == ' ') {
				Enter(2);
				/* Illegal filename */
				pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(247));
				Enter(1);
				Pause();
				free(tmpname);
				free(filname);
				Refresh();
				break;
			    }

			    snprintf(tmpname, PATH_MAX, "%s/%s/wrk/%s", CFG.bbs_usersdir, exitinfo.Name, filname);
			    if ((fd = fopen(tmpname, "r")) == NULL) {
				WriteError("$Can't open %s", tmpname);
				Enter(2);
				/* File does not exist, please try again */
				pout(CFG.HiliteF, CFG.HiliteB, (char *) Language(296));
				Enter(1);
				Pause();
			    } else {
				while ((fgets(filname, 80, fd)) != NULL) {
				    for (i = 0; i < strlen(filname); i++) {
					if (*(filname + i) == '\0')
					    break;
					if (*(filname + i) == '\n')
					    *(filname + i) = '\0';
					if (*(filname + i) == '\r')
					    *(filname + i) = '\0';
				    }
				    /*
				     * Make sure that any tear or origin lines are
				     * made invalid.
				     */
				    if (strncmp(filname, (char *)"--- ", 4) == 0)
					filname[1] = 'v';
				    if (strncmp(filname, (char *)" * Origin:", 10) == 0)
					filname[1] = '+';
				    snprintf(Message[Line], TEXTBUFSIZE +1, "%s", filname);
				    Line++;
				    if ((Line - 1) == TEXTBUFSIZE)
					break;
				}
				fclose(fd);
				Changed = TRUE;
				Syslog('+', "FSEDIT: Inserted file %s", tmpname);
			    }

			    free(tmpname);
			    free(filname);
			    Col = 1;
			    Refresh();
			    break;

	    case KEY_ESCAPE:  /* Editor menu */
			    Top_Menu();

			    ch = toupper(Readkey());
			    if (ch == 'A' || ch == 'S') {
				Syslog('b', "FSEDIT: %s message (%c)", (ch == 'S' && Changed) ? "Saving" : "Aborting", ch);
				clear();
				chartran_close();
				if (ch == 'S' && Changed) {
				    Syslog('+', "FSEDIT: Message will be saved");
				    return TRUE;
				} else {
				    Syslog('+', "FSEDIT: Message aborted");
				    return FALSE;
				}
			    }

			    if (ch == 'H') {
				Full_Help();
				ch = Readkey();
				Refresh();
			    } else
				Top_Help();

			    colour(CFG.TextColourF, CFG.TextColourB);
			    Setcursor();
			    break;
			
	    default:
			    if ((ch > 31) || traduce((char *)&ch) ) {
				/*
				 *  Normal printable characters or hi-ascii
				 */
				if (Col == strlen(Message[CurRow]) + 1) {
				    /*
				     *  Append to line
				     */
				    snprintf(Message[CurRow] + strlen(Message[CurRow]), 5, "%c", ch);
				    if (strlen(Message[CurRow]) > 79){
					Col = FsWordWrap();
					Row++;
					Refresh();
				    } else {
					Col++;
					PUTCHAR(ch);
				    }
				    Changed = TRUE;
				} else {
				    /*
				     *  Insert or overwrite
				     */
				    if (InsMode) {
					for (i = strlen(Message[CurRow]); i >= (Col-1); i--) {
					    /*
					     * Shift characters right
					     */
					    Message[CurRow][i+1] = Message[CurRow][i];
					}
					Message[CurRow][Col-1] = ch;
					Col++;
					if (strlen(Message[CurRow]) > 80) {
					    i = FsWordWrap();
					    if (Col > strlen(Message[CurRow])+1) {
						Col = Col - strlen(Message[CurRow]);
						if (Col > 1) 
						    Col--;
						Row++;
					    }
					    if (Row > (rows -1))
						ScrollDown();
					    else
						Refresh();
					} else {
					    locate(Row + 1, 1);
					    PUTSTR(Message[CurRow]);
					    Setcursor();
					}
					Changed = TRUE;
				    } else {
					Message[CurRow][Col-1] = ch;
					PUTCHAR(ch);
					Col++;
					Changed = TRUE;
				    }
				}
			    } 
	}
    }

    chartran_close();
    WriteError("FsEdit(): Impossible to be here");
    return FALSE;
}
Ejemplo n.º 17
0
void Uploads()
{
    FILE    *pAreas;
    char    *sAreas;
    int	    Count = 0, i = 0, j, k;
    struct _fdbarea *fdb_area = NULL;

    sAreas = calloc(PATH_MAX, sizeof(char));

    Syslog('+', "Checking for uploads");
    IsDoing("Check uploads");

    if (!do_quiet) {
	mbse_colour(CYAN, BLACK);
	printf("  Checking uploads...\n");
    }

    snprintf(sAreas, PATH_MAX, "%s/etc/fareas.data", getenv("MBSE_ROOT"));
    if ((pAreas = fopen(sAreas, "r")) == NULL) {
	WriteError("$Can't open %s", sAreas);
	free(sAreas);
	return;
    }
    fread(&areahdr, sizeof(areahdr), 1, pAreas);

    while (fread(&area, areahdr.recsize, 1, pAreas) == 1) {

	i++;

	if (CFG.slow_util && do_quiet)
	    msleep(1);

	if ((area.Available) && strlen(area.NewGroup)) {

	    if (!do_quiet) {
		printf("\r  %4d => %-44s", i, area.Name);
		fflush(stdout);
	    }

	    if ((fdb_area = mbsedb_OpenFDB(i, 30))) {
		while (fread(&fdb, fdbhdr.recsize, 1, fdb_area->fp) == 1) {
		    Nopper();
		    if (!fdb.Announced) {
			Syslog('m', "  %d %s", i, fdb.Name);
			memset(&T_File, 0, sizeof(T_File));
			if (strlen(fdb.TicArea))
			    strncpy(T_File.Echo, fdb.TicArea, sizeof(T_File.Echo) -1);
			else
			    snprintf(T_File.Echo, 21, "AREA %d", i);
			strncpy(T_File.Group, area.NewGroup, sizeof(T_File.Group) -1);
			strncpy(T_File.Comment, area.Name, sizeof(T_File.Comment) -1);
			strncpy(T_File.Name, fdb.Name, sizeof(T_File.Name) -1);
			strncpy(T_File.LName, fdb.LName, sizeof(T_File.LName) -1);
			if (strlen(fdb.Magic))
			    strncpy(T_File.Magic, fdb.Magic, sizeof(T_File.Magic) -1);
			T_File.Size = fdb.Size;
			T_File.SizeKb = fdb.Size / 1024;
			T_File.Fdate = fdb.FileDate;
			snprintf(T_File.Crc, 9, "%08x", fdb.Crc32);
			snprintf(T_File.Desc, 256, "%s %s %s %s", fdb.Desc[0], fdb.Desc[1], fdb.Desc[2], fdb.Desc[3]);
			k = 0;
			for (j = 0; j < 25; j++) {
			    if (strlen(fdb.Desc[j])) {
				snprintf(T_File.LDesc[k], 49, "%s", fdb.Desc[j]);
				T_File.LDesc[k][48] = '\0';
				k++;
			    }
			}
			T_File.TotLdesc = k;
			T_File.Announce = TRUE;
			if (Add_ToBeRep(T_File))
			    Count++;
			/*
			 * Mark file is announced.
			 */
			fdb.Announced = TRUE;
			if (mbsedb_LockFDB(fdb_area, 30)) {
			    fseek(fdb_area->fp, - fdbhdr.recsize, SEEK_CUR);
			    fwrite(&fdb, fdbhdr.recsize, 1, fdb_area->fp);
			    mbsedb_UnlockFDB(fdb_area);
			}
		    }
		}

		mbsedb_CloseFDB(fdb_area);
	    }
	}
    }

    if (!do_quiet) {
	printf("\r                                                      \r");
	if (Count)
	    printf("  %d new uploads\n", Count);
	fflush(stdout);
    }

    if (Count)
	Syslog('+', "%d new uploads", Count);
	
    fclose(pAreas);
    free(sAreas);
}
Ejemplo n.º 18
0
/*
 * Process one message from message packet.
 *
 *  0   - no more messages
 *  1   - more messages
 *  2   - bad file
 *  3   - bad message header
 *  4   - unable to open temp file
 *  5   - unexpected end of packet
 *  >10 - import error
 */
int getmessage(FILE *pkt, faddr *p_from, faddr *p_to)
{
    char	    buf[MAX_LINE_LENGTH +1], *orig = NULL, *p, *l, *r, *subj = NULL;
    int		    tmp, rc, maxrc = 0, result, flags, cost;
    static faddr    f, t;
    faddr	    *o;
    time_t	    mdate = 0L;
    FILE	    *fp;
    unsigned char   buffer[0x0e];

    Nopper();

    result = fread(&buffer, 1, sizeof(buffer), pkt);
    if (result == 0) {
	Syslog('m', "Zero bytes message, assume end of pkt");
	return 0;
    }

    switch (tmp = (buffer[0x01] << 8) + buffer[0x00]) {
	case 0:	if (result == 2)
		    return 0;
		else {
		    Syslog('!', "Junk after logical end of packet, skipped");
		    return 5;

		}
	case 2:	break;

	default:Syslog('!', "bad message type: 0x%04x",tmp);
		return 2;
    }

    if (result != 14) {
	Syslog('!', "Unexpected end of packet");
	return 5;
    }

    memset(&f, 0, sizeof(f));
    memset(&t, 0, sizeof(t));
    f.node = (buffer[0x03] << 8) + buffer[0x02];
    t.node = (buffer[0x05] << 8) + buffer[0x04];
    f.net  = (buffer[0x07] << 8) + buffer[0x06];
    t.net  = (buffer[0x09] << 8) + buffer[0x08];
    flags  = (buffer[0x0b] << 8) + buffer[0x0a];
    cost   = (buffer[0x0d] << 8) + buffer[0x0c];

    /*
     * Read the DateTime, toUserName, fromUserName and subject fields
     * from the packed message. The stringlength is +1 for the right
     * check. This is different then in ifmail's original code.
     */
    if (aread(buf, sizeof(buf)-1, pkt)) {
	if (strlen(buf) > 20)
	    Syslog('!', "date too long (%d) \"%s\"", strlen(buf), printable(buf, 0));
	mdate = parsefdate(buf, NULL);
	if (aread(buf, sizeof(buf)-1, pkt)) {
	    Syslog('!', "date not null-terminated: \"%s\"",buf);
	    return 3;
	}
    }

    if (aread(buf, sizeof(buf)-1, pkt)) {
	if (strlen(buf) > 36)
	    Syslog('!', "to name too long (%d) \"%s\"", strlen(buf), printable(buf, 0));
	t.name = xstrcpy(buf);
	if (aread(buf, sizeof(buf)-1, pkt)) {
	    if (*(p=t.name+strlen(t.name)-1) == '\n')
		*p = '\0';
	    Syslog('!', "to name not null-terminated: \"%s\"",buf);
	    return 3;
	}
    }

    if (aread(buf, sizeof(buf)-1, pkt)) {
	if (strlen(buf) > 36)
	    Syslog('!', "from name too long (%d) \"%s\"", strlen(buf), printable(buf, 0));
	f.name = xstrcpy(buf);
	if (aread(buf, sizeof(buf)-1, pkt)) {
	    if (*(p=f.name+strlen(f.name)-1) == '\n') 
		*p = '\0';
	    Syslog('!', "from name not null-terminated: \"%s\"",buf);
	    return 3;
	}
    }
	
    if (aread(buf, sizeof(buf)-1, pkt)) {
	if (strlen(buf) > 72)
	    Syslog('!', "subject too long (%d) \"%s\"", strlen(buf), printable(buf, 0));
	subj = xstrcpy(buf);
	if (aread(buf, sizeof(buf)-1, pkt)) {
	    if (*(p=subj+strlen(subj)-1) == '\n') 
		*p = '\0';
	    subj = xstrcat(subj,(char *)"\\n");
	    subj = xstrcat(subj,buf);
	    Syslog('!', "subj not null-terminated: \"%s\"",buf);
	    return 3;
	}
    }

    if (feof(pkt) || ferror(pkt)) {
	Syslog('!', "Could not read message header, aborting");
	return 3;
    }

    if ((fp = tmpfile()) == NULL) {
	WriteError("$unable to open temporary file");
	return 4;
    }

    /*
     * Read the text from the .pkt file
     */
    while (aread(buf,sizeof(buf)-1,pkt)) {

	fputs(buf, fp);

	/*
	 * Extract info from Origin line if found.
	 */
	if (!strncmp(buf," * Origin:",10)) {
	    p=buf+10;
	    while (*p == ' ') 
		p++;
	    if ((l=strrchr(p,'(')) && (r=strrchr(p,')')) && (l < r)) {
		*l = '\0';
		*r = '\0';
		l++;
		if ((o = parsefnode(l))) {
		    f.point = o->point;
		    f.node = o->node;
		    f.net = o->net;
		    f.zone = o->zone;
		    if (o->domain) 
			f.domain=o->domain;
		    o->domain=NULL;
		    tidy_faddr(o);
		}
	    } else
		if (*(l=p+strlen(p)-1) == '\n')
		    *l='\0';
		for (l=p+strlen(p)-1;*l == ' ';l--) 
		    *l='\0'; 
		orig = xstrcpy(p);
	}
    }

    rc = importmsg(p_from, &f, &t, orig, subj, mdate, flags, cost, fp, p_to->zone);
    if (rc)
	rc+=10;
    if (rc > maxrc) 
	maxrc = rc;

    fclose(fp);

    if(f.name) 
	free(f.name); 
    f.name=NULL;

    if(t.name) 
	free(t.name); 
    t.name=NULL;

    if(f.domain) 
	free(f.domain); 
    f.domain=NULL;

    if(t.domain) 
	free(t.domain); 
    t.domain=NULL;

    if (subj)
	free(subj);
    subj = NULL;

    if (orig)
	free(orig);
    orig = NULL;

    if (feof(pkt) || ferror(pkt)) {
	WriteError("Unexpected end of packet");
	return 5;
    }
    return 1;
}