err(2, outpath);
err(2, "%s", outpath);
main(argc, argv)	int argc;	char *argv[];{	int (*get)();	int ch, i, stdinflag = 0, tmp = 0;	char nfields = 0, cflag = 0, mflag = 0;	char *outfile, *outpath = 0;	struct field *fldtab, *ftpos;	union f_handle filelist;	FILE *outfp = NULL;	void *p;	if ((clist = calloc((ND+1)*2, sizeof(struct coldesc))) == NULL ||	    (ftpos = fldtab = calloc(ND+2, sizeof(struct field))) == NULL)		errx(2, "cannot allocate memory");	memset(d_mask, 0, NBINS);	d_mask[REC_D = '\n'] = REC_D_F;	SINGL_FLD = SEP_FLAG = 0;	d_mask['\t'] = d_mask[' '] = BLANK | FLD_D;	fixit(&argc, argv);	if (!issetugid() && (outfile = getenv("TMPDIR")))		tmpdir = outfile;	while ((ch = getopt(argc, argv, "bcdfik:mHno:rR:t:T:uy:")) != -1) {		switch (ch) {		case 'b': fldtab->flags |= BI | BT;			break;		case 'd':		case 'f':		case 'i':		case 'n':		case 'r': tmp |= optval(ch, 0);			if (tmp & R && tmp & F)				fldtab->weights = RFtable;			else if (tmp & F)				fldtab->weights = Ftable;			else if (tmp & R)				fldtab->weights = Rascii;			fldtab->flags |= tmp;			break;		case 'o':			outpath = optarg;			break;		case 'k':			CHECK_NFIELDS;			setfield(optarg, ++ftpos, fldtab->flags);			break;		case 't':			if (SEP_FLAG)				usage("multiple field delimiters");			SEP_FLAG = 1;			d_mask[' '] &= ~FLD_D;			d_mask['\t'] &= ~FLD_D;			d_mask[(int)*optarg] |= FLD_D;			if (d_mask[(int)*optarg] & REC_D_F)				err(2, "record/field delimiter clash");			break;		case 'R':			if (REC_D != '\n')				usage("multiple record delimiters");			if ('\n' == (REC_D = *optarg))				break;			d_mask['\n'] = d_mask[' '];			d_mask[REC_D] = REC_D_F;			break;		case 'T':			tmpdir = optarg;			break;		case 'u':			UNIQUE = 1;			break;		case 'c':			cflag = 1;			break;		case 'm':			mflag = 1;			break;		case 'H':			PANIC = 0;			break;		case 'y':			/* accept -y for backwards compat. */			break;		case '?':		default:			usage(NULL);		}	}	if (cflag && argc > optind+1)		errx(2, "too many input files for -c option");	if (argc - 2 > optind && !strcmp(argv[argc-2], "-o")) {		outpath = argv[argc-1];		argc -= 2;	}	if (mflag && argc - optind > (MAXFCT - (16+1))*16)		errx(2, "too many input files for -m option");	for (i = optind; i < argc; i++) {		/* allow one occurrence of /dev/stdin */		if (!strcmp(argv[i], "-") || !strcmp(argv[i], devstdin)) {			if (stdinflag)				warnx("ignoring extra \"%s\" in file list",				    argv[i]);			else {				stdinflag = 1;				argv[i] = devstdin;			}		} else if ((ch = access(argv[i], R_OK)))			err(2, argv[i]);	}	if (!(fldtab->flags & (I|D|N) || fldtab[1].icol.num)) {		SINGL_FLD = 1;		fldtab[0].icol.num = 1;	} else {		if (!fldtab[1].icol.num) {			CHECK_NFIELDS;			fldtab[0].flags &= ~(BI|BT);			setfield("1", ++ftpos, fldtab->flags);		}		fldreset(fldtab);		fldtab[0].flags &= ~F;	}	settables(fldtab[0].flags);	num_init();	fldtab->weights = gweights;	if (optind == argc) {		static char *names[2];		names[0] = devstdin;		names[1] = NULL;		filelist.names = names;		optind--;	} else		filelist.names = argv+optind;	if (SINGL_FLD)		get = makeline;	else		get = makekey;	if (cflag) {		order(filelist, get, fldtab);		/* NOT REACHED */	}	if (!outpath) {		(void)snprintf(toutpath,		    sizeof(toutpath), "%sstdout", _PATH_DEV);		outfile = outpath = toutpath;	} else if (!(ch = access(outpath, 0)) &&	    strncmp(_PATH_DEV, outpath, 5)) {		struct sigaction act = {0, SIG_BLOCK, 6};		int sigtable[] = {SIGHUP, SIGINT, SIGPIPE, SIGXCPU, SIGXFSZ,		    SIGVTALRM, SIGPROF, 0};		int outfd;		mode_t um;		errno = 0;		if (access(outpath, W_OK))			err(2, outpath);		act.sa_handler = onsig;		(void)snprintf(toutpath, sizeof(toutpath), "%sXXXXXXXXXX",		    outpath);		/* use default umask to try and avoid one syscall */		um = umask(S_IWGRP|S_IWOTH);		if (um != S_IWGRP|S_IWOTH)			(void)umask(um);		if ((outfd = mkstemp(toutpath)) == -1 ||		    fchmod(outfd, DEFFILEMODE & ~um) == -1 ||		    (outfp = fdopen(outfd, "w")) == 0)			err(2, toutpath);		outfile = toutpath;		(void)atexit(cleanup);		for (i = 0; sigtable[i]; ++i)	/* always unlink toutpath */			sigaction(sigtable[i], &act, 0);	} else		outfile = outpath;	if (outfp == NULL && (outfp = fopen(outfile, "w")) == NULL)		err(2, outfile);	if (mflag)		fmerge(-1, filelist, argc-optind, get, outfp, putline, fldtab);	else		fsort(-1, 0, filelist, argc-optind, outfp, fldtab);	if (outfile != outpath) {		if (access(outfile, 0))			err(2, outfile);		(void)unlink(outpath);		if (link(outfile, outpath))			err(2, "cannot link %s: output left in %s",			    outpath, outfile);		(void)unlink(outfile);	}	exit(0);}