]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/uip/RCS/send.c,v
sbr/mts.c: Delete mmdlm2; use same-valued mmdlm1 instead.
[nmh] / docs / historical / mh-6.8.5 / uip / RCS / send.c,v
1 head 1.14;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 1.14
9 date 95.12.06.21.04.47; author jromine; state Exp;
10 branches;
11 next 1.13;
12
13 1.13
14 date 95.12.06.19.20.22; author jromine; state Exp;
15 branches;
16 next 1.12;
17
18 1.12
19 date 92.12.15.00.20.22; author jromine; state Exp;
20 branches;
21 next 1.11;
22
23 1.11
24 date 92.11.04.02.58.40; author jromine; state Exp;
25 branches;
26 next 1.10;
27
28 1.10
29 date 92.11.04.01.02.08; author jromine; state Exp;
30 branches;
31 next 1.9;
32
33 1.9
34 date 92.10.16.21.37.36; author jromine; state Exp;
35 branches;
36 next 1.8;
37
38 1.8
39 date 92.10.16.16.52.07; author jromine; state Exp;
40 branches;
41 next 1.7;
42
43 1.7
44 date 92.02.11.00.37.37; author jromine; state Exp;
45 branches;
46 next 1.6;
47
48 1.6
49 date 92.02.10.17.33.44; author jromine; state Exp;
50 branches;
51 next 1.5;
52
53 1.5
54 date 92.01.31.22.26.58; author jromine; state Exp;
55 branches;
56 next 1.4;
57
58 1.4
59 date 92.01.31.16.34.50; author jromine; state Exp;
60 branches;
61 next 1.3;
62
63 1.3
64 date 90.04.05.15.03.46; author sources; state Exp;
65 branches;
66 next 1.2;
67
68 1.2
69 date 90.03.16.15.27.32; author sources; state Exp;
70 branches;
71 next 1.1;
72
73 1.1
74 date 90.03.13.14.21.40; author sources; state Exp;
75 branches;
76 next ;
77
78
79 desc
80 @@
81
82
83 1.14
84 log
85 @add hidden -queued (for post?)
86 @
87 text
88 @/* send.c - send a composed message */
89 #ifndef lint
90 static char ident[] = "@@(#)$Id: send.c,v 1.13 1995/12/06 19:20:22 jromine Exp jromine $";
91 #endif /* lint */
92
93 #include "../h/mh.h"
94 #include <errno.h>
95 #include <stdio.h>
96 #include <signal.h>
97 #include <sys/types.h>
98 #include <sys/stat.h>
99 #ifdef LOCALE
100 #include <locale.h>
101 #endif
102
103 /* \f */
104
105 #ifndef TMA
106 #define TMAminc(a) (a)
107 #else /* TMA */
108 #define TMAminc(a) 0
109 #endif /* TMA */
110
111 #ifdef MIME
112 #define MIMEminc(a) (a)
113 #else
114 #define MIMEminc(a) 0
115 #endif
116
117 static struct swit switches[] = {
118 #define ALIASW 0
119 "alias aliasfile", 0,
120
121 #define DEBUGSW 1
122 "debug", -5,
123
124 #define DRAFTSW 2
125 "draft", 0,
126
127 #define DFOLDSW 3
128 "draftfolder +folder", 6,
129 #define DMSGSW 4
130 "draftmessage msg", 6,
131 #define NDFLDSW 5
132 "nodraftfolder", 0,
133
134 #define ENCRSW 6
135 "encrypt", TMAminc (-7),
136 #define NENCRSW 7
137 "noencrypt", TMAminc (-9),
138
139 #define FILTSW 8
140 "filter filterfile", 0,
141 #define NFILTSW 9
142 "nofilter", 0,
143
144 #define FRMTSW 10
145 "format", 0,
146 #define NFRMTSW 11
147 "noformat", 0,
148
149 #define FORWSW 12
150 "forward", 0,
151 #define NFORWSW 13
152 "noforward", 0,
153
154 #define MIMESW 14
155 "mime", MIMEminc(-4),
156 #define NMIMESW 15
157 "nomime", MIMEminc(-6),
158
159 #define MSGDSW 16
160 "msgid", 0,
161 #define NMSGDSW 17
162 "nomsgid", 0,
163
164 #define PUSHSW 18
165 "push", 0,
166 #define NPUSHSW 19
167 "nopush", 0,
168
169 #define SPLITSW 20
170 "split seconds", MIMEminc(-5),
171
172 #define UNIQSW 21
173 "unique", -6,
174 #define NUNIQSW 22
175 "nounique", -8,
176
177 #define VERBSW 23
178 "verbose", 0,
179 #define NVERBSW 24
180 "noverbose", 0,
181
182 #define WATCSW 25
183 "watch", 0,
184 #define NWATCSW 26
185 "nowatch", 0,
186
187 #define WIDTHSW 27
188 "width columns", 0,
189
190 #define HELPSW 28
191 "help", 4,
192
193 #define MAILSW 29
194 "mail", -4,
195 #define SAMLSW 30
196 "saml", -4,
197 #define SENDSW 31
198 "send", -4,
199 #define SOMLSW 32
200 "soml", -4,
201
202 #define CLIESW 33
203 "client host", -6,
204 #define SERVSW 34
205 "server host", -6,
206 #define SNOOPSW 35
207 "snoop", -5,
208
209 #define QUEUESW 36
210 "queued", -6,
211
212 #define RECORSW 37
213 "record program", -6,
214 #define NRECOSW 38
215 "norecord", -8,
216
217 NULL, 0
218 };
219
220 static struct swit anyl[] = {
221 #define NOSW 0
222 "no", 0,
223 #define YESW 1
224 "yes", 0,
225 #define LISTDSW 2
226 "list", 0,
227
228 NULL, 0
229 };
230
231 /* \f */
232
233 extern int debugsw; /* from sendsbr.c */
234 extern int forwsw;
235 extern int inplace;
236 extern int mime;
237 extern int pushsw;
238 extern int splitsw;
239 extern int unique;
240 extern int verbsw;
241
242 extern char *altmsg; /* .. */
243 extern char *annotext;
244 extern char *distfile;
245
246
247 extern int errno;
248
249 /* \f */
250
251 /* ARGSUSED */
252
253 main (argc, argv)
254 int argc;
255 char *argv[];
256 {
257 int msgp = 0,
258 distsw = 0,
259 vecp = 1,
260 isdf = 0,
261 msgnum,
262 status;
263 char *cp,
264 *dfolder = NULL,
265 *maildir = NULL,
266 buf[100],
267 **ap,
268 **argp,
269 *arguments[MAXARGS],
270 *msgs[MAXARGS],
271 *vec[MAXARGS];
272 struct msgs *mp;
273 struct stat st;
274 #ifdef UCI
275 FILE *fp;
276 #endif /* UCI */
277
278 #ifdef LOCALE
279 setlocale(LC_ALL, "");
280 #endif
281 invo_name = r1bindex (argv[0], '/');
282 if ((cp = m_find (invo_name)) != NULL) {
283 ap = brkstring (cp = getcpy (cp), " ", "\n");
284 ap = copyip (ap, arguments);
285 }
286 else
287 ap = arguments;
288 (void) copyip (argv + 1, ap);
289 argp = arguments;
290
291 vec[vecp++] = "-library";
292 vec[vecp++] = getcpy (m_maildir (""));
293
294 /* \f */
295
296 while (cp = *argp++) {
297 if (*cp == '-')
298 switch (smatch (++cp, switches)) {
299 case AMBIGSW:
300 ambigsw (cp, switches);
301 done (1);
302 case UNKWNSW:
303 adios (NULLCP, "-%s unknown\n", cp);
304 case HELPSW:
305 (void) sprintf (buf, "%s [file] [switches]", invo_name);
306 help (buf, switches);
307 done (1); /* thanks, phyl */
308
309 case DRAFTSW:
310 msgs[msgp++] = draft;
311 continue;
312
313 case DFOLDSW:
314 if (dfolder)
315 adios (NULLCP, "only one draft folder at a time!");
316 if (!(cp = *argp++) || *cp == '-')
317 adios (NULLCP, "missing argument to %s", argp[-2]);
318 dfolder = path (*cp == '+' || *cp == '@@' ? cp + 1 : cp,
319 *cp != '@@' ? TFOLDER : TSUBCWF);
320 continue;
321 case DMSGSW:
322 if (!(cp = *argp++) || *cp == '-')
323 adios (NULLCP, "missing argument to %s", argp[-2]);
324 msgs[msgp++] = cp;
325 continue;
326 case NDFLDSW:
327 dfolder = NULL;
328 isdf = NOTOK;
329 continue;
330
331 case PUSHSW:
332 pushsw++;
333 continue;
334 case NPUSHSW:
335 pushsw = 0;
336 continue;
337
338 case SPLITSW:
339 if (!(cp = *argp++) || sscanf (cp, "%d", &splitsw) != 1)
340 adios (NULLCP, "missing argument to %s", argp[-2]);
341 continue;
342
343 case UNIQSW:
344 unique++;
345 continue;
346 case NUNIQSW:
347 unique = 0;
348 continue;
349
350 case FORWSW:
351 forwsw++;
352 continue;
353 case NFORWSW:
354 forwsw = 0;
355 continue;
356
357 case VERBSW:
358 verbsw++;
359 vec[vecp++] = --cp;
360 continue;
361 case NVERBSW:
362 verbsw = 0;
363 vec[vecp++] = --cp;
364 continue;
365
366 case MIMESW:
367 #ifdef MIME
368 mime++;
369 vec[vecp++] = --cp;
370 #endif
371 continue;
372 case NMIMESW:
373 #ifdef MIME
374 mime = 0;
375 vec[vecp++] = --cp;
376 #endif
377 continue;
378
379 case DEBUGSW:
380 debugsw++; /* fall */
381 case NFILTSW:
382 case FRMTSW:
383 case NFRMTSW:
384 case MSGDSW:
385 case NMSGDSW:
386 case WATCSW:
387 case NWATCSW:
388 case MAILSW:
389 case SAMLSW:
390 case SENDSW:
391 case SOMLSW:
392 case ENCRSW:
393 case NENCRSW:
394 case SNOOPSW:
395 case QUEUESW:
396 case NRECOSW:
397 vec[vecp++] = --cp;
398 continue;
399
400 case ALIASW:
401 case FILTSW:
402 case WIDTHSW:
403 case CLIESW:
404 case SERVSW:
405 case RECORSW:
406 vec[vecp++] = --cp;
407 if (!(cp = *argp++) || *cp == '-')
408 adios (NULLCP, "missing argument to %s", argp[-2]);
409 vec[vecp++] = cp;
410 continue;
411 }
412 else
413 msgs[msgp++] = cp;
414 }
415 if (cp = m_find ("Aliasfile")) { /* allow Aliasfile: profile entry */
416 char *dp = NULL;
417
418 for (ap = brkstring(dp = getcpy(cp), " ", "\n"); ap && *ap; ap++) {
419 vec[vecp++] = "-alias";
420 vec[vecp++] = *ap;
421 }
422 }
423
424 /* \f */
425
426 if (dfolder == NULL) {
427 if (msgp == 0) {
428 #ifdef WHATNOW
429 if ((cp = getenv ("mhdraft")) && *cp) {
430 msgs[msgp++] = cp;
431 goto go_to_it;
432 }
433 #endif /* WHATNOW */
434 msgs[msgp++] = getcpy (m_draft (NULLCP, NULLCP, 1, &isdf));
435 if (stat (msgs[0], &st) == NOTOK)
436 adios (msgs[0], "unable to stat draft file");
437 cp = concat ("Use \"", msgs[0], "\"? ", NULLCP);
438 for (status = LISTDSW; status != YESW;) {
439 if (!(argp = getans (cp, anyl)))
440 done (1);
441 switch (status = smatch (*argp, anyl)) {
442 case NOSW:
443 done (0);
444 case YESW:
445 break;
446 case LISTDSW:
447 (void) showfile (++argp, msgs[0]);
448 break;
449 default:
450 advise (NULLCP, "say what?");
451 break;
452 }
453 }
454 }
455 else
456 for (msgnum = 0; msgnum < msgp; msgnum++)
457 msgs[msgnum] = getcpy (m_maildir (msgs[msgnum]));
458 }
459 else {
460 if (!m_find ("path"))
461 free (path ("./", TFOLDER));
462
463 if (!msgp)
464 msgs[msgp++] = "cur";
465 maildir = m_maildir (dfolder);
466
467 if (chdir (maildir) == NOTOK)
468 adios (maildir, "unable to change directory to");
469 if (!(mp = m_gmsg (dfolder)))
470 adios (NULLCP, "unable to read folder %s", dfolder);
471 if (mp -> hghmsg == 0)
472 adios (NULLCP, "no messages in %s", dfolder);
473
474 for (msgnum = 0; msgnum < msgp; msgnum++)
475 if (!m_convert (mp, msgs[msgnum]))
476 done (1);
477 m_setseq (mp);
478
479 for (msgp = 0, msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
480 if (mp -> msgstats[msgnum] & SELECTED) {
481 msgs[msgp++] = getcpy (m_name (msgnum));
482 #ifdef notdef
483 mp -> msgstats[msgnum] |= DELETED;
484 #endif /* notdef */
485 mp -> msgstats[msgnum] &= ~EXISTS;
486 }
487 mp -> msgflags |= SEQMOD;
488
489 m_sync (mp);
490 }
491 #ifdef WHATNOW
492 go_to_it: ;
493 #endif /* WHATNOW */
494
495 /* \f */
496
497 #ifdef TMA
498 if ((cp = getenv ("KDS")) == NULL || *cp == 0)
499 if ((cp = m_find ("kdsproc")) && *cp)
500 (void) m_putenv ("KDS", cp);
501 if ((cp = getenv ("TMADB")) == NULL || *cp == 0)
502 if ((cp = m_find ("tmadb")) && *cp)
503 (void) m_putenv ("TMADB", m_maildir (cp));
504 #endif /* TMA */
505
506 if ((cp = getenv ("SIGNATURE")) == NULL || *cp == 0)
507 if ((cp = m_find ("signature")) && *cp)
508 (void) m_putenv ("SIGNATURE", cp);
509 #ifdef UCI
510 else {
511 (void) sprintf (buf, "%s/.signature", mypath);
512 if ((fp = fopen (buf, "r")) != NULL
513 && fgets (buf, sizeof buf, fp) != NULL) {
514 (void) fclose (fp);
515 if (cp = index (buf, '\n'))
516 *cp = 0;
517 (void) m_putenv ("SIGNATURE", buf);
518 }
519 }
520 #endif /* UCI */
521
522 for (msgnum = 0; msgnum < msgp; msgnum++)
523 if (stat (msgs[msgnum], &st) == NOTOK)
524 adios (msgs[msgnum], "unable to stat draft file");
525
526 if ((annotext = getenv ("mhannotate")) == NULL || *annotext == 0)
527 annotext = NULL;
528 if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != 0))
529 inplace = atoi (cp);
530 if ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == 0)
531 altmsg = NULL; /* used by dist interface - see below */
532
533 if ((cp = getenv ("mhdist"))
534 && *cp
535 && (distsw = atoi (cp))
536 && altmsg) {
537 vec[vecp++] = "-dist";
538 distfile = getcpy (m_scratch (altmsg, invo_name));
539 if (link (altmsg, distfile) == NOTOK) {
540 if (errno != EXDEV
541 #ifdef EISREMOTE
542 && errno != EISREMOTE
543 #endif /* EISREMOTE */
544 )
545 adios (distfile, "unable to link %s to", altmsg);
546 free (distfile);
547 distfile = getcpy (m_tmpfil (invo_name));
548 {
549 int in, out;
550 struct stat st;
551
552 if ((in = open (altmsg, 0)) == NOTOK)
553 adios (altmsg, "unable to open");
554 (void) fstat(in, &st);
555 if ((out = creat (distfile, (int) st.st_mode & 0777)) == NOTOK)
556 adios (distfile, "unable to write");
557 cpydata (in, out, altmsg, distfile);
558 (void) close (in);
559 (void) close (out);
560 }
561 }
562 }
563 else
564 distfile = NULL;
565
566 if (altmsg == NULL || stat (altmsg, &st) == NOTOK)
567 st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0;
568 if (pushsw)
569 push ();
570
571 status = 0;
572 vec[0] = r1bindex (postproc, '/');
573 closefds (3);
574
575 for (msgnum = 0; msgnum < msgp; msgnum++)
576 switch (sendsbr (vec, vecp, msgs[msgnum], &st)) {
577 case DONE:
578 done (++status);
579
580 case NOTOK:
581 status++; /* fall */
582 case OK:
583 break;
584 }
585
586 m_update ();
587
588 done (status);
589 }
590 @
591
592
593 1.13
594 log
595 @fixes from mtr
596 @
597 text
598 @d3 1
599 a3 1
600 static char ident[] = "@@(#)$Id: send.c,v 1.12 1992/12/15 00:20:22 jromine Exp jromine $";
601 d122 4
602 a125 1
603 #define RECORSW 36
604 d127 1
605 a127 1
606 #define NRECOSW 37
607 d308 1
608 @
609
610
611 1.12
612 log
613 @endif sugar
614 @
615 text
616 @d3 1
617 a3 1
618 static char ident[] = "@@(#)$Id: send.c,v 1.11 1992/11/04 02:58:40 jromine Exp jromine $";
619 d122 5
620 d305 1
621 d314 1
622 @
623
624
625 1.11
626 log
627 @m_putenv
628 @
629 text
630 @d3 2
631 a4 2
632 static char ident[] = "@@(#)$Id: send.c,v 1.10 1992/11/04 01:02:08 jromine Exp jromine $";
633 #endif lint
634 d20 1
635 a20 1
636 #else TMA
637 d22 1
638 a22 1
639 #endif TMA
640 d181 1
641 a181 1
642 #endif UCI
643 d335 1
644 a335 1
645 #endif WHATNOW
646 d386 1
647 a386 1
648 #endif notdef
649 d395 1
650 a395 1
651 #endif WHATNOW
652 d406 1
653 a406 1
654 #endif TMA
655 d422 1
656 a422 1
657 #endif UCI
658 d445 1
659 a445 1
660 #endif EISREMOTE
661 @
662
663
664 1.10
665 log
666 @LOCALE
667 putenv
668 @
669 text
670 @d3 1
671 a3 1
672 static char ident[] = "@@(#)$Id: send.c,v 1.9 1992/10/16 21:37:36 jromine Exp jromine $";
673 d402 1
674 a402 1
675 (void) putenv ("KDS", cp);
676 d405 1
677 a405 1
678 (void) putenv ("TMADB", m_maildir (cp));
679 d419 1
680 a419 1
681 (void) putenv ("SIGNATURE", buf);
682 @
683
684
685 1.9
686 log
687 @MIME changes
688 @
689 text
690 @d3 1
691 a3 1
692 static char ident[] = "@@(#)$Id: send.c,v 1.8 1992/10/16 16:52:07 jromine Exp jromine $";
693 d12 3
694 d183 3
695 d410 1
696 a410 1
697 (void) putenv ("SIGNATURE", cp);
698 @
699
700
701 1.8
702 log
703 @MIME ifdefs
704 @
705 text
706 @d3 1
707 a3 1
708 static char ident[] = "@@(#)$Id: send.c,v 1.7 1992/02/11 00:37:37 jromine Exp jromine $";
709 d64 6
710 a69 1
711 #define MSGDSW 14
712 d71 1
713 a71 1
714 #define NMSGDSW 15
715 d74 1
716 a74 1
717 #define PUSHSW 16
718 d76 1
719 a76 1
720 #define NPUSHSW 17
721 d79 1
722 a79 1
723 #define SPLITSW 18
724 d82 1
725 a82 1
726 #define UNIQSW 19
727 d84 1
728 a84 1
729 #define NUNIQSW 20
730 d87 1
731 a87 1
732 #define VERBSW 21
733 d89 1
734 a89 1
735 #define NVERBSW 22
736 d92 1
737 a92 1
738 #define WATCSW 23
739 d94 1
740 a94 1
741 #define NWATCSW 24
742 d97 1
743 a97 1
744 #define WIDTHSW 25
745 d100 1
746 a100 1
747 #define HELPSW 26
748 d103 1
749 a103 1
750 #define MAILSW 27
751 d105 1
752 a105 1
753 #define SAMLSW 28
754 d107 1
755 a107 1
756 #define SENDSW 29
757 d109 1
758 a109 1
759 #define SOMLSW 30
760 d112 1
761 a112 1
762 #define CLIESW 31
763 d114 1
764 a114 1
765 #define SERVSW 32
766 d116 1
767 a116 1
768 #define SNOOPSW 33
769 d138 1
770 d263 13
771 @
772
773
774 1.7
775 log
776 @get mhaltmsg for -dist
777 @
778 text
779 @d3 1
780 a3 1
781 static char ident[] = "@@(#)$Id: send.c,v 1.6 1992/02/10 17:33:44 jromine Exp jromine $";
782 d21 6
783 d75 1
784 a75 1
785 "split seconds", 0,
786 @
787
788
789 1.6
790 log
791 @allow "Aliasfile" to be multiple files
792 @
793 text
794 @d3 1
795 a3 1
796 static char ident[] = "@@(#)$Id: send.c,v 1.5 1992/01/31 22:26:58 jromine Exp jromine $";
797 a398 3
798 if (annotext
799 && ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == 0))
800 altmsg = NULL;
801 d401 2
802 @
803
804
805 1.5
806 log
807 @kerberos
808 @
809 text
810 @d3 1
811 a3 1
812 static char ident[] = "@@(#)$Id: send.c,v 1.4 1992/01/31 16:34:50 jromine Exp jromine $";
813 d287 6
814 a292 2
815 vec[vecp++] = "-alias";
816 vec[vecp++] = getcpy(cp);
817 @
818
819
820 1.4
821 log
822 @Multimedia MH
823 @
824 text
825 @d3 1
826 a3 1
827 static char ident[] = "@@(#)$Id: send.c,v 1.3 90/04/05 15:03:46 sources Exp $";
828 d108 1
829 a108 1
830 NULL, NULL
831 d119 1
832 a119 1
833 NULL, NULL
834 d365 1
835 a365 1
836 if ((cp = getenv ("KDS")) == NULL || *cp == NULL)
837 d368 1
838 a368 1
839 if ((cp = getenv ("TMADB")) == NULL || *cp == NULL)
840 d373 1
841 a373 1
842 if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL)
843 d383 1
844 a383 1
845 *cp = NULL;
846 d393 1
847 a393 1
848 if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL)
849 d396 1
850 a396 1
851 && ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL))
852 d398 1
853 a398 1
854 if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL))
855 @
856
857
858 1.3
859 log
860 @add ID
861 @
862 text
863 @d3 1
864 a3 1
865 static char ident[] = "@@(#)$Id:$";
866 d68 4
867 a71 1
868 #define UNIQSW 18
869 d73 1
870 a73 1
871 #define NUNIQSW 19
872 d76 1
873 a76 1
874 #define VERBSW 20
875 d78 1
876 a78 1
877 #define NVERBSW 21
878 d81 1
879 a81 1
880 #define WATCSW 22
881 d83 1
882 a83 1
883 #define NWATCSW 23
884 d86 1
885 a86 1
886 #define WIDTHSW 24
887 d89 1
888 a89 1
889 #define HELPSW 25
890 d92 1
891 a92 1
892 #define MAILSW 26
893 d94 1
894 a94 1
895 #define SAMLSW 27
896 d96 1
897 a96 1
898 #define SENDSW 28
899 d98 1
900 a98 1
901 #define SOMLSW 29
902 d101 1
903 a101 1
904 #define CLIESW 30
905 d103 1
906 a103 1
907 #define SERVSW 31
908 d105 1
909 a105 1
910 #define SNOOPSW 32
911 d128 1
912 d130 1
913 d225 5
914 d244 9
915 a259 2
916 case VERBSW:
917 case NVERBSW:
918 @
919
920
921 1.2
922 log
923 @add "Aliasfile: file" profile entry (like -alias file)
924 @
925 text
926 @d2 3
927 @
928
929
930 1.1
931 log
932 @Initial revision
933 @
934 text
935 @d266 4
936 @