Exemplo n.º 1
0
Arquivo: nftw.c Projeto: vocho/openqnx
static int directory(struct nftw *state, struct stat64 *st)
{
struct dirent64	*dp;
#ifndef FTW_USE_SEEKDIR
struct dirent64	*cached;
#endif
int				prefix, result;

	if ((result = enterdir(state)) == 0) {
		if ((state->flags & FTW_DEPTH) || ((result = (*state->invoke)(state, st, (!(state->flags & FTW_CHDIR) || eaccess(state->pathname, X_OK) != -1) ? FTW_D : FTW_DNR)) == 0 && state->action != FTW_SKD)) {
			if (!(state->flags & FTW_CHDIR) || (result = chdir(state->pathname)) == 0) {
				state->stem += strlen(&state->pathname[prefix = state->stem]) + (state->stem != 0 ? 1 : 0);
				++state->depth;
#ifdef FTW_USE_SEEKDIR
				while ((result = direntry(state, state->dirs, &dp)) == 0 && dp != NULL) {
					if ((result = process(state, dp)) != 0 || state->action == FTW_SKR)
						break;
					if (state->dirs->dir == NULL && (result = unspillfds(state, &state->pathname[(state->stem > 1) ? state->stem - 1 : 1])) != 0)
						break;
				}
#else
				while ((result = direntry(state, state->dirs, &dp)) == 0 && dp != NULL) {
					if ((result = process(state, dp)) != 0 || state->action == FTW_SKR)
						break;
					if (state->dirs->dir == NULL) {
						if ((cached = state->dirs->contents) != NULL) {
							do {
								if ((result = process(state, cached)) != 0 || state->action == FTW_SKR)
									break;
							} while ((cached = (struct dirent64 *)((char *)cached + cached->d_reclen)) < (struct dirent64 *)((char *)state->dirs->contents + state->dirs->size));
						}
						break;
					}
				}
#endif
				--state->depth;
				state->pathname[(state->stem > 1) ? state->stem - 1 : 1] = '\0', state->stem = prefix;
				if (result == 0 && (!(state->flags & FTW_CHDIR) || (result = cd(state, &state->pathname[(prefix > 1) ? prefix - 1 : 1])) == 0)) {
					if (state->flags & FTW_DEPTH)
						result = (*state->invoke)(state, st, FTW_DP);
				}
			}
			else if (errno == EACCES) {
				result = (state->flags & FTW_DEPTH) ? (*state->invoke)(state, st, FTW_DNR) : 0;
			}
			else {
				state->error = errno;
			}
		}
		exitdir(state);
	}
	else if (state->error == EACCES) {
		result = (*state->invoke)(state, st, FTW_DNR);
	}
	return(result);
}
Exemplo n.º 2
0
int showout()
{
	int     i, i2 = 0;
	char    foo[1024];
	char    tmpfile[STRLEN];
	char    buf[20];
	int     notreload = 0;
	GOPHER  newitem;
	while (1)
	{
		if (gopher_position < 0)
		{
			return;
		}
		print_gophertitle();
		printgopher_title();
		update_endline();
		if (!notreload)
		{
			i = 0;
			if (get_con(g_main[gopher_position]->server, g_main[gopher_position]->port) == -1)
			{
				show_message(NULL);
				free(g_main[gopher_position]);
				gopher_position--;
				notreload = 0;
				continue;
			}
			enterdir(g_main[gopher_position]->file);
			show_message("¶Áȡ׼±¸ÖÐ");
			for (i = 0; i < MAXGOPHERITEMS; i++)
			{
				if (readfield(a, foo, 1024) <= 0)
				{
					break;
				}
				if (foo[0] == '.' && foo[1] == '\r' && foo[2] == '\n')
				{
					break;
				}
				strncpy(newitem.title, foo, 70);
				if (readfield(a, foo, 1024) == 0)
				{
					break;
				}
				strncpy(newitem.file, foo, 80);
				if (readfield(a, foo, 1024) == 0)
				{
					break;
				}
				strncpy(newitem.server, foo, 40);
				if (readline(a, foo, 1024) == 0)
				{
					break;
				}
				newitem.port = atoi(foo);
				if (newitem.title[0] != newitem.file[0])
				{
					break;
				}
				if (newitem.title[0] != '0' && newitem.title[0] != '1')
				{
					i--;
					continue;
				}
				refresh();
				append_record(gophertmpfile, &newitem, sizeof(GOPHER));
				sprintf(buf, "[1;3%dmת[3%dm»»[3%dm×Ê[3%dmÁÏ[3%dmÖÐ", (i % 7) + 1
				        ,((i + 1) % 7) + 1, ((i + 2) % 7) + 1, ((i + 3) % 7) + 1, ((i + 4) % 7) + 1);
				show_message(buf);
			}
			show_message(NULL);
		}
		else
			notreload = 0;
		if (i <= 0)
		{
			move(3, 0);
			clrtobot();
			move(10, 0);
			clrtoeol();
			prints("                             ûÓÐÈκεÄ×ÊÁÏ...");
			pressanykey();
			free(g_main[gopher_position]);
			gopher_position--;
			continue;
		}
		close(a);
		move(0, 0);
		clrtobot();
		setlistrange(i);
		i2 = choose(NA, g_main[gopher_position]->position, print_gophertitle, deal_gopherkey, show_gopher, do_gopher);
		if (i2 == -1)
		{
			free(g_main[gopher_position]);
			clear_gophertmpfile();
			gopher_position--;
			continue;
		}
		g_main[gopher_position]->position = i2;
		get_record(gophertmpfile, &newitem, sizeof(GOPHER), i2 + 1);
		tmpitem = &newitem;
		if (newitem.title[0] == '0')
		{
			if (get_con(newitem.server, newitem.port) == -1)
				continue;
			enterdir(newitem.file);
			setuserfile(tmpfile, "gopher.tmp");
			savetmpfile(tmpfile);
			ansimore(tmpfile, YEA);
			notreload = 1;
			unlink(tmpfile);
			continue;
		}
		else
		{
			GOPHER *newgi;
			clear_gophertmpfile();
			gopher_position++;
			newgi = (GOPHER *) malloc(sizeof(GOPHER));
			strncpy(newgi->server, tmpitem->server, 40);
			strncpy(newgi->file, tmpitem->file, 80);
			strncpy(newgi->title, tmpitem->title, 70);
			newgi->port = tmpitem->port;
			newgi->position = 0;
			g_main[gopher_position] = newgi;
			continue;
		}
	}
}
Exemplo n.º 3
0
int deal_gopherkey(char ch, int allnum, int pagenum)
{
	char    fname[STRLEN], fpath[STRLEN];
#ifdef INTERNET_EMAIL

	struct shortfile fhdr;
#endif

	switch (ch)
	{
	case 'h':
	case 'H':
		show_help("help/announcereadhelp");
		g_refresh();
		break;
	case 'E':
	case 'e':
		tmpitem = nth_item(allnum - pagenum);
		setuserfile(fname, "gopher.tmp");
		if (tmpitem->title[0] != '0')
		{
			return 1;
		}
		if (get_con(tmpitem->server, tmpitem->port) == -1)
			return 1;
		enterdir(tmpitem->file);
		savetmpfile(fname);
		if (dashf(fname))
		{
			vedit(fname, NA, YEA);
			unlink(fname);
			g_refresh();
		}
		show_message(NULL);
		break;
	case '=':
		{
			tmpitem = nth_item(allnum - pagenum);
			move(2, 0);
			clrtobot();
			prints("");
			printdash("BBS Gopher Îï¼þ»ù±¾×ÊÁÏ");
			prints("");
			prints("ÀàÐÍ£º%c (%s)\n", tmpitem->title[0], (tmpitem->title[0] == '0') ? "Îļþ" : "Ŀ¼");
			prints("±êÌ⣺%s\n", tmpitem->title + 1);
			prints("·¾¶£º%s\n", tmpitem->file);
			prints("λÖãº%s\n", tmpitem->server);
			prints("ʹÓãº%d²º\n", tmpitem->port);
			pressanykey();
			g_refresh();
		}
		break;
	case Ctrl('P'):
					tmpitem = nth_item(allnum - pagenum);
		if (!HAS_PERM(PERM_POST))
			break;
		setuserfile(fname, "gopher.tmp");
		if (tmpitem->title[0] != '0')
{
			return 1;
		}
		if (get_con(tmpitem->server, tmpitem->port) == -1)
			return 1;
		enterdir(tmpitem->file);
		savetmpfile(fname);
		if (dashf(fname))
		{
			char    bname[30];
			clear();
			if (get_a_boardname(bname, "ÇëÊäÈëҪתÌùµÄÌÖÂÛÇøÃû³Æ: "))
			{
				move(1, 0);
				sprintf(fpath, "ÄãÈ·¶¨Òª×ªÌùµ½ %s °åÂð", bname);
				if (askyn(fpath, NA, NA) == 1)
				{
					move(2, 0);
					Postfile(fname, bname, tmpitem->title + 1, 2);
					sprintf(fpath, "ÒѾ­°ïÄãתÌùµ½ %s °åÁË...", bname);
					prints(fpath);
					refresh();
					sleep(1);
				}
			}
		}
		unlink(fname);
		g_refresh();
		return 1;
#ifdef INTERNET_EMAIL

	case 'U':
	case 'F':
	case 'u':
	case 'f':
	case 'z':
	case 'Z':
		tmpitem = nth_item(allnum - pagenum);
		setuserfile(fname, "gopher.tmp");
		if (tmpitem->title[0] != '0')
		{
			return 1;
		}
		if (get_con(tmpitem->server, tmpitem->port) == -1)
			return 1;
		enterdir(tmpitem->file);
		savetmpfile(fname);
		if (dashf(fname))
		{
			strncpy(fhdr.title, tmpitem->title + 1, 70);
			strncpy(fhdr.filename, "gopher.tmp", STRLEN);
			sethomepath(fpath, currentuser.userid);
			//			if (ch == 'Z' || ch == 'z')
			//				a_download(fname);
			//			else {
			switch (doforward(fpath, &fhdr, (ch == 'u' || ch == 'U') ? 1 : 0))
			{
			case 0:
				show_message("ÎÄÕÂת¼ÄÍê³É!");
				break;
			case -1:
				show_message("system error!!.");
				break;
			case -2:
				show_message("invalid address.");
				break;
			default:
				show_message("È¡Ïûת¼Ä¶¯×÷.");
			}
			//			}
			refresh();
			pressanykey();
			g_refresh();
			unlink(fname);
			return 1;
		}
		else
			return 1;
		break;
#endif

	default:
		return 0;
	}
	return 1;
}