There are no available options for this view.

Parent Directory Parent Directory | Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a> Revision <a href="/cvs/aolserver/aolserver/nsd/log.c#A_Log">Log</a>

Revision 1.23 - (show annotations) (download) (as text)
Wed Sep 28 05:50:47 2011 UTC (6 years, 3 months ago) by dvrsn
Branch: MAIN
CVS Tags: aolserver_v45_r2_rc0, HEAD
Branch point for: aolserver_v45_r2
Changes since 1.22: +8 -5 lines
File MIME type: text/x-chdr
added NsTclGetNative function to get decoded versions of strings.  Use that
function to get filenames with ns_retutrnfile and ns_respond
1 /*
2 * The contents of this file are subject to the AOLserver Public License
3 * Version 1.1 (the "License"); you may not use this file except in
4 * compliance with the License. You may obtain a copy of the License at
5 * http://aolserver.com/.
6 *
7 * Software distributed under the License is distributed on an "AS IS"
8 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9 * the License for the specific language governing rights and limitations
10 * under the License.
11 *
12 * The Original Code is AOLserver Code and related documentation
13 * distributed by AOL.
14 *
15 * The Initial Developer of the Original Code is America Online,
16 * Inc. Portions created by AOL are Copyright (C) 1999 America Online,
17 * Inc. All Rights Reserved.
18 *
19 * Alternatively, the contents of this file may be used under the terms
20 * of the GNU General Public License (the "GPL"), in which case the
21 * provisions of GPL are applicable instead of those above. If you wish
22 * to allow use of your version of this file only under the terms of the
23 * GPL and not to allow others to use your version of this file under the
24 * License, indicate your decision by deleting the provisions above and
25 * replace them with the notice and other provisions required by the GPL.
26 * If you do not delete the provisions above, a recipient may use your
27 * version of this file under either the License or the GPL.
28 */
29
30
31 /*
32 * tclresp.c --
33 *
34 * Tcl commands for returning data to the user agent.
35 */
36
37 static const char *RCSID = "@(#) $Header: /cvsroot-fuse/aolserver/aolserver/nsd/tclresp.c,v 1.23 2011/09/28 05:50:47 dvrsn Exp $, compiled: " __DATE__ " " __TIME__;
38
39 #include "nsd.h"
40
41 static int <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(Tcl_Interp *interp, int result);
42
43
44 /*
45 *----------------------------------------------------------------------
46 *
47 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a> --
48 *
49 * Return current connection for interp.
50 *
51 * Results:
52 * TCL_OK if a connection is active, TCL_ERROR otherwise.
53 *
54 * Side effects:
55 * Given connPtr will be set with conn if not NULL.
56 *
57 *----------------------------------------------------------------------
58 */
59
60 int
61 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>(NsInterp *itPtr, Ns_Conn **connPtr)
62 {
63 if (itPtr->conn == NULL) {
64 Tcl_SetResult(itPtr->interp, "no connection", TCL_STATIC);
65 return TCL_ERROR;
66 }
67 if (connPtr != NULL) {
68 *connPtr = itPtr->conn;
69 }
70 return TCL_OK;
71 }
72
73
74 /*
75 *----------------------------------------------------------------------
76 *
77 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclHeadersObjCmd">NsTclHeadersObjCmd</a> --
78 *
79 * Spit out initial HTTP response; this is for backwards
80 * compatibility only.
81 *
82 * Results:
83 * Tcl result.
84 *
85 * Side effects:
86 * None.
87 *
88 *----------------------------------------------------------------------
89 */
90
91 int
92 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclHeadersObjCmd">NsTclHeadersObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
93 Tcl_Obj *CONST objv[])
94 {
95 int status, len;
96 Ns_Conn *conn;
97 char *type;
98
99 if (objc < 3 || objc > 5) {
100 Tcl_WrongNumArgs(interp, 1, objv, "connid status ?type len?");
101 return TCL_ERROR;
102 }
103 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
104 return TCL_ERROR;
105 }
106 if (Tcl_GetIntFromObj(interp, objv[2], &status) != TCL_OK) {
107 return TCL_ERROR;
108 }
109 if (objc < 4) {
110 type = NULL;
111 } else {
112 type = Tcl_GetString(objv[3]);
113 }
114 if (objc < 5) {
115 len = 0;
116 } else if (Tcl_GetIntFromObj(interp, objv[4], &len) != TCL_OK) {
117 return TCL_ERROR;
118 }
119 <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnSetRequiredHeaders">Ns_ConnSetRequiredHeaders</a>(conn, type, len);
120 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnFlushHeaders">Ns_ConnFlushHeaders</a>(conn, status));
121 }
122
123
124 /*
125 *----------------------------------------------------------------------
126 *
127 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnObjCmd">NsTclReturnObjCmd</a> --
128 *
129 * Implements ns_return as obj command.
130 *
131 * Results:
132 * Tcl result.
133 *
134 * Side effects:
135 * See docs.
136 *
137 *----------------------------------------------------------------------
138 */
139
140 int
141 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnObjCmd">NsTclReturnObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
142 Tcl_Obj *CONST objv[])
143 {
144 Ns_Conn *conn;
145 int status, result, len;
146 char *data, *type;
147
148 if (objc != 4 && objc != 5) {
149 Tcl_WrongNumArgs(interp, 1, objv, "?connid? status type string");
150 return TCL_ERROR;
151 }
152 if (objc == 5 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
153 return TCL_ERROR;
154 }
155 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
156 return TCL_ERROR;
157 }
158 if (Tcl_GetIntFromObj(interp, objv[objc-3], &status) != TCL_OK) {
159 return TCL_ERROR;
160 }
161 data = Tcl_GetStringFromObj(objv[objc-1], &len);
162 type = Tcl_GetString(objv[objc-2]);
163 result = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnCharData">Ns_ConnReturnCharData</a>(conn, status, data, len, type);
164 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, result);
165 }
166
167
168 /*
169 *----------------------------------------------------------------------
170 *
171 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclRespondObjCmd">NsTclRespondObjCmd</a> --
172 *
173 * Implements ns_respond as obj command.
174 *
175 * Results:
176 * Tcl result.
177 *
178 * Side effects:
179 * See ns_respond.
180 *
181 *----------------------------------------------------------------------
182 */
183
184 int
185 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclRespondObjCmd">NsTclRespondObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
186 Tcl_Obj *CONST objv[])
187 {
188 int status;
189 char *type;
190 char *string;
191 char *filename;
192 Tcl_Channel chan;
193 int length;
194 Ns_Conn *conn;
195 int retval;
196 int i;
197
198 status = 200;
199 type = NULL;
200 string = NULL;
201 filename = NULL;
202 chan = NULL;
203 length = -1;
204
205 if (objc < 3) {
206 error:
207 Tcl_WrongNumArgs(interp, 1, objv,
208 "?-status status? ?-type type? { ?-string string?"
209 " | ?-file filename? | ?-fileid fileid? }"
210 " ?-length length? ?-headers setid?");
211 return TCL_ERROR;
212 }
213 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
214 return TCL_ERROR;
215 }
216
217 /*
218 * Loop over every argument and set the appropriate options.
219 */
220
221 for (i = 0; i < objc; i++) {
222 char *carg = Tcl_GetString(objv[i]);
223 if (*carg != '-') {
224 continue;
225 }
226 if (++i >= objc) {
227 goto error;
228 }
229
230 if (STRIEQ(carg, "-status")) {
231 if (Tcl_GetIntFromObj(interp, objv[i], &status) != TCL_OK) {
232 goto error;
233 }
234
235 } else if (STRIEQ(carg, "-type")) {
236 type = Tcl_GetString(objv[i]);
237
238 } else if (STRIEQ(carg, "-string")) {
239 string = Tcl_GetString(objv[i]);
240
241 } else if (STRIEQ(carg, "-file")) {
242 filename = NsTclGetNative(objv[i]);
243
244 } else if (STRIEQ(carg, "-fileid")) {
245 if (<a href="/cvs/aolserver/aolserver/nsd/tclfile.c#A_Ns_TclGetOpenChannel">Ns_TclGetOpenChannel</a>(interp, carg, 0, 1, &chan) != TCL_OK) {
246 goto error;
247 }
248
249 } else if (STRIEQ(carg, "-length")) {
250 if (Tcl_GetIntFromObj(interp, objv[i], &length) != TCL_OK) {
251 goto error;
252 }
253
254 } else if (STRIEQ(carg, "-headers")) {
255 Ns_Set *set;
256
257 set = <a href="/cvs/aolserver/aolserver/nsd/tclset.c#A_Ns_TclGetSet">Ns_TclGetSet</a>(interp, Tcl_GetString(objv[i]));
258 if (set == NULL) {
259 Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),
260 "Illegal ns_set id: \"", Tcl_GetString(objv[i]), "\"",
261 NULL);
262 return TCL_ERROR;
263 }
264 <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReplaceHeaders">Ns_ConnReplaceHeaders</a>(conn, set);
265 }
266 }
267
268 /*
269 * Exactly one of chan, filename, string must be specified.
270 */
271
272 if ((chan != NULL) + (filename != NULL) + (string != NULL) != 1) {
273 Tcl_SetResult(interp, "must specify only one of -string, -file, "
274 "or -type", TCL_STATIC);
275 return TCL_ERROR;
276 }
277
278 if (chan != NULL) {
279 /*
280 * We'll be returning an open channel
281 */
282
283 if (length < 0) {
284 Tcl_SetResult(interp, "length required when -fileid is used",
285 TCL_STATIC);
286 return TCL_ERROR;
287 }
288
289 retval = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnOpenChannel">Ns_ConnReturnOpenChannel</a>(conn, status, type, chan, length);
290
291 } else if (filename != NULL) {
292 /*
293 * We'll be returning a file by name
294 */
295
296 retval = <a href="/cvs/aolserver/aolserver/nsd/fastpath.c#A_Ns_ConnReturnFile">Ns_ConnReturnFile</a>(conn, status, type, filename);
297 ns_free(filename);
298
299 } else {
300 /*
301 * We'll be returning a string now.
302 */
303
304 retval = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnCharData">Ns_ConnReturnCharData</a>(conn, status, string, length, type);
305 }
306
307 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, retval);
308 }
309
310
311 /*
312 *----------------------------------------------------------------------
313 *
314 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnFileObjCmd">NsTclReturnFileObjCmd</a> --
315 *
316 * Return an open file. (ns_returnfile)
317 *
318 * Results:
319 * Tcl result.
320 *
321 * Side effects:
322 * See docs.
323 *
324 *----------------------------------------------------------------------
325 */
326
327 int
328 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnFileObjCmd">NsTclReturnFileObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
329 Tcl_Obj *CONST objv[])
330 {
331 int status, result;
332 Ns_Conn *conn;
333 char *type, *file;
334
335 if (objc != 4 && objc != 5) {
336 Tcl_WrongNumArgs(interp, 1, objv, "?connid? status type file");
337 return TCL_ERROR;
338 }
339 if (objc == 5 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
340 return TCL_ERROR;
341 }
342 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
343 return TCL_ERROR;
344 }
345 if (Tcl_GetIntFromObj(interp, objv[objc-3], &status) != TCL_OK) {
346 return TCL_ERROR;
347 }
348 file = NsTclGetNative(objv[objc-1]);
349 type = Tcl_GetString(objv[objc-2]);
350 result = <a href="/cvs/aolserver/aolserver/nsd/fastpath.c#A_Ns_ConnReturnFile">Ns_ConnReturnFile</a>(conn, status, type, file);
351 ns_free(file);
352 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, result);
353 }
354
355
356 /*
357 *----------------------------------------------------------------------
358 *
359 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnFpObjCmd">NsTclReturnFpObjCmd</a> --
360 *
361 * Implements ns_returnfp. (actually accepts any open channel)
362 *
363 * Results:
364 * Tcl result.
365 *
366 * Side effects:
367 * See docs.
368 *
369 *----------------------------------------------------------------------
370 */
371
372 int
373 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnFpObjCmd">NsTclReturnFpObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
374 Tcl_Obj *CONST objv[])
375 {
376 int len, status, result;
377 Tcl_Channel chan;
378 Ns_Conn *conn;
379 char *type;
380
381 if (objc != 5 && objc != 6) {
382 Tcl_WrongNumArgs(interp, 1, objv, "?connid? status type fileId len");
383 return TCL_ERROR;
384 }
385 if (objc == 6 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
386 return TCL_ERROR;
387 }
388 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
389 return TCL_ERROR;
390 }
391 if (Tcl_GetIntFromObj(interp, objv[objc-4], &status) != TCL_OK) {
392 return TCL_ERROR;
393 }
394 if (Tcl_GetIntFromObj(interp, objv[objc-1], &len) != TCL_OK) {
395 return TCL_ERROR;
396 }
397 if (<a href="/cvs/aolserver/aolserver/nsd/tclfile.c#A_Ns_TclGetOpenChannel">Ns_TclGetOpenChannel</a>(interp, Tcl_GetString(objv[objc-2]), 0, 1, &chan)
398 != TCL_OK) {
399 return TCL_ERROR;
400 }
401 type = Tcl_GetString(objv[objc-3]);
402 result = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnOpenChannel">Ns_ConnReturnOpenChannel</a>(conn, status, type, chan, len);
403 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, result);
404 }
405
406
407 /*
408 *----------------------------------------------------------------------
409 *
410 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnBadRequestObjCmd">NsTclReturnBadRequestObjCmd</a> --
411 *
412 * Implements ns_returnbadrequest as obj command.
413 *
414 * Results:
415 * Tcl result.
416 *
417 * Side effects:
418 * See docs.
419 *
420 *----------------------------------------------------------------------
421 */
422
423 int
424 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnBadRequestObjCmd">NsTclReturnBadRequestObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
425 Tcl_Obj *CONST objv[])
426 {
427 Ns_Conn *conn;
428 char *reason;
429
430 if (objc != 2 && objc != 3) {
431 Tcl_WrongNumArgs(interp, 1, objv, "?connid? reason");
432 return TCL_ERROR;
433 }
434 if (objc == 3 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
435 return TCL_ERROR;
436 }
437 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
438 return TCL_ERROR;
439 }
440 reason = Tcl_GetString(objv[objc-1]);
441 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnBadRequest">Ns_ConnReturnBadRequest</a>(conn, reason));
442 }
443
444
445 /*
446 *----------------------------------------------------------------------
447 *
448 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnObjCmd">ReturnObjCmd</a> --
449 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnNotFoundObjCmd">NsTclReturnNotFoundObjCmd</a> --
450 * NsTclReturnTooLargeObjCmd --
451 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnUnauthorizedObjCmd">NsTclReturnUnauthorizedObjCmd</a> --
452 * NsTclReturnForbiddenCmd --
453 *
454 * Implement the ns_returnnotfound, ns_returntoolarge,
455 * ns_returnunauthorized, and ns_returnforbidden generic return
456 * commands.
457 *
458 * Results:
459 * Tcl result.
460 *
461 * Side effects:
462 * Will call proc that is clientdata.
463 *
464 *----------------------------------------------------------------------
465 */
466
467 static int
468 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnObjCmd">ReturnObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
469 Tcl_Obj *CONST objv[], int (*proc) (Ns_Conn *))
470 {
471 Ns_Conn *conn;
472
473 if (objc != 1 && objc != 2) {
474 Tcl_WrongNumArgs(interp, 1, objv, "?connid?");
475 return TCL_ERROR;
476 }
477 if (objc == 2 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
478 return TCL_ERROR;
479 }
480 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
481 return TCL_ERROR;
482 }
483 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, (*proc)(conn));
484 }
485
486 int
487 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnNotFoundObjCmd">NsTclReturnNotFoundObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
488 Tcl_Obj *CONST objv[])
489 {
490 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnObjCmd">ReturnObjCmd</a>(arg, interp, objc, objv, <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnNotFound">Ns_ConnReturnNotFound</a>);
491 }
492
493 int
494 NsTclReturnTooLargeObjCmd(ClientData arg, Tcl_Interp *interp, int objc,
495 Tcl_Obj *CONST objv[])
496 {
497 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnObjCmd">ReturnObjCmd</a>(arg, interp, objc, objv, Ns_ConnReturnEntityTooLarge);
498 }
499
500
501 int
502 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnUnauthorizedObjCmd">NsTclReturnUnauthorizedObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
503 Tcl_Obj *CONST objv[])
504 {
505 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnObjCmd">ReturnObjCmd</a>(arg, interp, objc, objv, <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnUnauthorized">Ns_ConnReturnUnauthorized</a>);
506 }
507
508 int
509 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnForbiddenObjCmd">NsTclReturnForbiddenObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
510 Tcl_Obj *CONST objv[])
511 {
512 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnObjCmd">ReturnObjCmd</a>(arg, interp, objc, objv, <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnForbidden">Ns_ConnReturnForbidden</a>);
513 }
514
515
516 /*
517 *----------------------------------------------------------------------
518 *
519 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnErrorObjCmd">NsTclReturnErrorObjCmd</a> --
520 *
521 * Implements ns_tclreturnerror as obj command.
522 *
523 * Results:
524 * Tcl result.
525 *
526 * Side effects:
527 * See docs.
528 *
529 *----------------------------------------------------------------------
530 */
531
532 int
533 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnErrorObjCmd">NsTclReturnErrorObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
534 Tcl_Obj *CONST objv[])
535 {
536 int status, result;
537 Ns_Conn *conn;
538 char *msg;
539
540 if (objc != 3 && objc != 4) {
541 Tcl_WrongNumArgs(interp, 1, objv, "?connid? status message");
542 return TCL_ERROR;
543 }
544 if (objc == 4 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
545 return TCL_ERROR;
546 }
547 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
548 return TCL_ERROR;
549 }
550 if (Tcl_GetIntFromObj(interp, objv[objc-2], &status) != TCL_OK) {
551 return TCL_ERROR;
552 }
553 msg = Tcl_GetString(objv[objc-1]);
554 result = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnAdminNotice">Ns_ConnReturnAdminNotice</a>(conn, status, "Request Error", msg);
555 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, result);
556 }
557
558
559 /*
560 *----------------------------------------------------------------------
561 *
562 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnNoticeCmd">ReturnNoticeCmd</a> --
563 *
564 * Implements ns_returnnotice and ns_returnadminnotice commands.
565 *
566 * Results:
567 * Tcl result.
568 *
569 * Side effects:
570 * See docs.
571 *
572 *----------------------------------------------------------------------
573 */
574
575 static int
576 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnNoticeCmd">ReturnNoticeCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv, int admin)
577 {
578 int status, result;
579 Ns_Conn *conn;
580 char *longMessage = NULL;
581 int statusArg = 0, messageArg = 0, longMessageArg = 0;
582
583 /* find the arguments. There are 4 cases (in the order they're checked):
584 * 0 1 2 3 4
585 * cmd status msg (3 args)
586 * cmd connId status msg (4 args)
587 * cmd status msg longmsg (4 args)
588 * cmd connId status msg longmsg (5 args)
589 */
590
591 if (argc == 3) {
592 statusArg = 1;
593 messageArg = 2;
594
595 } else if (argc == 4) {
596 /* NB: Ignored old "c" arg. */
597 if (argv[1][0] == 'c') {
598 statusArg = 2;
599 messageArg = 3;
600 } else {
601 statusArg = 1;
602 messageArg = 2;
603 longMessageArg = 3;
604 }
605
606 } else if (argc == 5) {
607 statusArg = 2;
608 messageArg = 3;
609 longMessageArg = 4;
610
611 } else {
612 Tcl_AppendResult(interp, "wrong # of args: should be \"",
613 argv[0], " status title ?message?\"", NULL);
614 return TCL_ERROR;
615 }
616 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
617 return TCL_ERROR;
618 }
619
620 /*
621 * Get the status value
622 */
623
624 if (Tcl_GetInt(interp, argv[statusArg], &status) != TCL_OK) {
625 return TCL_ERROR;
626 }
627 if (longMessageArg != 0) {
628 longMessage = argv[longMessageArg];
629 }
630 if (admin) {
631 result = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnAdminNotice">Ns_ConnReturnAdminNotice</a>(conn, status, argv[messageArg], longMessage);
632 } else {
633 result = <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnNotice">Ns_ConnReturnNotice</a>(conn, status, argv[messageArg], longMessage);
634 }
635 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, result);
636 }
637
638 int
639 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnNoticeCmd">NsTclReturnNoticeCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv)
640 {
641 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnNoticeCmd">ReturnNoticeCmd</a>(arg, interp, argc, argv, 0);
642 }
643
644 int
645 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnAdminNoticeCmd">NsTclReturnAdminNoticeCmd</a>(ClientData arg, Tcl_Interp *interp, int argc, char **argv)
646 {
647 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_ReturnNoticeCmd">ReturnNoticeCmd</a>(arg, interp, argc, argv, 1);
648 }
649
650
651 /*
652 *----------------------------------------------------------------------
653 *
654 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnRedirectObjCmd">NsTclReturnRedirectObjCmd</a> --
655 *
656 * Implements ns_returnredirect as obj command.
657 *
658 * Results:
659 * Tcl result.
660 *
661 * Side effects:
662 * See docs.
663 *
664 *----------------------------------------------------------------------
665 */
666
667 int
668 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclReturnRedirectObjCmd">NsTclReturnRedirectObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
669 Tcl_Obj *CONST objv[])
670 {
671 Ns_Conn *conn;
672 char *location;
673
674 if (objc != 2 && objc != 3) {
675 Tcl_WrongNumArgs(interp, 1, objv, "?connid? location");
676 return TCL_ERROR;
677 }
678 if (objc == 3 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
679 return TCL_ERROR;
680 }
681 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
682 return TCL_ERROR;
683 }
684 location = Tcl_GetString(objv[objc-1]);
685 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, <a href="/cvs/aolserver/aolserver/nsd/return.c#A_Ns_ConnReturnRedirect">Ns_ConnReturnRedirect</a>(conn, location));
686 }
687
688
689 /*
690 *----------------------------------------------------------------------
691 *
692 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclInternalRedirectObjCmd">NsTclInternalRedirectObjCmd</a> --
693 *
694 * Implements ns_internalredirect as obj command.
695 *
696 * Results:
697 * Tcl result.
698 *
699 * Side effects:
700 * See docs.
701 *
702 *----------------------------------------------------------------------
703 */
704
705 int
706 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclInternalRedirectObjCmd">NsTclInternalRedirectObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
707 Tcl_Obj *CONST objv[])
708 {
709 Ns_Conn *conn;
710 char *location;
711
712 if (objc != 2 && objc != 3) {
713 Tcl_WrongNumArgs(interp, 1, objv, "?connid? location");
714 return TCL_ERROR;
715 }
716 if (objc == 3 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
717 return TCL_ERROR;
718 }
719 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
720 return TCL_ERROR;
721 }
722 location = Tcl_GetString(objv[objc-1]);
723 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, <a href="/cvs/aolserver/aolserver/nsd/op.c#A_Ns_ConnRedirect">Ns_ConnRedirect</a>(conn, location));
724 }
725
726
727 /*
728 *----------------------------------------------------------------------
729 *
730 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclWriteObjCmd">NsTclWriteObjCmd</a> --
731 *
732 * Implements ns_write as obj command.
733 *
734 * Results:
735 * Tcl result.
736 *
737 * Side effects:
738 * See docs.
739 *
740 *----------------------------------------------------------------------
741 */
742
743 int
744 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclWriteObjCmd">NsTclWriteObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
745 Tcl_Obj *CONST objv[])
746 {
747 Ns_Conn *conn;
748 char *bytes;
749 int length;
750 int result;
751
752 if (objc != 2 && objc != 3) {
753 Tcl_WrongNumArgs(interp, 1, objv, "?connid? string");
754 return TCL_ERROR;
755 }
756 if (objc == 3 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
757 return TCL_ERROR;
758 }
759 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
760 return TCL_ERROR;
761 }
762
763 /*
764 * ns_write will treat data it is given as binary, until
765 * it is specifically given permission to do otherwise through
766 * the WriteEncodedFlag on the current conn. This flag is
767 * manipulated via ns_startcontent or ns_conn write_encoded
768 */
769
770 if (<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_Ns_ConnGetWriteEncodedFlag">Ns_ConnGetWriteEncodedFlag</a>(conn)
771 && (<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_Ns_ConnGetEncoding">Ns_ConnGetEncoding</a>(conn) != NULL)) {
772 bytes = Tcl_GetStringFromObj(objv[objc-1], &length);
773 result = <a href="/cvs/aolserver/aolserver/nsd/connio.c#A_Ns_WriteCharConn">Ns_WriteCharConn</a>(conn, bytes, length);
774 } else {
775 bytes = (char *) Tcl_GetByteArrayFromObj(objv[objc-1], &length);
776 result = <a href="/cvs/aolserver/aolserver/nsd/connio.c#A_Ns_WriteConn">Ns_WriteConn</a>(conn, bytes, length);
777 }
778 return <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(interp, result);
779 }
780
781
782 /*
783 *----------------------------------------------------------------------
784 *
785 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclConnSendFpObjCmd">NsTclConnSendFpObjCmd</a> --
786 *
787 * Implements ns_connsendfp as obj command.
788 *
789 * Results:
790 * Tcl result.
791 *
792 * Side effects:
793 * See docs.
794 *
795 *----------------------------------------------------------------------
796 */
797
798 int
799 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclConnSendFpObjCmd">NsTclConnSendFpObjCmd</a>(ClientData arg, Tcl_Interp *interp, int objc,
800 Tcl_Obj *CONST objv[])
801 {
802 Ns_Conn *conn;
803 Tcl_Channel chan;
804 int len;
805
806 if (objc != 3 && objc != 4) {
807 Tcl_WrongNumArgs(interp, 1, objv, "?connid? fp len");
808 return TCL_ERROR;
809 }
810 if (objc == 4 && !<a href="/cvs/aolserver/aolserver/nsd/conn.c#A_NsTclCheckConnId">NsTclCheckConnId</a>(interp, objv[1])) {
811 return TCL_ERROR;
812 }
813 if (<a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_NsTclGetConn">NsTclGetConn</a>((NsInterp *) arg, &conn) != TCL_OK) {
814 return TCL_ERROR;
815 }
816 if (<a href="/cvs/aolserver/aolserver/nsd/tclfile.c#A_Ns_TclGetOpenChannel">Ns_TclGetOpenChannel</a>(interp, Tcl_GetString(objv[objc-2]), 0, 1, &chan)
817 != TCL_OK) {
818 return TCL_ERROR;
819 }
820 if (Tcl_GetIntFromObj(interp, objv[objc-1], &len) != TCL_OK) {
821 return TCL_ERROR;
822 }
823 if (<a href="/cvs/aolserver/aolserver/nsd/connio.c#A_Ns_ConnSendChannel">Ns_ConnSendChannel</a>(conn, chan, len) != NS_OK) {
824 Tcl_AppendResult(interp, "could not send ",
825 Tcl_GetString(objv[objc-1]), " bytes from channel ",
826 Tcl_GetString(objv[objc-2]), NULL);
827 return TCL_ERROR;
828 }
829 return TCL_OK;
830 }
831
832
833 /*
834 *----------------------------------------------------------------------
835 *
836 * <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a> --
837 *
838 * Return a simple boolean result based on a connection response
839 * status code.
840 *
841 * Results:
842 * Always TCL_OK.
843 *
844 * Side effects:
845 * Will set interp result.
846 *
847 *----------------------------------------------------------------------
848 */
849
850 static int
851 <a href="/cvs/aolserver/aolserver/nsd/tclresp.c#A_Result">Result</a>(Tcl_Interp *interp, int result)
852 {
853 /* Tcl_SetBooleanObj(Tcl_GetObjResult(interp), result == NS_OK ? 1 : 0); */
854 Tcl_SetObjResult(interp, Tcl_NewBooleanObj((result == NS_OK ? 1 : 0)));
855 return TCL_OK;
856 }