Annotation of src/usr.bin/ftp/domacro.c, Revision 1.2
1.2 ! deraadt 1: /* $OpenBSD: domacro.c,v 1.5 1995/09/08 01:06:14 tls Exp $ */
1.1 deraadt 2: /* $NetBSD: domacro.c,v 1.5 1995/09/08 01:06:14 tls Exp $ */
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.2 ! deraadt 41: static char rcsid[] = "$OpenBSD: domacro.c,v 1.5 1995/09/08 01:06:14 tls Exp $";
1.1 deraadt 42: #endif
43: #endif /* not lint */
44:
45: #include <ctype.h>
46: #include <signal.h>
47: #include <stdio.h>
48: #include <strings.h>
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;
58: char *cp1, *cp2, line2[200];
59: struct cmd *c;
60:
61: if (argc < 2 && !another(&argc, &argv, "macro name")) {
62: printf("Usage: %s macro_name.\n", argv[0]);
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) {
72: printf("'%s' macro not found.\n", argv[1]);
73: code = -1;
74: return;
75: }
76: (void) strcpy(line2, line);
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) {
97: (void) strcpy(cp2, argv[j+1]);
98: cp2 += strlen(argv[j+1]);
99: }
100: break;
101: }
102: if (*(cp1+1) == 'i') {
103: loopflg = 1;
104: cp1++;
105: if (count < argc) {
106: (void) strcpy(cp2, argv[count]);
107: cp2 += strlen(argv[count]);
108: }
109: break;
110: }
111: /* intentional drop through */
112: default:
113: *cp2++ = *cp1;
114: break;
115: }
116: if (*cp1 != '\0') {
117: cp1++;
118: }
119: }
120: *cp2 = '\0';
121: makeargv();
122: c = getcmd(margv[0]);
123: if (c == (struct cmd *)-1) {
124: printf("?Ambiguous command\n");
125: code = -1;
126: }
127: else if (c == 0) {
128: printf("?Invalid command\n");
129: code = -1;
130: }
131: else if (c->c_conn && !connected) {
132: printf("Not connected.\n");
133: code = -1;
134: }
135: else {
136: if (verbose) {
137: printf("%s\n",line);
138: }
139: (*c->c_handler)(margc, margv);
140: if (bell && c->c_bell) {
141: (void) putchar('\007');
142: }
143: (void) strcpy(line, line2);
144: makeargv();
145: argc = margc;
146: argv = margv;
147: }
148: if (cp1 != macros[i].mac_end) {
149: cp1++;
150: }
151: }
152: if (loopflg && ++count < argc) {
153: goto TOP;
154: }
155: }