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); }
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ÖÐ[m", (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(" [1;31mûÓÐÈκεÄ×ÊÁÏ...[m"); 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; } } }
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("[1;44;37m"); printdash("BBS Gopher Îï¼þ»ù±¾×ÊÁÏ"); prints("[m"); 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, "[1mÒѾ°ïÄãתÌùµ½ %s °åÁË...[m", 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; }