/* Read +COMMENT, add to menu and blacklist */ static int add_item(char *path, char *comment) { char *p; ListItem *newmenu; if(blacklist(path,FIND)) return(0); blacklist(path,ENTER); newmenu=(ListItem *)realloc(menu, sizeof(ListItem)*(menulen+1)); if(newmenu==NULL) return(-1); menu=newmenu; p=strrchr(path,'/'); if(p==NULL) p=path; else p++; menu[menulen].ITEM_PROMPT=strdup(p); menu[menulen].ITEM_CHECKED=0; menu[menulen].text=""; menu[menulen].ITEM_DATA=strdup(comment); menulen++; return(0); }
static void openal_scanrender(void) { WCHAR name[MAX_PATH]; ALCdevice *dev; const ALCchar *devstr, *defaultstr; int defblacklisted; EnterCriticalSection(&openal_crst); if (palcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT")) { defaultstr = palcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER); devstr = palcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); } else { defaultstr = palcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); devstr = palcGetString(NULL, ALC_DEVICE_SPECIFIER); } pulse_fixup(devstr, &defaultstr, 1); defblacklisted = blacklist(defaultstr); if (defblacklisted) WARN("Disabling blacklist because %s is blacklisted\n", defaultstr); if (devstr) for (; *devstr; devstr += strlen(devstr)+1) { MMDevice *mmdev; MultiByteToWideChar( CP_UNIXCP, 0, devstr, -1, name, sizeof(name)/sizeof(*name)-1 ); name[sizeof(name)/sizeof(*name)-1] = 0; /* Only enable blacklist if the default device isn't blacklisted */ if (!defblacklisted && blacklist(devstr)) { WARN("Not adding %s: device is blacklisted\n", devstr); continue; } TRACE("Adding %s\n", devstr); dev = palcOpenDevice(devstr); MMDevice_Create(&mmdev, name, NULL, eRender, dev ? DEVICE_STATE_ACTIVE : DEVICE_STATE_NOTPRESENT, !strcmp(devstr, defaultstr)); if (dev) { ALint freq = 44100; palcGetIntegerv(dev, ALC_FREQUENCY, 1, &freq); openal_setformat(mmdev, freq); palcCloseDevice(dev); } else WARN("Could not open device: %04x\n", palcGetError(NULL)); } LeaveCriticalSection(&openal_crst); }
void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString) { _state = Finished; if (_item->_isRestoration) { if( status == SyncFileItem::Success || status == SyncFileItem::Conflict) { status = SyncFileItem::Restoration; } else { _item->_errorString += tr("; Restoration Failed: %1").arg(errorString); } } else { if( _item->_errorString.isEmpty() ) { _item->_errorString = errorString; } } if( _propagator->_abortRequested.fetchAndAddRelaxed(0) && (status == SyncFileItem::NormalError || status == SyncFileItem::FatalError)) { // an abort request is ongoing. Change the status to Soft-Error status = SyncFileItem::SoftError; } switch( status ) { case SyncFileItem::SoftError: case SyncFileItem::FatalError: // do not blacklist in case of soft error or fatal error. break; case SyncFileItem::NormalError: if (blacklist(_propagator->_journal, *_item) && _item->_hasBlacklistEntry) { // do not error if the item was, and continues to be, blacklisted status = SyncFileItem::FileIgnored; _item->_errorString.prepend(tr("Continue blacklisting:") + " "); } break; case SyncFileItem::Success: case SyncFileItem::Restoration: if( _item->_hasBlacklistEntry ) { // wipe blacklist entry. _propagator->_journal->wipeErrorBlacklistEntry(_item->_file); // remove a blacklist entry in case the file was moved. if( _item->_originalFile != _item->_file ) { _propagator->_journal->wipeErrorBlacklistEntry(_item->_originalFile); } } break; case SyncFileItem::Conflict: case SyncFileItem::FileIgnored: case SyncFileItem::NoStatus: // nothing break; } _item->_status = status; emit itemCompleted(*_item, *this); emit finished(status); }
/** Transform determination. Usage of RANSAC to robustly estimate transformation between two point set ys @param initMatchL: Input CvPoints for Destination Image @param initMatchR: Input CvPoints for Source Image @param noMatch: Number of Points @param inliersL: Robust estimation of motion parameters for Destination Image @param inliersR: Robust estimation of motion parameters for Source Image @param srcIm: Source Image @param dstIm: Destination Image @return noInliers values */ Mat InterframeRegister::RunRansac(vector <Point2f> initMatchL, vector <Point2f> initMatchR, int noMatch,vector <Point2d> inliersL, vector <Point2d> inliersR, Mat srcIm, Mat dstIm) { // number of test samples if(noMatch <= InterframeRegister::RANSAC_SAMPLE_SIZE) return Mat(); // sanity check // array of random indices {0,1,2 ... noMatch} static vector<int> randNumbs(RANSAC_SAMPLE_SIZE); vector<int> blacklist(noMatch); Mat thisH (2,3,CV_64FC1); double minErr = noMatch*MATCH_ERR_THRESH; double maxdist = 0; int noInliers = 0; // number of inliers vector<int> matchInd (noMatch); int blcnt = 0; // randomizer int stime = (unsigned) time(NULL)/2; srand(stime); for (int j = 0; j < noMatch; j++) { blacklist[j] = -1; } // iterate over the number of samples vector <Point2d> selMatchL(RANSAC_SAMPLE_SIZE); vector <Point2d> selMatchR(RANSAC_SAMPLE_SIZE); for (int numSamples = 0; numSamples < RANSAC_ITER; numSamples++) { // make a random subset of entries from 0 to noMatch-1 randNumbs = GetRandomSubset(noMatch, RANSAC_SAMPLE_SIZE, blacklist, blcnt); double sumErr = 0.0; for(int i = 0; i < RANSAC_SAMPLE_SIZE; i++) { selMatchL[i] = initMatchL[randNumbs[i]]; selMatchR[i] = initMatchR[randNumbs[i]]; } // get the affine matrix that best matches this switch(MODEL) { case AFFINE: getAffine(selMatchL,selMatchR,thisH,RANSAC_SAMPLE_SIZE); break; default: throw; break; } } return thisH; }
static void openal_scancapture(void) { WCHAR name[MAX_PATH]; ALCdevice *dev; const ALCchar *devstr, *defaultstr; int defblacklisted; EnterCriticalSection(&openal_crst); devstr = palcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); defaultstr = palcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); pulse_fixup(devstr, &defaultstr, 0); defblacklisted = blacklist(defaultstr); if (defblacklisted) WARN("Disabling blacklist because %s is blacklisted\n", defaultstr); if (devstr && *devstr) for (; *devstr; devstr += strlen(devstr)+1) { MMDevice *mmdev; ALint freq = 44100; MultiByteToWideChar( CP_UNIXCP, 0, devstr, -1, name, sizeof(name)/sizeof(*name)-1 ); name[sizeof(name)/sizeof(*name)-1] = 0; if (!defblacklisted && blacklist(devstr)) { WARN("Not adding %s: device is blacklisted\n", devstr); continue; } TRACE("Adding %s\n", devstr); dev = palcCaptureOpenDevice(devstr, freq, AL_FORMAT_MONO16, 65536); MMDevice_Create(&mmdev, name, NULL, eCapture, dev ? DEVICE_STATE_ACTIVE : DEVICE_STATE_NOTPRESENT, !strcmp(devstr, defaultstr)); if (dev) { openal_setformat(mmdev, freq); palcCaptureCloseDevice(dev); } else WARN("Could not open device: %04x\n", palcGetError(NULL)); } LeaveCriticalSection(&openal_crst); }
void getstr(char *buf, int cnt, const char *error) { char c; do { if (read(STDIN_FILENO, &c, 1) != 1) exit(1); *buf++ = c; if (--cnt == 0) { #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "buffer overflow"); #endif rshd_errx(1, "%s too long", error); } } while (c != 0); }
std::size_t ACODrop(SRGGraph& g, std::vector<bool>& relays, std::vector<std::size_t>& dropped, PheromoneMatrix &p, RanGen &gen) { std::size_t numRels(relays.size()), blackListed(0), terminals(0); for(int i=0; i<relays.size(); ++i) relays[i]=true; std::vector<std::size_t> relDegree(relays.size(),0); std::vector<bool> blacklist(relays.size(),false); for(int i=0; i<relays.size(); ++i) if(relays[i]) for(std::list<SRGGraph::Edge>::iterator j = g[i].edges.begin(); j!= g[i].edges.end(); ++j) ++relDegree[j->dest]; int cur = relays.size(); do { //choose next node using pheromone matrix float magicNumber = float(gen.get())/0x3fffffff; //make prefixes... tomorrow! std::vector<float> options; std::vector<std::size_t> indexes; options.reserve(relays.size()); indexes.reserve(relays.size()); float sum = 0; for(int i=0; i<relays.size();++i) { //do the whole selection in here (first choice exceptional case)... if(blacklist[i] || !relays[i]) continue; if(numRels == relays.size()) sum += p.init(i)/relDegree[i]; else sum += p[cur][i]/relDegree[i]; options.push_back(sum); //inclusive prefix sum indexes.push_back(i); } magicNumber *= sum; for(cur=0; magicNumber > options[cur]; ++cur); cur = indexes[cur]; //drop and see if connected relays[cur] = false; if(g.biConnected(relays)) //but then it won't matter as this is O(n^3) { --numRels; for(std::list<SRGGraph::Edge>::iterator j = g[cur].edges.begin(); j!= g[cur].edges.end(); ++j) --relDegree[j->dest]; //decrease key? dropped.push_back(cur); } else { relays[cur] = true; blacklist[cur] = true; ++blackListed; } } while(blackListed < numRels); return numRels; }
void doit(struct sockaddr *fromp) { extern char *__rcmd_errstr; /* syslog hook from libc/net/rcmd.c. */ struct passwd *pwd; u_short port; fd_set ready, readfrom; int cc, fd, nfd, pv[2], pid, s; int one = 1; const char *cp, *errorstr; char sig, buf[BUFSIZ]; char *cmdbuf, luser[16], ruser[16]; char rhost[2 * MAXHOSTNAMELEN + 1]; char numericname[INET6_ADDRSTRLEN]; int af, srcport; int maxcmdlen; login_cap_t *lc; maxcmdlen = (int)sysconf(_SC_ARG_MAX); if (maxcmdlen <= 0 || (cmdbuf = malloc(maxcmdlen)) == NULL) exit(1); (void) signal(SIGINT, SIG_DFL); (void) signal(SIGQUIT, SIG_DFL); (void) signal(SIGTERM, SIG_DFL); af = fromp->sa_family; srcport = ntohs(*((in_port_t *)&fromp->sa_data)); if (af == AF_INET) { inet_ntop(af, &((struct sockaddr_in *)fromp)->sin_addr, numericname, sizeof numericname); } else if (af == AF_INET6) { inet_ntop(af, &((struct sockaddr_in6 *)fromp)->sin6_addr, numericname, sizeof numericname); } else { syslog(LOG_ERR, "malformed \"from\" address (af %d)", af); exit(1); } #ifdef IP_OPTIONS if (af == AF_INET) { u_char optbuf[BUFSIZ/3]; socklen_t optsize = sizeof(optbuf), ipproto, i; struct protoent *ip; if ((ip = getprotobyname("ip")) != NULL) ipproto = ip->p_proto; else ipproto = IPPROTO_IP; if (!getsockopt(0, ipproto, IP_OPTIONS, optbuf, &optsize) && optsize != 0) { for (i = 0; i < optsize; ) { u_char c = optbuf[i]; if (c == IPOPT_LSRR || c == IPOPT_SSRR) { syslog(LOG_NOTICE, "connection refused from %s with IP option %s", numericname, c == IPOPT_LSRR ? "LSRR" : "SSRR"); exit(1); } if (c == IPOPT_EOL) break; i += (c == IPOPT_NOP) ? 1 : optbuf[i+1]; } } } #endif if (srcport >= IPPORT_RESERVED || srcport < IPPORT_RESERVED/2) { syslog(LOG_NOTICE|LOG_AUTH, "connection from %s on illegal port %u", numericname, srcport); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "illegal port"); #endif exit(1); } (void) alarm(60); port = 0; s = 0; /* not set or used if port == 0 */ for (;;) { char c; if ((cc = read(STDIN_FILENO, &c, 1)) != 1) { if (cc < 0) syslog(LOG_NOTICE, "read: %m"); shutdown(0, SHUT_RDWR); exit(1); } if (c == 0) break; port = port * 10 + c - '0'; } (void) alarm(0); if (port != 0) { int lport = IPPORT_RESERVED - 1; s = rresvport_af(&lport, af); if (s < 0) { syslog(LOG_ERR, "can't get stderr port: %m"); exit(1); } if (port >= IPPORT_RESERVED || port < IPPORT_RESERVED/2) { syslog(LOG_NOTICE|LOG_AUTH, "2nd socket from %s on unreserved port %u", numericname, port); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "unreserved port"); #endif exit(1); } *((in_port_t *)&fromp->sa_data) = htons(port); if (connect(s, fromp, fromp->sa_len) < 0) { syslog(LOG_INFO, "connect second port %d: %m", port); exit(1); } } errorstr = NULL; realhostname_sa(rhost, sizeof(rhost) - 1, fromp, fromp->sa_len); rhost[sizeof(rhost) - 1] = '\0'; /* XXX truncation! */ (void) alarm(60); getstr(ruser, sizeof(ruser), "ruser"); getstr(luser, sizeof(luser), "luser"); getstr(cmdbuf, maxcmdlen, "command"); (void) alarm(0); pam_err = pam_start("rsh", luser, &pamc, &pamh); if (pam_err != PAM_SUCCESS) { syslog(LOG_ERR|LOG_AUTH, "pam_start(): %s", pam_strerror(pamh, pam_err)); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "login incorrect"); #endif rshd_errx(1, "Login incorrect."); } if ((pam_err = pam_set_item(pamh, PAM_RUSER, ruser)) != PAM_SUCCESS || (pam_err = pam_set_item(pamh, PAM_RHOST, rhost)) != PAM_SUCCESS) { syslog(LOG_ERR|LOG_AUTH, "pam_set_item(): %s", pam_strerror(pamh, pam_err)); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "login incorrect"); #endif rshd_errx(1, "Login incorrect."); } pam_err = pam_authenticate(pamh, 0); if (pam_err == PAM_SUCCESS) { if ((pam_err = pam_get_user(pamh, &cp, NULL)) == PAM_SUCCESS) { strncpy(luser, cp, sizeof(luser)); luser[sizeof(luser) - 1] = '\0'; /* XXX truncation! */ } pam_err = pam_acct_mgmt(pamh, 0); } if (pam_err != PAM_SUCCESS) { syslog(LOG_INFO|LOG_AUTH, "%s@%s as %s: permission denied (%s). cmd='%.80s'", ruser, rhost, luser, pam_strerror(pamh, pam_err), cmdbuf); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "permission denied"); #endif rshd_errx(1, "Login incorrect."); } setpwent(); pwd = getpwnam(luser); if (pwd == NULL) { syslog(LOG_INFO|LOG_AUTH, "%s@%s as %s: unknown login. cmd='%.80s'", ruser, rhost, luser, cmdbuf); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "unknown login"); #endif if (errorstr == NULL) errorstr = "Login incorrect."; rshd_errx(1, errorstr, rhost); } lc = login_getpwclass(pwd); if (pwd->pw_uid) auth_checknologin(lc); if (chdir(pwd->pw_dir) < 0) { if (chdir("/") < 0 || login_getcapbool(lc, "requirehome", !!pwd->pw_uid)) { syslog(LOG_INFO|LOG_AUTH, "%s@%s as %s: no home directory. cmd='%.80s'", ruser, rhost, luser, cmdbuf); rshd_errx(0, "No remote home directory."); } pwd->pw_dir = slash; } if (lc != NULL && fromp->sa_family == AF_INET) { /*XXX*/ char remote_ip[MAXHOSTNAMELEN]; strncpy(remote_ip, numericname, sizeof(remote_ip) - 1); remote_ip[sizeof(remote_ip) - 1] = 0; /* XXX truncation! */ if (!auth_hostok(lc, rhost, remote_ip)) { syslog(LOG_INFO|LOG_AUTH, "%s@%s as %s: permission denied (%s). cmd='%.80s'", ruser, rhost, luser, __rcmd_errstr, cmdbuf); #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "permission denied"); #endif rshd_errx(1, "Login incorrect."); } if (!auth_timeok(lc, time(NULL))) rshd_errx(1, "Logins not available right now"); } /* * PAM modules might add supplementary groups in * pam_setcred(), so initialize them first. * But we need to open the session as root. */ if (setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETGROUP) != 0) { syslog(LOG_ERR, "setusercontext: %m"); exit(1); } if ((pam_err = pam_open_session(pamh, 0)) != PAM_SUCCESS) { syslog(LOG_ERR, "pam_open_session: %s", pam_strerror(pamh, pam_err)); } else if ((pam_err = pam_setcred(pamh, PAM_ESTABLISH_CRED)) != PAM_SUCCESS) { syslog(LOG_ERR, "pam_setcred: %s", pam_strerror(pamh, pam_err)); } (void) write(STDERR_FILENO, "\0", 1); sent_null = 1; if (port) { if (pipe(pv) < 0) rshd_errx(1, "Can't make pipe."); pid = fork(); if (pid == -1) rshd_errx(1, "Can't fork; try again."); if (pid) { (void) close(0); (void) close(1); (void) close(2); (void) close(pv[1]); FD_ZERO(&readfrom); FD_SET(s, &readfrom); FD_SET(pv[0], &readfrom); if (pv[0] > s) nfd = pv[0]; else nfd = s; ioctl(pv[0], FIONBIO, (char *)&one); /* should set s nbio! */ nfd++; do { ready = readfrom; if (select(nfd, &ready, (fd_set *)0, (fd_set *)0, (struct timeval *)0) < 0) break; if (FD_ISSET(s, &ready)) { int ret; ret = read(s, &sig, 1); if (ret <= 0) FD_CLR(s, &readfrom); else killpg(pid, sig); } if (FD_ISSET(pv[0], &ready)) { errno = 0; cc = read(pv[0], buf, sizeof(buf)); if (cc <= 0) { shutdown(s, SHUT_RDWR); FD_CLR(pv[0], &readfrom); } else { (void)write(s, buf, cc); } } } while (FD_ISSET(s, &readfrom) || FD_ISSET(pv[0], &readfrom)); PAM_END; exit(0); } (void) close(s); (void) close(pv[0]); dup2(pv[1], 2); close(pv[1]); } else { pid = fork(); if (pid == -1) rshd_errx(1, "Can't fork; try again."); if (pid) { /* Parent. */ while (wait(NULL) > 0 || errno == EINTR) /* nothing */ ; PAM_END; exit(0); } } #ifdef USE_BLACKLIST blacklist(0, STDIN_FILENO, "success"); #endif for (fd = getdtablesize(); fd > 2; fd--) (void) close(fd); if (setsid() == -1) syslog(LOG_ERR, "setsid() failed: %m"); if (setlogin(pwd->pw_name) < 0) syslog(LOG_ERR, "setlogin() failed: %m"); if (*pwd->pw_shell == '\0') pwd->pw_shell = bshell; (void) pam_setenv(pamh, "HOME", pwd->pw_dir, 1); (void) pam_setenv(pamh, "SHELL", pwd->pw_shell, 1); (void) pam_setenv(pamh, "USER", pwd->pw_name, 1); (void) pam_setenv(pamh, "PATH", _PATH_DEFPATH, 1); environ = pam_getenvlist(pamh); (void) pam_end(pamh, pam_err); cp = strrchr(pwd->pw_shell, '/'); if (cp) cp++; else cp = pwd->pw_shell; if (setusercontext(lc, pwd, pwd->pw_uid, LOGIN_SETALL & ~LOGIN_SETGROUP) < 0) { syslog(LOG_ERR, "setusercontext(): %m"); exit(1); } login_close(lc); endpwent(); if (log_success || pwd->pw_uid == 0) { syslog(LOG_INFO|LOG_AUTH, "%s@%s as %s: cmd='%.80s'", ruser, rhost, luser, cmdbuf); } execl(pwd->pw_shell, cp, "-c", cmdbuf, (char *)NULL); err(1, "%s", pwd->pw_shell); exit(1); }
int main(int argc, char *argv[]) { FILE *fp; int ch; char *lp; struct sockaddr_storage ss; socklen_t sval; int p[2], debug, kflag, logging, pflag, secure; #define ENTRIES 50 char **ap, *av[ENTRIES + 1], **comp, line[1024], *prog; char rhost[MAXHOSTNAMELEN]; prog = _PATH_FINGER; debug = logging = kflag = pflag = secure = 0; openlog("fingerd", LOG_PID | LOG_CONS, LOG_DAEMON); opterr = 0; while ((ch = getopt(argc, argv, "dklp:s")) != -1) switch (ch) { case 'd': debug = 1; break; case 'k': kflag = 1; break; case 'l': logging = 1; break; case 'p': prog = optarg; pflag = 1; break; case 's': secure = 1; break; case '?': default: logerr("illegal option -- %c", optopt); } /* * Enable server-side Transaction TCP. */ if (!debug) { int one = 1; if (setsockopt(STDOUT_FILENO, IPPROTO_TCP, TCP_NOPUSH, &one, sizeof one) < 0) { logerr("setsockopt(TCP_NOPUSH) failed: %m"); } } if (!fgets(line, sizeof(line), stdin)) exit(1); if (!debug && (logging || pflag)) { sval = sizeof(ss); if (getpeername(0, (struct sockaddr *)&ss, &sval) < 0) logerr("getpeername: %s", strerror(errno)); realhostname_sa(rhost, sizeof rhost - 1, (struct sockaddr *)&ss, sval); rhost[sizeof(rhost) - 1] = '\0'; if (pflag) setenv("FINGERD_REMOTE_HOST", rhost, 1); } if (logging) { char *t; char *end; end = memchr(line, 0, sizeof(line)); if (end == NULL) { if ((t = malloc(sizeof(line) + 1)) == NULL) logerr("malloc: %s", strerror(errno)); memcpy(t, line, sizeof(line)); t[sizeof(line)] = 0; } else { if ((t = strdup(line)) == NULL) logerr("strdup: %s", strerror(errno)); } for (end = t; *end; end++) if (*end == '\n' || *end == '\r') *end = ' '; syslog(LOG_NOTICE, "query from %s: `%s'", rhost, t); } comp = &av[2]; av[3] = "--"; if (kflag) *comp-- = "-k"; for (lp = line, ap = &av[4];;) { *ap = strtok(lp, " \t\r\n"); if (!*ap) { if (secure && ap == &av[4]) { #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "nousername"); #endif puts("must provide username\r\n"); exit(1); } break; } if (secure && strchr(*ap, '@')) { #ifdef USE_BLACKLIST blacklist(1, STDIN_FILENO, "noforwarding"); #endif puts("forwarding service denied\r\n"); exit(1); } /* RFC742: "/[Ww]" == "-l" */ if ((*ap)[0] == '/' && ((*ap)[1] == 'W' || (*ap)[1] == 'w')) { *comp-- = "-l"; } else if (++ap == av + ENTRIES) { *ap = NULL; break; } lp = NULL; } if ((lp = strrchr(prog, '/')) != NULL) *comp = ++lp; else *comp = prog; if (pipe(p) < 0) logerr("pipe: %s", strerror(errno)); if (debug) { fprintf(stderr, "%s", prog); for (ap = comp; *ap != NULL; ++ap) fprintf(stderr, " %s", *ap); fprintf(stderr, "\n"); } switch(vfork()) { case 0: (void)close(p[0]); if (p[1] != STDOUT_FILENO) { (void)dup2(p[1], STDOUT_FILENO); (void)close(p[1]); } dup2(STDOUT_FILENO, STDERR_FILENO); #ifdef USE_BLACKLIST blacklist(0, STDIN_FILENO, "success"); #endif execv(prog, comp); write(STDERR_FILENO, prog, strlen(prog)); #define MSG ": cannot execute\n" write(STDERR_FILENO, MSG, strlen(MSG)); #undef MSG _exit(1); case -1: logerr("fork: %s", strerror(errno)); } (void)close(p[1]); if (!(fp = fdopen(p[0], "r"))) logerr("fdopen: %s", strerror(errno)); while ((ch = getc(fp)) != EOF) { if (ch == '\n') putchar('\r'); putchar(ch); } exit(0); }