Annotation of src/usr.bin/ftp/domacro.c, Revision 1.9
1.9 ! millert 1: /* $OpenBSD: domacro.c,v 1.8 2003/01/22 05:35:39 itojun Exp $ */
1.7 millert 2: /* $NetBSD: domacro.c,v 1.10 1997/07/20 09:45:45 lukem Exp $ */
1.1 deraadt 3:
4: /*
5: * Copyright (c) 1985, 1993, 1994
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
1.9 ! millert 16: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: */
32:
33: #ifndef lint
34: #if 0
35: static char sccsid[] = "@(#)domacro.c 8.3 (Berkeley) 4/2/94";
36: #else
1.9 ! millert 37: static char rcsid[] = "$OpenBSD: domacro.c,v 1.8 2003/01/22 05:35:39 itojun Exp $";
1.1 deraadt 38: #endif
39: #endif /* not lint */
40:
41: #include <ctype.h>
42: #include <signal.h>
43: #include <stdio.h>
1.3 millert 44: #include <string.h>
1.1 deraadt 45:
46: #include "ftp_var.h"
47:
48: void
49: domacro(argc, argv)
50: int argc;
51: char *argv[];
52: {
53: int i, j, count = 2, loopflg = 0;
1.8 itojun 54: char *cp1, *cp2, line2[FTPBUFLEN];
1.1 deraadt 55: struct cmd *c;
56:
57: if (argc < 2 && !another(&argc, &argv, "macro name")) {
1.6 deraadt 58: fprintf(ttyout, "usage: %s macro_name\n", argv[0]);
1.1 deraadt 59: code = -1;
60: return;
61: }
62: for (i = 0; i < macnum; ++i) {
63: if (!strncmp(argv[1], macros[i].mac_name, 9)) {
64: break;
65: }
66: }
67: if (i == macnum) {
1.6 deraadt 68: fprintf(ttyout, "'%s' macro not found.\n", argv[1]);
1.1 deraadt 69: code = -1;
70: return;
71: }
1.8 itojun 72: (void)strlcpy(line2, line, sizeof(line2));
1.1 deraadt 73: TOP:
74: cp1 = macros[i].mac_start;
75: while (cp1 != macros[i].mac_end) {
76: while (isspace(*cp1)) {
77: cp1++;
78: }
79: cp2 = line;
80: while (*cp1 != '\0') {
81: switch(*cp1) {
82: case '\\':
83: *cp2++ = *++cp1;
84: break;
85: case '$':
86: if (isdigit(*(cp1+1))) {
87: j = 0;
88: while (isdigit(*++cp1)) {
89: j = 10*j + *cp1 - '0';
90: }
91: cp1--;
92: if (argc - 2 >= j) {
1.8 itojun 93: (void)strlcpy(cp2, argv[j+1],
94: sizeof(line) - (cp2 - line));
1.1 deraadt 95: cp2 += strlen(argv[j+1]);
96: }
97: break;
98: }
99: if (*(cp1+1) == 'i') {
100: loopflg = 1;
101: cp1++;
102: if (count < argc) {
1.8 itojun 103: (void)strlcpy(cp2, argv[count],
104: sizeof(line) - (cp2 - line));
1.1 deraadt 105: cp2 += strlen(argv[count]);
106: }
107: break;
108: }
109: /* intentional drop through */
110: default:
111: *cp2++ = *cp1;
112: break;
113: }
114: if (*cp1 != '\0') {
115: cp1++;
116: }
117: }
118: *cp2 = '\0';
119: makeargv();
120: c = getcmd(margv[0]);
121: if (c == (struct cmd *)-1) {
1.6 deraadt 122: fputs("?Ambiguous command.\n", ttyout);
1.1 deraadt 123: code = -1;
124: }
125: else if (c == 0) {
1.6 deraadt 126: fputs("?Invalid command.\n", ttyout);
1.1 deraadt 127: code = -1;
128: }
129: else if (c->c_conn && !connected) {
1.6 deraadt 130: fputs("Not connected.\n", ttyout);
1.1 deraadt 131: code = -1;
132: }
133: else {
1.6 deraadt 134: if (verbose) {
135: fputs(line, ttyout);
1.7 millert 136: fputc('\n', ttyout);
1.6 deraadt 137: }
1.1 deraadt 138: (*c->c_handler)(margc, margv);
139: if (bell && c->c_bell) {
1.6 deraadt 140: (void)putc('\007', ttyout);
1.1 deraadt 141: }
1.8 itojun 142: (void)strlcpy(line, line2, sizeof(line));
1.1 deraadt 143: makeargv();
144: argc = margc;
145: argv = margv;
146: }
147: if (cp1 != macros[i].mac_end) {
148: cp1++;
149: }
150: }
151: if (loopflg && ++count < argc) {
152: goto TOP;
153: }
154: }