/* return: 0 - unchanged, 1 - changed, -1 - overflow (unchanged) */ static int expand(char **outbuf, char *inbuf) { char *inpstr; char *outstr; char c; char *temp; int changed = 0; int tempsz, xtra, offset; xtra = strlen(fnames[fnum]) + strlen(shell_line) + 1; tempsz = 200 + xtra; temp = xmalloc(tempsz); inpstr = inbuf; outstr = temp; while ((c = *inpstr++) != '\0') { offset = outstr - temp; if (tempsz - offset - 1 < xtra) { tempsz += 200 + xtra; temp = xrealloc(temp, tempsz); outstr = temp + offset; } switch (c) { case '%': if (!no_intty) { strcpy(outstr, fnames[fnum]); outstr += strlen(fnames[fnum]); changed++; } else *outstr++ = c; break; case '!': if (!shellp) more_error(_ ("No previous command to substitute for")); strcpy(outstr, shell_line); outstr += strlen(shell_line); changed++; break; case '\\': if (*inpstr == '%' || *inpstr == '!') { *outstr++ = *inpstr++; break; } /* fallthrough */ default: *outstr++ = c; } } *outstr++ = '\0'; *outbuf = temp; return (changed); }
int main(int argc, char* argv[]) { int listenfd, connfd; socklen_t clientlen; struct sockaddr_in clientaddr; struct hostent *hp; char *haddrp; fd_set read_set, ready_set; if (argc != 2) { more_error("usage: %s <port>", argv[0]); } Signal(SIGCHLD, sigchld_handler); listenfd = Open_listenfd(atoi(argv[1])); FD_ZERO(&read_set); FD_SET(STDIN_FILENO, &read_set); FD_SET(listenfd, &read_set); while (1) { ready_set = read_set; Select(listenfd + 1, &ready_set, NULL, NULL, NULL); if (FD_ISSET(STDIN_FILENO, &ready_set)) { command(); } else if (FD_ISSET(listenfd, &ready_set)) { clientlen = sizeof(clientaddr); connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); /* printf("%#x\n", ntohl(clientaddr.sin_addr.s_addr)); */ hp = Gethostbyaddr((const void *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); haddrp = inet_ntoa(clientaddr.sin_addr); printf("Server connected to %s [%s]\n", hp->h_name, haddrp); if (Fork() == 0) { Close(listenfd); echo(connfd); Close(connfd); exit(0); } Close(connfd); } } return 0; }
static void ttyin(char buf[], register int nmax, char pchar) { char *sp; int c; int slash = 0; int maxlen; sp = buf; maxlen = 0; while (sp - buf < nmax) { if (promptlen > maxlen) maxlen = promptlen; c = readch(); if (c == '\\') { slash++; } else if (((cc_t) c == otty.c_cc[VERASE]) && !slash) { if (sp > buf) { #ifdef HAVE_WIDECHAR if (MB_CUR_MAX > 1) { wchar_t wc; size_t pos = 0, mblength; mbstate_t state, state_bak; memset(&state, '\0', sizeof(mbstate_t)); while (1) { state_bak = state; mblength = mbrtowc(&wc, buf + pos, sp - buf, &state); state = (mblength == (size_t)-2 || mblength == (size_t)-1) ? state_bak : state; mblength = (mblength == (size_t)-2 || mblength == (size_t)-1 || mblength == 0) ? 1 : mblength; if (buf + pos + mblength >= sp) break; pos += mblength; } if (mblength == 1) { ERASEONECOLUMN(docrterase); } else { int wc_width; wc_width = wcwidth(wc); wc_width = (wc_width < 1) ? 1 : wc_width; while (wc_width--) { ERASEONECOLUMN(docrterase); } } while (mblength--) { --promptlen; --sp; } } else #endif /* HAVE_WIDECHAR */ { --promptlen; ERASEONECOLUMN(docrterase); --sp; } if ((*sp < ' ' && *sp != '\n') || *sp == RUBOUT) { --promptlen; ERASEONECOLUMN(docrterase); } continue; } else { if (!eraseln) promptlen = maxlen; siglongjmp(restore, 1); } } else if (((cc_t) c == otty.c_cc[VKILL]) && !slash) { if (hard) { show(c); putchar('\n'); putchar(pchar); } else { putchar('\r'); putchar(pchar); if (eraseln) erasep(1); else if (docrtkill) while (promptlen-- > 1) putserr(BSB); promptlen = 1; } sp = buf; fflush(stdout); continue; } if (slash && ((cc_t) c == otty.c_cc[VKILL] || (cc_t) c == otty.c_cc[VERASE])) { ERASEONECOLUMN(docrterase); --sp; } if (c != '\\') slash = 0; *sp++ = c; if ((c < ' ' && c != '\n' && c != ESC) || c == RUBOUT) { c += (c == RUBOUT) ? -0100 : 0100; putserr(CARAT); promptlen++; } if (c != '\n' && c != ESC) { putcerr(c); promptlen++; } else break; } *--sp = '\0'; if (!eraseln) promptlen = maxlen; if (sp - buf >= nmax - 1) more_error(_("Line too long")); }