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