Fossil SCM

The email-server enhancements are far from complete, but they at least compile now on non-linux systems, so it seems safe to merge the existing skeleton to trunk and continue development there where it can be more easily tested on live systems.

drh 2018-07-11 19:55 trunk merge
Commit 0a201f7159b88336c61841c4f7bc59dbe2d926f1ccf0d67aee65bb9923a8f3fd
+1
--- auto.def
+++ auto.def
@@ -478,10 +478,11 @@
478478
# Last resort, may be Windows
479479
if {[is_mingw]} {
480480
define-append LIBS -lwsock32
481481
}
482482
}
483
+cc-check-function-in-lib ns_name_uncompress resolv
483484
cc-check-functions utime
484485
cc-check-functions usleep
485486
cc-check-functions strchrnul
486487
cc-check-functions pledge
487488
488489
--- auto.def
+++ auto.def
@@ -478,10 +478,11 @@
478 # Last resort, may be Windows
479 if {[is_mingw]} {
480 define-append LIBS -lwsock32
481 }
482 }
 
483 cc-check-functions utime
484 cc-check-functions usleep
485 cc-check-functions strchrnul
486 cc-check-functions pledge
487
488
--- auto.def
+++ auto.def
@@ -478,10 +478,11 @@
478 # Last resort, may be Windows
479 if {[is_mingw]} {
480 define-append LIBS -lwsock32
481 }
482 }
483 cc-check-function-in-lib ns_name_uncompress resolv
484 cc-check-functions utime
485 cc-check-functions usleep
486 cc-check-functions strchrnul
487 cc-check-functions pledge
488
489
+213 -32
--- src/email.c
+++ src/email.c
@@ -13,11 +13,11 @@
1313
** [email protected]
1414
** http://www.hwaci.com/drh/
1515
**
1616
*******************************************************************************
1717
**
18
-** Email notification features
18
+** Logic for email notification, also known as "alerts".
1919
*/
2020
#include "config.h"
2121
#include "email.h"
2222
#include <assert.h>
2323
#include <time.h>
@@ -181,21 +181,22 @@
181181
}
182182
}
183183
184184
185185
/*
186
-** WEBPAGE: setup_email
186
+** WEBPAGE: setup_notification
187187
**
188188
** Administrative page for configuring and controlling email notification.
189
-** Normally accessible via the /Admin/Email menu.
189
+** Normally accessible via the /Admin/Notification menu.
190190
*/
191
-void setup_email(void){
191
+void setup_notification(void){
192192
static const char *const azSendMethods[] = {
193
- "off", "Disabled",
194
- "pipe", "Pipe to a command",
195
- "db", "Store in a database",
196
- "dir", "Store in a directory"
193
+ "off", "Disabled",
194
+ "pipe", "Pipe to a command",
195
+ "db", "Store in a database",
196
+ "dir", "Store in a directory",
197
+ "relay", "SMTP relay"
197198
};
198199
login_check_credentials();
199200
if( !g.perm.Setup ){
200201
login_needed(0);
201202
return;
@@ -202,11 +203,11 @@
202203
}
203204
db_begin_transaction();
204205
205206
email_submenu_common();
206207
style_header("Email Notification Setup");
207
- @ <form action="%R/setup_email" method="post"><div>
208
+ @ <form action="%R/setup_notification" method="post"><div>
208209
@ <input type="submit" name="submit" value="Apply Changes" /><hr>
209210
login_insert_csrf_secret();
210211
211212
entry_attribute("Canonical Server URL", 40, "email-url",
212213
"eurl", "", 0);
@@ -244,17 +245,14 @@
244245
@ (Property: "email-autoexec")</p>
245246
@ <hr>
246247
247248
multiple_choice_attribute("Email Send Method", "email-send-method", "esm",
248249
"off", count(azSendMethods)/2, azSendMethods);
249
- @ <p>How to send email. The "Pipe to a command"
250
- @ method is the usual choice in production.
251
- @ (Property: "email-send-method")</p>
252
- @ <hr>
250
+ @ <p>How to send email. Requires auxiliary information from the fields
251
+ @ that follow. (Property: "email-send-method")</p>
253252
email_schema(1);
254
-
255
- entry_attribute("Command To Pipe Email To", 80, "email-send-command",
253
+ entry_attribute("Command To Pipe Email To", 60, "email-send-command",
256254
"ecmd", "sendmail -t", 0);
257255
@ <p>When the send method is "pipe to a command", this is the command
258256
@ that is run. Email messages are piped into the standard input of this
259257
@ command. The command is expected to extract the sender address,
260258
@ recepient addresses, and subject from the header of the piped email
@@ -269,10 +267,19 @@
269267
entry_attribute("Directory In Which To Store Email", 60, "email-send-dir",
270268
"esdir", "", 0);
271269
@ <p>When the send method is "store in a directory", each email message is
272270
@ stored as a separate file in the directory shown here.
273271
@ (Property: "email-send-dir")</p>
272
+
273
+ entry_attribute("SMTP relay host", 60, "email-send-relayhost",
274
+ "esrh", "", 0);
275
+ @ <p>When the send method is "SMTP relay", each email message is
276
+ @ transmitted via the SMTP protocol (rfc5321) to a "Mail Submission
277
+ @ Agent" or "MSA" (rfc4409) at the hostname shown here. Optionally
278
+ @ append a colon and TCP port number (ex: smtp.example.com:587).
279
+ @ The default TCP port number is 25.
280
+ @ (Property: "email-send-relayhost")</p>
274281
@ <hr>
275282
276283
entry_attribute("Administrator email address", 40, "email-admin",
277284
"eadmin", "", 0);
278285
@ <p>This is the email for the human administrator for the system.
@@ -376,14 +383,21 @@
376383
const char *zDest; /* How to send email. */
377384
const char *zDb; /* Name of database file */
378385
const char *zDir; /* Directory in which to store as email files */
379386
const char *zCmd; /* Command to run for each email */
380387
const char *zFrom; /* Emails come from here */
388
+ SmtpSession *pSmtp; /* SMTP relay connection */
381389
Blob out; /* For zDest=="blob" */
382390
char *zErr; /* Error message */
391
+ u32 mFlags; /* Flags */
383392
int bImmediateFail; /* On any error, call fossil_fatal() */
384393
};
394
+
395
+/* Allowed values for EmailSender flags */
396
+#define EMAIL_IMMEDIATE_FAIL 0x0001 /* Call fossil_fatal() on any error */
397
+#define EMAIL_SMTP_TRACE 0x0002 /* Write SMTP transcript to console */
398
+
385399
#endif /* INTERFACE */
386400
387401
/*
388402
** Shutdown an emailer. Clear all information other than the error message.
389403
*/
@@ -393,12 +407,16 @@
393407
sqlite3_close(p->db);
394408
p->db = 0;
395409
p->zDb = 0;
396410
p->zDir = 0;
397411
p->zCmd = 0;
398
- p->zDest = "off";
399
- blob_zero(&p->out);
412
+ if( p->pSmtp ){
413
+ smtp_client_quit(p->pSmtp);
414
+ smtp_session_free(p->pSmtp);
415
+ p->pSmtp = 0;
416
+ }
417
+ blob_reset(&p->out);
400418
}
401419
402420
/*
403421
** Put the EmailSender into an error state.
404422
*/
@@ -407,11 +425,11 @@
407425
fossil_free(p->zErr);
408426
va_start(ap, zFormat);
409427
p->zErr = vmprintf(zFormat, ap);
410428
va_end(ap);
411429
emailerShutdown(p);
412
- if( p->bImmediateFail ){
430
+ if( p->mFlags & EMAIL_IMMEDIATE_FAIL ){
413431
fossil_fatal("%s", p->zErr);
414432
}
415433
}
416434
417435
/*
@@ -455,16 +473,17 @@
455473
** zAltDest to cause all emails to be printed to the console for
456474
** debugging purposes.
457475
**
458476
** The EmailSender object returned must be freed using email_sender_free().
459477
*/
460
-EmailSender *email_sender_new(const char *zAltDest, int bImmediateFail){
478
+EmailSender *email_sender_new(const char *zAltDest, u32 mFlags){
461479
EmailSender *p;
462480
463481
p = fossil_malloc(sizeof(*p));
464482
memset(p, 0, sizeof(*p));
465
- p->bImmediateFail = bImmediateFail;
483
+ blob_init(&p->out, 0, 0);
484
+ p->mFlags = mFlags;
466485
if( zAltDest ){
467486
p->zDest = zAltDest;
468487
}else{
469488
p->zDest = db_get("email-send-method","off");
470489
}
@@ -499,13 +518,149 @@
499518
emailerGetSetting(p, &p->zCmd, "email-send-command");
500519
}else if( fossil_strcmp(p->zDest, "dir")==0 ){
501520
emailerGetSetting(p, &p->zDir, "email-send-dir");
502521
}else if( fossil_strcmp(p->zDest, "blob")==0 ){
503522
blob_init(&p->out, 0, 0);
523
+ }else if( fossil_strcmp(p->zDest, "relay")==0 ){
524
+ const char *zRelay = 0;
525
+ emailerGetSetting(p, &zRelay, "email-send-relayhost");
526
+ if( zRelay ){
527
+ u32 smtpFlags = SMTP_DIRECT;
528
+ if( mFlags & EMAIL_SMTP_TRACE ) smtpFlags |= SMTP_TRACE_STDOUT;
529
+ p->pSmtp = smtp_session_new(p->zFrom, zRelay, smtpFlags);
530
+ smtp_client_startup(p->pSmtp);
531
+ }
504532
}
505533
return p;
506534
}
535
+
536
+/*
537
+** Scan the header of the email message in pMsg looking for the
538
+** (first) occurrance of zField. Fill pValue with the content of
539
+** that field.
540
+**
541
+** This routine initializes pValue. Any prior content of pValue is
542
+** discarded (leaked).
543
+**
544
+** Return non-zero on success. Return 0 if no instance of the header
545
+** is found.
546
+*/
547
+int email_header_value(Blob *pMsg, const char *zField, Blob *pValue){
548
+ int nField = (int)strlen(zField);
549
+ Blob line;
550
+ blob_rewind(pMsg);
551
+ blob_init(pValue,0,0);
552
+ while( blob_line(pMsg, &line) ){
553
+ int n, i;
554
+ char *z;
555
+ blob_trim(&line);
556
+ n = blob_size(&line);
557
+ if( n==0 ) return 0;
558
+ if( n<nField+1 ) continue;
559
+ z = blob_buffer(&line);
560
+ if( sqlite3_strnicmp(z, zField, nField)==0 && z[nField]==':' ){
561
+ for(i=nField+1; i<n && fossil_isspace(z[i]); i++){}
562
+ blob_init(pValue, z+i, n-i);
563
+ while( blob_line(pMsg, &line) ){
564
+ blob_trim(&line);
565
+ n = blob_size(&line);
566
+ if( n==0 ) break;
567
+ z = blob_buffer(&line);
568
+ if( !fossil_isspace(z[0]) ) break;
569
+ for(i=1; i<n && fossil_isspace(z[i]); i++){}
570
+ blob_append(pValue, " ", 1);
571
+ blob_append(pValue, z+i, n-i);
572
+ }
573
+ return 1;
574
+ }
575
+ }
576
+ return 0;
577
+}
578
+
579
+/*
580
+** Make a copy of the input string up to but not including the
581
+** first ">" character.
582
+**
583
+** Verify that the string really that is to be copied really is a
584
+** valid email address. If it is not, then return NULL.
585
+**
586
+** This routine is more restrictive than necessary. It does not
587
+** allow comments, IP address, quoted strings, or certain uncommon
588
+** characters. The only non-alphanumerics allowed in the local
589
+** part are "_", "+", "-" and "+".
590
+*/
591
+char *email_copy_addr(const char *z){
592
+ int i;
593
+ int nAt = 0;
594
+ int nDot = 0;
595
+ char c;
596
+ if( z[0]=='.' ) return 0; /* Local part cannot begin with "." */
597
+ for(i=0; (c = z[i])!=0 && c!='>'; i++){
598
+ if( fossil_isalnum(c) ){
599
+ /* Alphanumerics are always ok */
600
+ }else if( c=='@' ){
601
+ if( nAt ) return 0; /* Only a single "@" allowed */
602
+ if( i>64 ) return 0; /* Local part too big */
603
+ nAt = 1;
604
+ nDot = 0;
605
+ if( i==0 ) return 0; /* Disallow empty local part */
606
+ if( z[i-1]=='.' ) return 0; /* Last char of local cannot be "." */
607
+ if( z[i+1]=='.' || z[i+1]=='-' ){
608
+ return 0; /* Domain cannot begin with "." or "-" */
609
+ }
610
+ }else if( c=='-' ){
611
+ if( z[i+1]=='>' ) return 0; /* Last character cannot be "-" */
612
+ }else if( c=='.' ){
613
+ if( z[i+1]=='.' ) return 0; /* Do not allow ".." */
614
+ if( z[i+1]=='>' ) return 0; /* Domain may not end with . */
615
+ nDot++;
616
+ }else if( (c=='_' || c=='+') && nAt==0 ){
617
+ /* _ and + are ok in the local part */
618
+ }else{
619
+ return 0; /* Anything else is an error */
620
+ }
621
+ }
622
+ if( c!='>' ) return 0; /* Missing final ">" */
623
+ if( nAt==0 ) return 0; /* No "@" found anywhere */
624
+ if( nDot==0 ) return 0; /* No "." in the domain */
625
+
626
+ /* If we reach this point, the email address is valid */
627
+ return mprintf("%.*s", i, z);
628
+}
629
+
630
+/*
631
+** Extract all To: header values from the email header supplied.
632
+** Store them in the array list.
633
+*/
634
+void email_header_to(Blob *pMsg, int *pnTo, char ***pazTo){
635
+ int nTo = 0;
636
+ char **azTo = 0;
637
+ Blob v;
638
+ char *z, *zAddr;
639
+ int i;
640
+
641
+ email_header_value(pMsg, "to", &v);
642
+ z = blob_str(&v);
643
+ for(i=0; z[i]; i++){
644
+ if( z[i]=='<' && (zAddr = email_copy_addr(&z[i+1]))!=0 ){
645
+ azTo = fossil_realloc(azTo, sizeof(azTo[0])*(nTo+1) );
646
+ azTo[nTo++] = zAddr;
647
+ }
648
+ }
649
+ *pnTo = nTo;
650
+ *pazTo = azTo;
651
+}
652
+
653
+/*
654
+** Free a list of To addresses obtained from a prior call to
655
+** email_header_to()
656
+*/
657
+void email_header_to_free(int nTo, char **azTo){
658
+ int i;
659
+ for(i=0; i<nTo; i++) fossil_free(azTo[i]);
660
+ fossil_free(azTo);
661
+}
507662
508663
/*
509664
** Send a single email message.
510665
**
511666
** The recepient(s) must be specified using "To:" or "Cc:" or "Bcc:" fields
@@ -579,15 +734,31 @@
579734
}
580735
}else if( p->zDir ){
581736
char *zFile = emailTempFilename(p->zDir);
582737
blob_write_to_file(&all, zFile);
583738
fossil_free(zFile);
739
+ }else if( p->pSmtp ){
740
+ char **azTo = 0;
741
+ int nTo = 0;
742
+ email_header_to(pHdr, &nTo, &azTo);
743
+ if( nTo>0 ){
744
+ smtp_send_msg(p->pSmtp, p->zFrom, nTo, (const char**)azTo,blob_str(&all));
745
+ email_header_to_free(nTo, azTo);
746
+ }
584747
}else if( strcmp(p->zDest, "stdout")==0 ){
748
+ char **azTo = 0;
749
+ int nTo = 0;
750
+ int i;
751
+ email_header_to(pHdr, &nTo, &azTo);
752
+ for(i=0; i<nTo; i++){
753
+ fossil_print("X-To-Test-%d: [%s]\r\n", i, azTo[i]);
754
+ }
755
+ email_header_to_free(nTo, azTo);
585756
blob_add_final_newline(&all);
586757
fossil_print("%s", blob_str(&all));
587758
}
588
- blob_zero(&all);
759
+ blob_reset(&all);
589760
}
590761
591762
/*
592763
** Analyze and act on a received email.
593764
**
@@ -597,11 +768,11 @@
597768
** This routine acts on all email messages received from the
598769
** "fossil email inbound" command.
599770
*/
600771
void email_receive(Blob *pMsg){
601772
/* To Do: Look for bounce messages and possibly disable subscriptions */
602
- blob_zero(pMsg);
773
+ blob_reset(pMsg);
603774
}
604775
605776
/*
606777
** SETTING: email-send-method width=5 default=off
607778
** Determine the method used to send email. Allowed values are
@@ -640,10 +811,17 @@
640811
** SETTING: email-receive-dir width=40
641812
** Inbound email messages are saved as separate files in this directory,
642813
** for debugging analysis. Disable saving of inbound emails omitting
643814
** this setting, or making it an empty string.
644815
*/
816
+/*
817
+** SETTING: email-send-relayhost width=40
818
+** This is the hostname and TCP port to which output email messages
819
+** are sent when email-send-method is "relay". There should be an
820
+** SMTP server configured as a Mail Submission Agent listening on the
821
+** designated host and port and all times.
822
+*/
645823
646824
647825
/*
648826
** COMMAND: email
649827
**
@@ -672,10 +850,11 @@
672850
** email sending mechanism is currently configured.
673851
** Use this for testing the email configuration.
674852
** Options:
675853
**
676854
** --body FILENAME
855
+** --smtp-trace
677856
** --stdout
678857
** --subject|-S SUBJECT
679858
**
680859
** settings [NAME VALUE] With no arguments, list all email settings.
681860
** Or change the value of a single email setting.
@@ -727,11 +906,11 @@
727906
"This will erase all content in the repository tables, thus\n"
728907
"deleting all subscriber information. The information will be\n"
729908
"unrecoverable.\n");
730909
prompt_user("Continue? (y/N) ", &yn);
731910
c = blob_str(&yn)[0];
732
- blob_zero(&yn);
911
+ blob_reset(&yn);
733912
}
734913
if( c=='y' ){
735914
email_triggers_disable();
736915
db_multi_exec(
737916
"DROP TABLE IF EXISTS subscriber;\n"
@@ -746,13 +925,15 @@
746925
}else
747926
if( strncmp(zCmd, "send", nCmd)==0 ){
748927
Blob prompt, body, hdr;
749928
const char *zDest = find_option("stdout",0,0)!=0 ? "stdout" : 0;
750929
int i;
930
+ u32 mFlags = EMAIL_IMMEDIATE_FAIL;
751931
const char *zSubject = find_option("subject", "S", 1);
752932
const char *zSource = find_option("body", 0, 1);
753933
EmailSender *pSender;
934
+ if( find_option("smtp-trace",0,0)!=0 ) mFlags |= EMAIL_SMTP_TRACE;
754935
verify_all_options();
755936
blob_init(&prompt, 0, 0);
756937
blob_init(&body, 0, 0);
757938
blob_init(&hdr, 0, 0);
758939
blob_appendf(&hdr,"To: ");
@@ -768,16 +949,16 @@
768949
blob_read_from_file(&body, zSource, ExtFILE);
769950
}else{
770951
prompt_for_user_comment(&body, &prompt);
771952
}
772953
blob_add_final_newline(&body);
773
- pSender = email_sender_new(zDest, 1);
954
+ pSender = email_sender_new(zDest, mFlags);
774955
email_send(pSender, &hdr, &body);
775956
email_sender_free(pSender);
776
- blob_zero(&hdr);
777
- blob_zero(&body);
778
- blob_zero(&prompt);
957
+ blob_reset(&hdr);
958
+ blob_reset(&body);
959
+ blob_reset(&prompt);
779960
}else
780961
if( strncmp(zCmd, "settings", nCmd)==0 ){
781962
int isGlobal = find_option("global",0,0)!=0;
782963
int nSetting;
783964
const Setting *pSetting = setting_info(&nSetting);
@@ -1018,11 +1199,11 @@
10181199
/* We need to send a verification email */
10191200
Blob hdr, body;
10201201
EmailSender *pSender = email_sender_new(0,0);
10211202
blob_init(&hdr,0,0);
10221203
blob_init(&body,0,0);
1023
- blob_appendf(&hdr, "To: %s\n", zEAddr);
1204
+ blob_appendf(&hdr, "To: <%s>\n", zEAddr);
10241205
blob_appendf(&hdr, "Subject: Subscription verification\n");
10251206
blob_appendf(&body, zConfirmMsg/*works-like:"%s%s%s"*/,
10261207
g.zBaseURL, g.zBaseURL, zCode);
10271208
email_send(pSender, &hdr, &body);
10281209
style_header("Email Alert Verification");
@@ -1582,11 +1763,11 @@
15821763
** Free a linked list of EmailEvent objects
15831764
*/
15841765
void email_free_eventlist(EmailEvent *p){
15851766
while( p ){
15861767
EmailEvent *pNext = p->pNext;
1587
- blob_zero(&p->txt);
1768
+ blob_reset(&p->txt);
15881769
fossil_free(p);
15891770
p = pNext;
15901771
}
15911772
}
15921773
@@ -1715,11 +1896,11 @@
17151896
blob_append(&out, blob_buffer(&p->txt), blob_size(&p->txt));
17161897
}
17171898
email_free_eventlist(pEvent);
17181899
email_footer(&out);
17191900
fossil_print("%s", blob_str(&out));
1720
- blob_zero(&out);
1901
+ blob_reset(&out);
17211902
db_end_transaction(0);
17221903
}
17231904
17241905
/*
17251906
** COMMAND: test-add-alerts
@@ -1837,12 +2018,12 @@
18372018
zUrl, zCode);
18382019
email_send(pSender,&hdr,&body);
18392020
blob_truncate(&hdr, 0);
18402021
blob_truncate(&body, 0);
18412022
}
1842
- blob_zero(&hdr);
1843
- blob_zero(&body);
2023
+ blob_reset(&hdr);
2024
+ blob_reset(&body);
18442025
db_finalize(&q);
18452026
email_free_eventlist(pEvents);
18462027
if( (flags & SENDALERT_PRESERVE)==0 ){
18472028
if( flags & SENDALERT_DIGEST ){
18482029
db_multi_exec("UPDATE pending_alert SET sentDigest=true");
18492030
--- src/email.c
+++ src/email.c
@@ -13,11 +13,11 @@
13 ** [email protected]
14 ** http://www.hwaci.com/drh/
15 **
16 *******************************************************************************
17 **
18 ** Email notification features
19 */
20 #include "config.h"
21 #include "email.h"
22 #include <assert.h>
23 #include <time.h>
@@ -181,21 +181,22 @@
181 }
182 }
183
184
185 /*
186 ** WEBPAGE: setup_email
187 **
188 ** Administrative page for configuring and controlling email notification.
189 ** Normally accessible via the /Admin/Email menu.
190 */
191 void setup_email(void){
192 static const char *const azSendMethods[] = {
193 "off", "Disabled",
194 "pipe", "Pipe to a command",
195 "db", "Store in a database",
196 "dir", "Store in a directory"
 
197 };
198 login_check_credentials();
199 if( !g.perm.Setup ){
200 login_needed(0);
201 return;
@@ -202,11 +203,11 @@
202 }
203 db_begin_transaction();
204
205 email_submenu_common();
206 style_header("Email Notification Setup");
207 @ <form action="%R/setup_email" method="post"><div>
208 @ <input type="submit" name="submit" value="Apply Changes" /><hr>
209 login_insert_csrf_secret();
210
211 entry_attribute("Canonical Server URL", 40, "email-url",
212 "eurl", "", 0);
@@ -244,17 +245,14 @@
244 @ (Property: "email-autoexec")</p>
245 @ <hr>
246
247 multiple_choice_attribute("Email Send Method", "email-send-method", "esm",
248 "off", count(azSendMethods)/2, azSendMethods);
249 @ <p>How to send email. The "Pipe to a command"
250 @ method is the usual choice in production.
251 @ (Property: "email-send-method")</p>
252 @ <hr>
253 email_schema(1);
254
255 entry_attribute("Command To Pipe Email To", 80, "email-send-command",
256 "ecmd", "sendmail -t", 0);
257 @ <p>When the send method is "pipe to a command", this is the command
258 @ that is run. Email messages are piped into the standard input of this
259 @ command. The command is expected to extract the sender address,
260 @ recepient addresses, and subject from the header of the piped email
@@ -269,10 +267,19 @@
269 entry_attribute("Directory In Which To Store Email", 60, "email-send-dir",
270 "esdir", "", 0);
271 @ <p>When the send method is "store in a directory", each email message is
272 @ stored as a separate file in the directory shown here.
273 @ (Property: "email-send-dir")</p>
 
 
 
 
 
 
 
 
 
274 @ <hr>
275
276 entry_attribute("Administrator email address", 40, "email-admin",
277 "eadmin", "", 0);
278 @ <p>This is the email for the human administrator for the system.
@@ -376,14 +383,21 @@
376 const char *zDest; /* How to send email. */
377 const char *zDb; /* Name of database file */
378 const char *zDir; /* Directory in which to store as email files */
379 const char *zCmd; /* Command to run for each email */
380 const char *zFrom; /* Emails come from here */
 
381 Blob out; /* For zDest=="blob" */
382 char *zErr; /* Error message */
 
383 int bImmediateFail; /* On any error, call fossil_fatal() */
384 };
 
 
 
 
 
385 #endif /* INTERFACE */
386
387 /*
388 ** Shutdown an emailer. Clear all information other than the error message.
389 */
@@ -393,12 +407,16 @@
393 sqlite3_close(p->db);
394 p->db = 0;
395 p->zDb = 0;
396 p->zDir = 0;
397 p->zCmd = 0;
398 p->zDest = "off";
399 blob_zero(&p->out);
 
 
 
 
400 }
401
402 /*
403 ** Put the EmailSender into an error state.
404 */
@@ -407,11 +425,11 @@
407 fossil_free(p->zErr);
408 va_start(ap, zFormat);
409 p->zErr = vmprintf(zFormat, ap);
410 va_end(ap);
411 emailerShutdown(p);
412 if( p->bImmediateFail ){
413 fossil_fatal("%s", p->zErr);
414 }
415 }
416
417 /*
@@ -455,16 +473,17 @@
455 ** zAltDest to cause all emails to be printed to the console for
456 ** debugging purposes.
457 **
458 ** The EmailSender object returned must be freed using email_sender_free().
459 */
460 EmailSender *email_sender_new(const char *zAltDest, int bImmediateFail){
461 EmailSender *p;
462
463 p = fossil_malloc(sizeof(*p));
464 memset(p, 0, sizeof(*p));
465 p->bImmediateFail = bImmediateFail;
 
466 if( zAltDest ){
467 p->zDest = zAltDest;
468 }else{
469 p->zDest = db_get("email-send-method","off");
470 }
@@ -499,13 +518,149 @@
499 emailerGetSetting(p, &p->zCmd, "email-send-command");
500 }else if( fossil_strcmp(p->zDest, "dir")==0 ){
501 emailerGetSetting(p, &p->zDir, "email-send-dir");
502 }else if( fossil_strcmp(p->zDest, "blob")==0 ){
503 blob_init(&p->out, 0, 0);
 
 
 
 
 
 
 
 
 
504 }
505 return p;
506 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
508 /*
509 ** Send a single email message.
510 **
511 ** The recepient(s) must be specified using "To:" or "Cc:" or "Bcc:" fields
@@ -579,15 +734,31 @@
579 }
580 }else if( p->zDir ){
581 char *zFile = emailTempFilename(p->zDir);
582 blob_write_to_file(&all, zFile);
583 fossil_free(zFile);
 
 
 
 
 
 
 
 
584 }else if( strcmp(p->zDest, "stdout")==0 ){
 
 
 
 
 
 
 
 
585 blob_add_final_newline(&all);
586 fossil_print("%s", blob_str(&all));
587 }
588 blob_zero(&all);
589 }
590
591 /*
592 ** Analyze and act on a received email.
593 **
@@ -597,11 +768,11 @@
597 ** This routine acts on all email messages received from the
598 ** "fossil email inbound" command.
599 */
600 void email_receive(Blob *pMsg){
601 /* To Do: Look for bounce messages and possibly disable subscriptions */
602 blob_zero(pMsg);
603 }
604
605 /*
606 ** SETTING: email-send-method width=5 default=off
607 ** Determine the method used to send email. Allowed values are
@@ -640,10 +811,17 @@
640 ** SETTING: email-receive-dir width=40
641 ** Inbound email messages are saved as separate files in this directory,
642 ** for debugging analysis. Disable saving of inbound emails omitting
643 ** this setting, or making it an empty string.
644 */
 
 
 
 
 
 
 
645
646
647 /*
648 ** COMMAND: email
649 **
@@ -672,10 +850,11 @@
672 ** email sending mechanism is currently configured.
673 ** Use this for testing the email configuration.
674 ** Options:
675 **
676 ** --body FILENAME
 
677 ** --stdout
678 ** --subject|-S SUBJECT
679 **
680 ** settings [NAME VALUE] With no arguments, list all email settings.
681 ** Or change the value of a single email setting.
@@ -727,11 +906,11 @@
727 "This will erase all content in the repository tables, thus\n"
728 "deleting all subscriber information. The information will be\n"
729 "unrecoverable.\n");
730 prompt_user("Continue? (y/N) ", &yn);
731 c = blob_str(&yn)[0];
732 blob_zero(&yn);
733 }
734 if( c=='y' ){
735 email_triggers_disable();
736 db_multi_exec(
737 "DROP TABLE IF EXISTS subscriber;\n"
@@ -746,13 +925,15 @@
746 }else
747 if( strncmp(zCmd, "send", nCmd)==0 ){
748 Blob prompt, body, hdr;
749 const char *zDest = find_option("stdout",0,0)!=0 ? "stdout" : 0;
750 int i;
 
751 const char *zSubject = find_option("subject", "S", 1);
752 const char *zSource = find_option("body", 0, 1);
753 EmailSender *pSender;
 
754 verify_all_options();
755 blob_init(&prompt, 0, 0);
756 blob_init(&body, 0, 0);
757 blob_init(&hdr, 0, 0);
758 blob_appendf(&hdr,"To: ");
@@ -768,16 +949,16 @@
768 blob_read_from_file(&body, zSource, ExtFILE);
769 }else{
770 prompt_for_user_comment(&body, &prompt);
771 }
772 blob_add_final_newline(&body);
773 pSender = email_sender_new(zDest, 1);
774 email_send(pSender, &hdr, &body);
775 email_sender_free(pSender);
776 blob_zero(&hdr);
777 blob_zero(&body);
778 blob_zero(&prompt);
779 }else
780 if( strncmp(zCmd, "settings", nCmd)==0 ){
781 int isGlobal = find_option("global",0,0)!=0;
782 int nSetting;
783 const Setting *pSetting = setting_info(&nSetting);
@@ -1018,11 +1199,11 @@
1018 /* We need to send a verification email */
1019 Blob hdr, body;
1020 EmailSender *pSender = email_sender_new(0,0);
1021 blob_init(&hdr,0,0);
1022 blob_init(&body,0,0);
1023 blob_appendf(&hdr, "To: %s\n", zEAddr);
1024 blob_appendf(&hdr, "Subject: Subscription verification\n");
1025 blob_appendf(&body, zConfirmMsg/*works-like:"%s%s%s"*/,
1026 g.zBaseURL, g.zBaseURL, zCode);
1027 email_send(pSender, &hdr, &body);
1028 style_header("Email Alert Verification");
@@ -1582,11 +1763,11 @@
1582 ** Free a linked list of EmailEvent objects
1583 */
1584 void email_free_eventlist(EmailEvent *p){
1585 while( p ){
1586 EmailEvent *pNext = p->pNext;
1587 blob_zero(&p->txt);
1588 fossil_free(p);
1589 p = pNext;
1590 }
1591 }
1592
@@ -1715,11 +1896,11 @@
1715 blob_append(&out, blob_buffer(&p->txt), blob_size(&p->txt));
1716 }
1717 email_free_eventlist(pEvent);
1718 email_footer(&out);
1719 fossil_print("%s", blob_str(&out));
1720 blob_zero(&out);
1721 db_end_transaction(0);
1722 }
1723
1724 /*
1725 ** COMMAND: test-add-alerts
@@ -1837,12 +2018,12 @@
1837 zUrl, zCode);
1838 email_send(pSender,&hdr,&body);
1839 blob_truncate(&hdr, 0);
1840 blob_truncate(&body, 0);
1841 }
1842 blob_zero(&hdr);
1843 blob_zero(&body);
1844 db_finalize(&q);
1845 email_free_eventlist(pEvents);
1846 if( (flags & SENDALERT_PRESERVE)==0 ){
1847 if( flags & SENDALERT_DIGEST ){
1848 db_multi_exec("UPDATE pending_alert SET sentDigest=true");
1849
--- src/email.c
+++ src/email.c
@@ -13,11 +13,11 @@
13 ** [email protected]
14 ** http://www.hwaci.com/drh/
15 **
16 *******************************************************************************
17 **
18 ** Logic for email notification, also known as "alerts".
19 */
20 #include "config.h"
21 #include "email.h"
22 #include <assert.h>
23 #include <time.h>
@@ -181,21 +181,22 @@
181 }
182 }
183
184
185 /*
186 ** WEBPAGE: setup_notification
187 **
188 ** Administrative page for configuring and controlling email notification.
189 ** Normally accessible via the /Admin/Notification menu.
190 */
191 void setup_notification(void){
192 static const char *const azSendMethods[] = {
193 "off", "Disabled",
194 "pipe", "Pipe to a command",
195 "db", "Store in a database",
196 "dir", "Store in a directory",
197 "relay", "SMTP relay"
198 };
199 login_check_credentials();
200 if( !g.perm.Setup ){
201 login_needed(0);
202 return;
@@ -202,11 +203,11 @@
203 }
204 db_begin_transaction();
205
206 email_submenu_common();
207 style_header("Email Notification Setup");
208 @ <form action="%R/setup_notification" method="post"><div>
209 @ <input type="submit" name="submit" value="Apply Changes" /><hr>
210 login_insert_csrf_secret();
211
212 entry_attribute("Canonical Server URL", 40, "email-url",
213 "eurl", "", 0);
@@ -244,17 +245,14 @@
245 @ (Property: "email-autoexec")</p>
246 @ <hr>
247
248 multiple_choice_attribute("Email Send Method", "email-send-method", "esm",
249 "off", count(azSendMethods)/2, azSendMethods);
250 @ <p>How to send email. Requires auxiliary information from the fields
251 @ that follow. (Property: "email-send-method")</p>
 
 
252 email_schema(1);
253 entry_attribute("Command To Pipe Email To", 60, "email-send-command",
 
254 "ecmd", "sendmail -t", 0);
255 @ <p>When the send method is "pipe to a command", this is the command
256 @ that is run. Email messages are piped into the standard input of this
257 @ command. The command is expected to extract the sender address,
258 @ recepient addresses, and subject from the header of the piped email
@@ -269,10 +267,19 @@
267 entry_attribute("Directory In Which To Store Email", 60, "email-send-dir",
268 "esdir", "", 0);
269 @ <p>When the send method is "store in a directory", each email message is
270 @ stored as a separate file in the directory shown here.
271 @ (Property: "email-send-dir")</p>
272
273 entry_attribute("SMTP relay host", 60, "email-send-relayhost",
274 "esrh", "", 0);
275 @ <p>When the send method is "SMTP relay", each email message is
276 @ transmitted via the SMTP protocol (rfc5321) to a "Mail Submission
277 @ Agent" or "MSA" (rfc4409) at the hostname shown here. Optionally
278 @ append a colon and TCP port number (ex: smtp.example.com:587).
279 @ The default TCP port number is 25.
280 @ (Property: "email-send-relayhost")</p>
281 @ <hr>
282
283 entry_attribute("Administrator email address", 40, "email-admin",
284 "eadmin", "", 0);
285 @ <p>This is the email for the human administrator for the system.
@@ -376,14 +383,21 @@
383 const char *zDest; /* How to send email. */
384 const char *zDb; /* Name of database file */
385 const char *zDir; /* Directory in which to store as email files */
386 const char *zCmd; /* Command to run for each email */
387 const char *zFrom; /* Emails come from here */
388 SmtpSession *pSmtp; /* SMTP relay connection */
389 Blob out; /* For zDest=="blob" */
390 char *zErr; /* Error message */
391 u32 mFlags; /* Flags */
392 int bImmediateFail; /* On any error, call fossil_fatal() */
393 };
394
395 /* Allowed values for EmailSender flags */
396 #define EMAIL_IMMEDIATE_FAIL 0x0001 /* Call fossil_fatal() on any error */
397 #define EMAIL_SMTP_TRACE 0x0002 /* Write SMTP transcript to console */
398
399 #endif /* INTERFACE */
400
401 /*
402 ** Shutdown an emailer. Clear all information other than the error message.
403 */
@@ -393,12 +407,16 @@
407 sqlite3_close(p->db);
408 p->db = 0;
409 p->zDb = 0;
410 p->zDir = 0;
411 p->zCmd = 0;
412 if( p->pSmtp ){
413 smtp_client_quit(p->pSmtp);
414 smtp_session_free(p->pSmtp);
415 p->pSmtp = 0;
416 }
417 blob_reset(&p->out);
418 }
419
420 /*
421 ** Put the EmailSender into an error state.
422 */
@@ -407,11 +425,11 @@
425 fossil_free(p->zErr);
426 va_start(ap, zFormat);
427 p->zErr = vmprintf(zFormat, ap);
428 va_end(ap);
429 emailerShutdown(p);
430 if( p->mFlags & EMAIL_IMMEDIATE_FAIL ){
431 fossil_fatal("%s", p->zErr);
432 }
433 }
434
435 /*
@@ -455,16 +473,17 @@
473 ** zAltDest to cause all emails to be printed to the console for
474 ** debugging purposes.
475 **
476 ** The EmailSender object returned must be freed using email_sender_free().
477 */
478 EmailSender *email_sender_new(const char *zAltDest, u32 mFlags){
479 EmailSender *p;
480
481 p = fossil_malloc(sizeof(*p));
482 memset(p, 0, sizeof(*p));
483 blob_init(&p->out, 0, 0);
484 p->mFlags = mFlags;
485 if( zAltDest ){
486 p->zDest = zAltDest;
487 }else{
488 p->zDest = db_get("email-send-method","off");
489 }
@@ -499,13 +518,149 @@
518 emailerGetSetting(p, &p->zCmd, "email-send-command");
519 }else if( fossil_strcmp(p->zDest, "dir")==0 ){
520 emailerGetSetting(p, &p->zDir, "email-send-dir");
521 }else if( fossil_strcmp(p->zDest, "blob")==0 ){
522 blob_init(&p->out, 0, 0);
523 }else if( fossil_strcmp(p->zDest, "relay")==0 ){
524 const char *zRelay = 0;
525 emailerGetSetting(p, &zRelay, "email-send-relayhost");
526 if( zRelay ){
527 u32 smtpFlags = SMTP_DIRECT;
528 if( mFlags & EMAIL_SMTP_TRACE ) smtpFlags |= SMTP_TRACE_STDOUT;
529 p->pSmtp = smtp_session_new(p->zFrom, zRelay, smtpFlags);
530 smtp_client_startup(p->pSmtp);
531 }
532 }
533 return p;
534 }
535
536 /*
537 ** Scan the header of the email message in pMsg looking for the
538 ** (first) occurrance of zField. Fill pValue with the content of
539 ** that field.
540 **
541 ** This routine initializes pValue. Any prior content of pValue is
542 ** discarded (leaked).
543 **
544 ** Return non-zero on success. Return 0 if no instance of the header
545 ** is found.
546 */
547 int email_header_value(Blob *pMsg, const char *zField, Blob *pValue){
548 int nField = (int)strlen(zField);
549 Blob line;
550 blob_rewind(pMsg);
551 blob_init(pValue,0,0);
552 while( blob_line(pMsg, &line) ){
553 int n, i;
554 char *z;
555 blob_trim(&line);
556 n = blob_size(&line);
557 if( n==0 ) return 0;
558 if( n<nField+1 ) continue;
559 z = blob_buffer(&line);
560 if( sqlite3_strnicmp(z, zField, nField)==0 && z[nField]==':' ){
561 for(i=nField+1; i<n && fossil_isspace(z[i]); i++){}
562 blob_init(pValue, z+i, n-i);
563 while( blob_line(pMsg, &line) ){
564 blob_trim(&line);
565 n = blob_size(&line);
566 if( n==0 ) break;
567 z = blob_buffer(&line);
568 if( !fossil_isspace(z[0]) ) break;
569 for(i=1; i<n && fossil_isspace(z[i]); i++){}
570 blob_append(pValue, " ", 1);
571 blob_append(pValue, z+i, n-i);
572 }
573 return 1;
574 }
575 }
576 return 0;
577 }
578
579 /*
580 ** Make a copy of the input string up to but not including the
581 ** first ">" character.
582 **
583 ** Verify that the string really that is to be copied really is a
584 ** valid email address. If it is not, then return NULL.
585 **
586 ** This routine is more restrictive than necessary. It does not
587 ** allow comments, IP address, quoted strings, or certain uncommon
588 ** characters. The only non-alphanumerics allowed in the local
589 ** part are "_", "+", "-" and "+".
590 */
591 char *email_copy_addr(const char *z){
592 int i;
593 int nAt = 0;
594 int nDot = 0;
595 char c;
596 if( z[0]=='.' ) return 0; /* Local part cannot begin with "." */
597 for(i=0; (c = z[i])!=0 && c!='>'; i++){
598 if( fossil_isalnum(c) ){
599 /* Alphanumerics are always ok */
600 }else if( c=='@' ){
601 if( nAt ) return 0; /* Only a single "@" allowed */
602 if( i>64 ) return 0; /* Local part too big */
603 nAt = 1;
604 nDot = 0;
605 if( i==0 ) return 0; /* Disallow empty local part */
606 if( z[i-1]=='.' ) return 0; /* Last char of local cannot be "." */
607 if( z[i+1]=='.' || z[i+1]=='-' ){
608 return 0; /* Domain cannot begin with "." or "-" */
609 }
610 }else if( c=='-' ){
611 if( z[i+1]=='>' ) return 0; /* Last character cannot be "-" */
612 }else if( c=='.' ){
613 if( z[i+1]=='.' ) return 0; /* Do not allow ".." */
614 if( z[i+1]=='>' ) return 0; /* Domain may not end with . */
615 nDot++;
616 }else if( (c=='_' || c=='+') && nAt==0 ){
617 /* _ and + are ok in the local part */
618 }else{
619 return 0; /* Anything else is an error */
620 }
621 }
622 if( c!='>' ) return 0; /* Missing final ">" */
623 if( nAt==0 ) return 0; /* No "@" found anywhere */
624 if( nDot==0 ) return 0; /* No "." in the domain */
625
626 /* If we reach this point, the email address is valid */
627 return mprintf("%.*s", i, z);
628 }
629
630 /*
631 ** Extract all To: header values from the email header supplied.
632 ** Store them in the array list.
633 */
634 void email_header_to(Blob *pMsg, int *pnTo, char ***pazTo){
635 int nTo = 0;
636 char **azTo = 0;
637 Blob v;
638 char *z, *zAddr;
639 int i;
640
641 email_header_value(pMsg, "to", &v);
642 z = blob_str(&v);
643 for(i=0; z[i]; i++){
644 if( z[i]=='<' && (zAddr = email_copy_addr(&z[i+1]))!=0 ){
645 azTo = fossil_realloc(azTo, sizeof(azTo[0])*(nTo+1) );
646 azTo[nTo++] = zAddr;
647 }
648 }
649 *pnTo = nTo;
650 *pazTo = azTo;
651 }
652
653 /*
654 ** Free a list of To addresses obtained from a prior call to
655 ** email_header_to()
656 */
657 void email_header_to_free(int nTo, char **azTo){
658 int i;
659 for(i=0; i<nTo; i++) fossil_free(azTo[i]);
660 fossil_free(azTo);
661 }
662
663 /*
664 ** Send a single email message.
665 **
666 ** The recepient(s) must be specified using "To:" or "Cc:" or "Bcc:" fields
@@ -579,15 +734,31 @@
734 }
735 }else if( p->zDir ){
736 char *zFile = emailTempFilename(p->zDir);
737 blob_write_to_file(&all, zFile);
738 fossil_free(zFile);
739 }else if( p->pSmtp ){
740 char **azTo = 0;
741 int nTo = 0;
742 email_header_to(pHdr, &nTo, &azTo);
743 if( nTo>0 ){
744 smtp_send_msg(p->pSmtp, p->zFrom, nTo, (const char**)azTo,blob_str(&all));
745 email_header_to_free(nTo, azTo);
746 }
747 }else if( strcmp(p->zDest, "stdout")==0 ){
748 char **azTo = 0;
749 int nTo = 0;
750 int i;
751 email_header_to(pHdr, &nTo, &azTo);
752 for(i=0; i<nTo; i++){
753 fossil_print("X-To-Test-%d: [%s]\r\n", i, azTo[i]);
754 }
755 email_header_to_free(nTo, azTo);
756 blob_add_final_newline(&all);
757 fossil_print("%s", blob_str(&all));
758 }
759 blob_reset(&all);
760 }
761
762 /*
763 ** Analyze and act on a received email.
764 **
@@ -597,11 +768,11 @@
768 ** This routine acts on all email messages received from the
769 ** "fossil email inbound" command.
770 */
771 void email_receive(Blob *pMsg){
772 /* To Do: Look for bounce messages and possibly disable subscriptions */
773 blob_reset(pMsg);
774 }
775
776 /*
777 ** SETTING: email-send-method width=5 default=off
778 ** Determine the method used to send email. Allowed values are
@@ -640,10 +811,17 @@
811 ** SETTING: email-receive-dir width=40
812 ** Inbound email messages are saved as separate files in this directory,
813 ** for debugging analysis. Disable saving of inbound emails omitting
814 ** this setting, or making it an empty string.
815 */
816 /*
817 ** SETTING: email-send-relayhost width=40
818 ** This is the hostname and TCP port to which output email messages
819 ** are sent when email-send-method is "relay". There should be an
820 ** SMTP server configured as a Mail Submission Agent listening on the
821 ** designated host and port and all times.
822 */
823
824
825 /*
826 ** COMMAND: email
827 **
@@ -672,10 +850,11 @@
850 ** email sending mechanism is currently configured.
851 ** Use this for testing the email configuration.
852 ** Options:
853 **
854 ** --body FILENAME
855 ** --smtp-trace
856 ** --stdout
857 ** --subject|-S SUBJECT
858 **
859 ** settings [NAME VALUE] With no arguments, list all email settings.
860 ** Or change the value of a single email setting.
@@ -727,11 +906,11 @@
906 "This will erase all content in the repository tables, thus\n"
907 "deleting all subscriber information. The information will be\n"
908 "unrecoverable.\n");
909 prompt_user("Continue? (y/N) ", &yn);
910 c = blob_str(&yn)[0];
911 blob_reset(&yn);
912 }
913 if( c=='y' ){
914 email_triggers_disable();
915 db_multi_exec(
916 "DROP TABLE IF EXISTS subscriber;\n"
@@ -746,13 +925,15 @@
925 }else
926 if( strncmp(zCmd, "send", nCmd)==0 ){
927 Blob prompt, body, hdr;
928 const char *zDest = find_option("stdout",0,0)!=0 ? "stdout" : 0;
929 int i;
930 u32 mFlags = EMAIL_IMMEDIATE_FAIL;
931 const char *zSubject = find_option("subject", "S", 1);
932 const char *zSource = find_option("body", 0, 1);
933 EmailSender *pSender;
934 if( find_option("smtp-trace",0,0)!=0 ) mFlags |= EMAIL_SMTP_TRACE;
935 verify_all_options();
936 blob_init(&prompt, 0, 0);
937 blob_init(&body, 0, 0);
938 blob_init(&hdr, 0, 0);
939 blob_appendf(&hdr,"To: ");
@@ -768,16 +949,16 @@
949 blob_read_from_file(&body, zSource, ExtFILE);
950 }else{
951 prompt_for_user_comment(&body, &prompt);
952 }
953 blob_add_final_newline(&body);
954 pSender = email_sender_new(zDest, mFlags);
955 email_send(pSender, &hdr, &body);
956 email_sender_free(pSender);
957 blob_reset(&hdr);
958 blob_reset(&body);
959 blob_reset(&prompt);
960 }else
961 if( strncmp(zCmd, "settings", nCmd)==0 ){
962 int isGlobal = find_option("global",0,0)!=0;
963 int nSetting;
964 const Setting *pSetting = setting_info(&nSetting);
@@ -1018,11 +1199,11 @@
1199 /* We need to send a verification email */
1200 Blob hdr, body;
1201 EmailSender *pSender = email_sender_new(0,0);
1202 blob_init(&hdr,0,0);
1203 blob_init(&body,0,0);
1204 blob_appendf(&hdr, "To: <%s>\n", zEAddr);
1205 blob_appendf(&hdr, "Subject: Subscription verification\n");
1206 blob_appendf(&body, zConfirmMsg/*works-like:"%s%s%s"*/,
1207 g.zBaseURL, g.zBaseURL, zCode);
1208 email_send(pSender, &hdr, &body);
1209 style_header("Email Alert Verification");
@@ -1582,11 +1763,11 @@
1763 ** Free a linked list of EmailEvent objects
1764 */
1765 void email_free_eventlist(EmailEvent *p){
1766 while( p ){
1767 EmailEvent *pNext = p->pNext;
1768 blob_reset(&p->txt);
1769 fossil_free(p);
1770 p = pNext;
1771 }
1772 }
1773
@@ -1715,11 +1896,11 @@
1896 blob_append(&out, blob_buffer(&p->txt), blob_size(&p->txt));
1897 }
1898 email_free_eventlist(pEvent);
1899 email_footer(&out);
1900 fossil_print("%s", blob_str(&out));
1901 blob_reset(&out);
1902 db_end_transaction(0);
1903 }
1904
1905 /*
1906 ** COMMAND: test-add-alerts
@@ -1837,12 +2018,12 @@
2018 zUrl, zCode);
2019 email_send(pSender,&hdr,&body);
2020 blob_truncate(&hdr, 0);
2021 blob_truncate(&body, 0);
2022 }
2023 blob_reset(&hdr);
2024 blob_reset(&body);
2025 db_finalize(&q);
2026 email_free_eventlist(pEvents);
2027 if( (flags & SENDALERT_PRESERVE)==0 ){
2028 if( flags & SENDALERT_DIGEST ){
2029 db_multi_exec("UPDATE pending_alert SET sentDigest=true");
2030
--- src/http_socket.c
+++ src/http_socket.c
@@ -79,12 +79,14 @@
7979
}
8080
8181
/*
8282
** Return the current socket error message
8383
*/
84
-const char *socket_errmsg(void){
85
- return socketErrMsg;
84
+char *socket_errmsg(void){
85
+ char *zResult = socketErrMsg;
86
+ socketErrMsg = 0;
87
+ return zResult;
8688
}
8789
8890
/*
8991
** Call this routine once before any other use of the socket interface.
9092
** This routine does initial configuration of the socket module.
@@ -132,12 +134,12 @@
132134
133135
/*
134136
** Open a socket connection. The identify of the server is determined
135137
** by pUrlData
136138
**
137
-** pUrlDAta->name Name of the server. Ex: www.fossil-scm.org
138
-** pUrlDAta->port TCP/IP port to use. Ex: 80
139
+** pUrlData->name Name of the server. Ex: www.fossil-scm.org
140
+** pUrlData->port TCP/IP port to use. Ex: 80
139141
**
140142
** Return the number of errors.
141143
*/
142144
int socket_open(UrlData *pUrlData){
143145
int rc = 0;
@@ -190,11 +192,11 @@
190192
}
191193
192194
/*
193195
** Send content out over the open socket connection.
194196
*/
195
-size_t socket_send(void *NotUsed, void *pContent, size_t N){
197
+size_t socket_send(void *NotUsed, const void *pContent, size_t N){
196198
size_t sent;
197199
size_t total = 0;
198200
while( N>0 ){
199201
sent = send(iSocket, pContent, N, 0);
200202
if( sent<=0 ) break;
@@ -205,17 +207,25 @@
205207
return total;
206208
}
207209
208210
/*
209211
** Receive content back from the open socket connection.
212
+** Return the number of bytes read.
213
+**
214
+** When bDontBlock is false, this function blocks until all N bytes
215
+** have been read.
210216
*/
211
-size_t socket_receive(void *NotUsed, void *pContent, size_t N){
217
+size_t socket_receive(void *NotUsed, void *pContent, size_t N, int bDontBlock){
212218
ssize_t got;
213219
size_t total = 0;
220
+ int flags = 0;
221
+#ifdef MSG_DONTWAIT
222
+ if( bDontBlock ) flags |= MSG_DONTWAIT;
223
+#endif
214224
while( N>0 ){
215225
/* WinXP fails for large values of N. So limit it to 64KiB. */
216
- got = recv(iSocket, pContent, N>65536 ? 65536 : N, 0);
226
+ got = recv(iSocket, pContent, N>65536 ? 65536 : N, flags);
217227
if( got<=0 ) break;
218228
total += (size_t)got;
219229
N -= (size_t)got;
220230
pContent = (void*)&((char*)pContent)[got];
221231
}
222232
--- src/http_socket.c
+++ src/http_socket.c
@@ -79,12 +79,14 @@
79 }
80
81 /*
82 ** Return the current socket error message
83 */
84 const char *socket_errmsg(void){
85 return socketErrMsg;
 
 
86 }
87
88 /*
89 ** Call this routine once before any other use of the socket interface.
90 ** This routine does initial configuration of the socket module.
@@ -132,12 +134,12 @@
132
133 /*
134 ** Open a socket connection. The identify of the server is determined
135 ** by pUrlData
136 **
137 ** pUrlDAta->name Name of the server. Ex: www.fossil-scm.org
138 ** pUrlDAta->port TCP/IP port to use. Ex: 80
139 **
140 ** Return the number of errors.
141 */
142 int socket_open(UrlData *pUrlData){
143 int rc = 0;
@@ -190,11 +192,11 @@
190 }
191
192 /*
193 ** Send content out over the open socket connection.
194 */
195 size_t socket_send(void *NotUsed, void *pContent, size_t N){
196 size_t sent;
197 size_t total = 0;
198 while( N>0 ){
199 sent = send(iSocket, pContent, N, 0);
200 if( sent<=0 ) break;
@@ -205,17 +207,25 @@
205 return total;
206 }
207
208 /*
209 ** Receive content back from the open socket connection.
 
 
 
 
210 */
211 size_t socket_receive(void *NotUsed, void *pContent, size_t N){
212 ssize_t got;
213 size_t total = 0;
 
 
 
 
214 while( N>0 ){
215 /* WinXP fails for large values of N. So limit it to 64KiB. */
216 got = recv(iSocket, pContent, N>65536 ? 65536 : N, 0);
217 if( got<=0 ) break;
218 total += (size_t)got;
219 N -= (size_t)got;
220 pContent = (void*)&((char*)pContent)[got];
221 }
222
--- src/http_socket.c
+++ src/http_socket.c
@@ -79,12 +79,14 @@
79 }
80
81 /*
82 ** Return the current socket error message
83 */
84 char *socket_errmsg(void){
85 char *zResult = socketErrMsg;
86 socketErrMsg = 0;
87 return zResult;
88 }
89
90 /*
91 ** Call this routine once before any other use of the socket interface.
92 ** This routine does initial configuration of the socket module.
@@ -132,12 +134,12 @@
134
135 /*
136 ** Open a socket connection. The identify of the server is determined
137 ** by pUrlData
138 **
139 ** pUrlData->name Name of the server. Ex: www.fossil-scm.org
140 ** pUrlData->port TCP/IP port to use. Ex: 80
141 **
142 ** Return the number of errors.
143 */
144 int socket_open(UrlData *pUrlData){
145 int rc = 0;
@@ -190,11 +192,11 @@
192 }
193
194 /*
195 ** Send content out over the open socket connection.
196 */
197 size_t socket_send(void *NotUsed, const void *pContent, size_t N){
198 size_t sent;
199 size_t total = 0;
200 while( N>0 ){
201 sent = send(iSocket, pContent, N, 0);
202 if( sent<=0 ) break;
@@ -205,17 +207,25 @@
207 return total;
208 }
209
210 /*
211 ** Receive content back from the open socket connection.
212 ** Return the number of bytes read.
213 **
214 ** When bDontBlock is false, this function blocks until all N bytes
215 ** have been read.
216 */
217 size_t socket_receive(void *NotUsed, void *pContent, size_t N, int bDontBlock){
218 ssize_t got;
219 size_t total = 0;
220 int flags = 0;
221 #ifdef MSG_DONTWAIT
222 if( bDontBlock ) flags |= MSG_DONTWAIT;
223 #endif
224 while( N>0 ){
225 /* WinXP fails for large values of N. So limit it to 64KiB. */
226 got = recv(iSocket, pContent, N>65536 ? 65536 : N, flags);
227 if( got<=0 ) break;
228 total += (size_t)got;
229 N -= (size_t)got;
230 pContent = (void*)&((char*)pContent)[got];
231 }
232
--- src/http_transport.c
+++ src/http_transport.c
@@ -325,11 +325,11 @@
325325
got = 0;
326326
#endif
327327
}else if( pUrlData->isFile ){
328328
got = fread(zBuf, 1, N, transport.pFile);
329329
}else{
330
- got = socket_receive(0, zBuf, N);
330
+ got = socket_receive(0, zBuf, N, 0);
331331
}
332332
/* printf("received %d of %d bytes\n", got, N); fflush(stdout); */
333333
if( transport.pLog ){
334334
fwrite(zBuf, 1, got, transport.pLog);
335335
fflush(transport.pLog);
336336
--- src/http_transport.c
+++ src/http_transport.c
@@ -325,11 +325,11 @@
325 got = 0;
326 #endif
327 }else if( pUrlData->isFile ){
328 got = fread(zBuf, 1, N, transport.pFile);
329 }else{
330 got = socket_receive(0, zBuf, N);
331 }
332 /* printf("received %d of %d bytes\n", got, N); fflush(stdout); */
333 if( transport.pLog ){
334 fwrite(zBuf, 1, got, transport.pLog);
335 fflush(transport.pLog);
336
--- src/http_transport.c
+++ src/http_transport.c
@@ -325,11 +325,11 @@
325 got = 0;
326 #endif
327 }else if( pUrlData->isFile ){
328 got = fread(zBuf, 1, N, transport.pFile);
329 }else{
330 got = socket_receive(0, zBuf, N, 0);
331 }
332 /* printf("received %d of %d bytes\n", got, N); fflush(stdout); */
333 if( transport.pLog ){
334 fwrite(zBuf, 1, got, transport.pLog);
335 fflush(transport.pLog);
336
+24
--- src/main.mk
+++ src/main.mk
@@ -113,10 +113,11 @@
113113
$(SRCDIR)/sha1hard.c \
114114
$(SRCDIR)/sha3.c \
115115
$(SRCDIR)/shun.c \
116116
$(SRCDIR)/sitemap.c \
117117
$(SRCDIR)/skins.c \
118
+ $(SRCDIR)/smtp.c \
118119
$(SRCDIR)/sqlcmd.c \
119120
$(SRCDIR)/stash.c \
120121
$(SRCDIR)/stat.c \
121122
$(SRCDIR)/statrep.c \
122123
$(SRCDIR)/style.c \
@@ -135,10 +136,11 @@
135136
$(SRCDIR)/user.c \
136137
$(SRCDIR)/utf8.c \
137138
$(SRCDIR)/util.c \
138139
$(SRCDIR)/verify.c \
139140
$(SRCDIR)/vfile.c \
141
+ $(SRCDIR)/webmail.c \
140142
$(SRCDIR)/wiki.c \
141143
$(SRCDIR)/wikiformat.c \
142144
$(SRCDIR)/winfile.c \
143145
$(SRCDIR)/winhttp.c \
144146
$(SRCDIR)/wysiwyg.c \
@@ -316,10 +318,11 @@
316318
$(OBJDIR)/sha1hard_.c \
317319
$(OBJDIR)/sha3_.c \
318320
$(OBJDIR)/shun_.c \
319321
$(OBJDIR)/sitemap_.c \
320322
$(OBJDIR)/skins_.c \
323
+ $(OBJDIR)/smtp_.c \
321324
$(OBJDIR)/sqlcmd_.c \
322325
$(OBJDIR)/stash_.c \
323326
$(OBJDIR)/stat_.c \
324327
$(OBJDIR)/statrep_.c \
325328
$(OBJDIR)/style_.c \
@@ -338,10 +341,11 @@
338341
$(OBJDIR)/user_.c \
339342
$(OBJDIR)/utf8_.c \
340343
$(OBJDIR)/util_.c \
341344
$(OBJDIR)/verify_.c \
342345
$(OBJDIR)/vfile_.c \
346
+ $(OBJDIR)/webmail_.c \
343347
$(OBJDIR)/wiki_.c \
344348
$(OBJDIR)/wikiformat_.c \
345349
$(OBJDIR)/winfile_.c \
346350
$(OBJDIR)/winhttp_.c \
347351
$(OBJDIR)/wysiwyg_.c \
@@ -448,10 +452,11 @@
448452
$(OBJDIR)/sha1hard.o \
449453
$(OBJDIR)/sha3.o \
450454
$(OBJDIR)/shun.o \
451455
$(OBJDIR)/sitemap.o \
452456
$(OBJDIR)/skins.o \
457
+ $(OBJDIR)/smtp.o \
453458
$(OBJDIR)/sqlcmd.o \
454459
$(OBJDIR)/stash.o \
455460
$(OBJDIR)/stat.o \
456461
$(OBJDIR)/statrep.o \
457462
$(OBJDIR)/style.o \
@@ -470,10 +475,11 @@
470475
$(OBJDIR)/user.o \
471476
$(OBJDIR)/utf8.o \
472477
$(OBJDIR)/util.o \
473478
$(OBJDIR)/verify.o \
474479
$(OBJDIR)/vfile.o \
480
+ $(OBJDIR)/webmail.o \
475481
$(OBJDIR)/wiki.o \
476482
$(OBJDIR)/wikiformat.o \
477483
$(OBJDIR)/winfile.o \
478484
$(OBJDIR)/winhttp.o \
479485
$(OBJDIR)/wysiwyg.o \
@@ -778,10 +784,11 @@
778784
$(OBJDIR)/sha1hard_.c:$(OBJDIR)/sha1hard.h \
779785
$(OBJDIR)/sha3_.c:$(OBJDIR)/sha3.h \
780786
$(OBJDIR)/shun_.c:$(OBJDIR)/shun.h \
781787
$(OBJDIR)/sitemap_.c:$(OBJDIR)/sitemap.h \
782788
$(OBJDIR)/skins_.c:$(OBJDIR)/skins.h \
789
+ $(OBJDIR)/smtp_.c:$(OBJDIR)/smtp.h \
783790
$(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h \
784791
$(OBJDIR)/stash_.c:$(OBJDIR)/stash.h \
785792
$(OBJDIR)/stat_.c:$(OBJDIR)/stat.h \
786793
$(OBJDIR)/statrep_.c:$(OBJDIR)/statrep.h \
787794
$(OBJDIR)/style_.c:$(OBJDIR)/style.h \
@@ -800,10 +807,11 @@
800807
$(OBJDIR)/user_.c:$(OBJDIR)/user.h \
801808
$(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h \
802809
$(OBJDIR)/util_.c:$(OBJDIR)/util.h \
803810
$(OBJDIR)/verify_.c:$(OBJDIR)/verify.h \
804811
$(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h \
812
+ $(OBJDIR)/webmail_.c:$(OBJDIR)/webmail.h \
805813
$(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h \
806814
$(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h \
807815
$(OBJDIR)/winfile_.c:$(OBJDIR)/winfile.h \
808816
$(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h \
809817
$(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h \
@@ -1614,10 +1622,18 @@
16141622
16151623
$(OBJDIR)/skins.o: $(OBJDIR)/skins_.c $(OBJDIR)/skins.h $(SRCDIR)/config.h
16161624
$(XTCC) -o $(OBJDIR)/skins.o -c $(OBJDIR)/skins_.c
16171625
16181626
$(OBJDIR)/skins.h: $(OBJDIR)/headers
1627
+
1628
+$(OBJDIR)/smtp_.c: $(SRCDIR)/smtp.c $(OBJDIR)/translate
1629
+ $(OBJDIR)/translate $(SRCDIR)/smtp.c >$@
1630
+
1631
+$(OBJDIR)/smtp.o: $(OBJDIR)/smtp_.c $(OBJDIR)/smtp.h $(SRCDIR)/config.h
1632
+ $(XTCC) -o $(OBJDIR)/smtp.o -c $(OBJDIR)/smtp_.c
1633
+
1634
+$(OBJDIR)/smtp.h: $(OBJDIR)/headers
16191635
16201636
$(OBJDIR)/sqlcmd_.c: $(SRCDIR)/sqlcmd.c $(OBJDIR)/translate
16211637
$(OBJDIR)/translate $(SRCDIR)/sqlcmd.c >$@
16221638
16231639
$(OBJDIR)/sqlcmd.o: $(OBJDIR)/sqlcmd_.c $(OBJDIR)/sqlcmd.h $(SRCDIR)/config.h
@@ -1790,10 +1806,18 @@
17901806
17911807
$(OBJDIR)/vfile.o: $(OBJDIR)/vfile_.c $(OBJDIR)/vfile.h $(SRCDIR)/config.h
17921808
$(XTCC) -o $(OBJDIR)/vfile.o -c $(OBJDIR)/vfile_.c
17931809
17941810
$(OBJDIR)/vfile.h: $(OBJDIR)/headers
1811
+
1812
+$(OBJDIR)/webmail_.c: $(SRCDIR)/webmail.c $(OBJDIR)/translate
1813
+ $(OBJDIR)/translate $(SRCDIR)/webmail.c >$@
1814
+
1815
+$(OBJDIR)/webmail.o: $(OBJDIR)/webmail_.c $(OBJDIR)/webmail.h $(SRCDIR)/config.h
1816
+ $(XTCC) -o $(OBJDIR)/webmail.o -c $(OBJDIR)/webmail_.c
1817
+
1818
+$(OBJDIR)/webmail.h: $(OBJDIR)/headers
17951819
17961820
$(OBJDIR)/wiki_.c: $(SRCDIR)/wiki.c $(OBJDIR)/translate
17971821
$(OBJDIR)/translate $(SRCDIR)/wiki.c >$@
17981822
17991823
$(OBJDIR)/wiki.o: $(OBJDIR)/wiki_.c $(OBJDIR)/wiki.h $(SRCDIR)/config.h
18001824
--- src/main.mk
+++ src/main.mk
@@ -113,10 +113,11 @@
113 $(SRCDIR)/sha1hard.c \
114 $(SRCDIR)/sha3.c \
115 $(SRCDIR)/shun.c \
116 $(SRCDIR)/sitemap.c \
117 $(SRCDIR)/skins.c \
 
118 $(SRCDIR)/sqlcmd.c \
119 $(SRCDIR)/stash.c \
120 $(SRCDIR)/stat.c \
121 $(SRCDIR)/statrep.c \
122 $(SRCDIR)/style.c \
@@ -135,10 +136,11 @@
135 $(SRCDIR)/user.c \
136 $(SRCDIR)/utf8.c \
137 $(SRCDIR)/util.c \
138 $(SRCDIR)/verify.c \
139 $(SRCDIR)/vfile.c \
 
140 $(SRCDIR)/wiki.c \
141 $(SRCDIR)/wikiformat.c \
142 $(SRCDIR)/winfile.c \
143 $(SRCDIR)/winhttp.c \
144 $(SRCDIR)/wysiwyg.c \
@@ -316,10 +318,11 @@
316 $(OBJDIR)/sha1hard_.c \
317 $(OBJDIR)/sha3_.c \
318 $(OBJDIR)/shun_.c \
319 $(OBJDIR)/sitemap_.c \
320 $(OBJDIR)/skins_.c \
 
321 $(OBJDIR)/sqlcmd_.c \
322 $(OBJDIR)/stash_.c \
323 $(OBJDIR)/stat_.c \
324 $(OBJDIR)/statrep_.c \
325 $(OBJDIR)/style_.c \
@@ -338,10 +341,11 @@
338 $(OBJDIR)/user_.c \
339 $(OBJDIR)/utf8_.c \
340 $(OBJDIR)/util_.c \
341 $(OBJDIR)/verify_.c \
342 $(OBJDIR)/vfile_.c \
 
343 $(OBJDIR)/wiki_.c \
344 $(OBJDIR)/wikiformat_.c \
345 $(OBJDIR)/winfile_.c \
346 $(OBJDIR)/winhttp_.c \
347 $(OBJDIR)/wysiwyg_.c \
@@ -448,10 +452,11 @@
448 $(OBJDIR)/sha1hard.o \
449 $(OBJDIR)/sha3.o \
450 $(OBJDIR)/shun.o \
451 $(OBJDIR)/sitemap.o \
452 $(OBJDIR)/skins.o \
 
453 $(OBJDIR)/sqlcmd.o \
454 $(OBJDIR)/stash.o \
455 $(OBJDIR)/stat.o \
456 $(OBJDIR)/statrep.o \
457 $(OBJDIR)/style.o \
@@ -470,10 +475,11 @@
470 $(OBJDIR)/user.o \
471 $(OBJDIR)/utf8.o \
472 $(OBJDIR)/util.o \
473 $(OBJDIR)/verify.o \
474 $(OBJDIR)/vfile.o \
 
475 $(OBJDIR)/wiki.o \
476 $(OBJDIR)/wikiformat.o \
477 $(OBJDIR)/winfile.o \
478 $(OBJDIR)/winhttp.o \
479 $(OBJDIR)/wysiwyg.o \
@@ -778,10 +784,11 @@
778 $(OBJDIR)/sha1hard_.c:$(OBJDIR)/sha1hard.h \
779 $(OBJDIR)/sha3_.c:$(OBJDIR)/sha3.h \
780 $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h \
781 $(OBJDIR)/sitemap_.c:$(OBJDIR)/sitemap.h \
782 $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h \
 
783 $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h \
784 $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h \
785 $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h \
786 $(OBJDIR)/statrep_.c:$(OBJDIR)/statrep.h \
787 $(OBJDIR)/style_.c:$(OBJDIR)/style.h \
@@ -800,10 +807,11 @@
800 $(OBJDIR)/user_.c:$(OBJDIR)/user.h \
801 $(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h \
802 $(OBJDIR)/util_.c:$(OBJDIR)/util.h \
803 $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h \
804 $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h \
 
805 $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h \
806 $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h \
807 $(OBJDIR)/winfile_.c:$(OBJDIR)/winfile.h \
808 $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h \
809 $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h \
@@ -1614,10 +1622,18 @@
1614
1615 $(OBJDIR)/skins.o: $(OBJDIR)/skins_.c $(OBJDIR)/skins.h $(SRCDIR)/config.h
1616 $(XTCC) -o $(OBJDIR)/skins.o -c $(OBJDIR)/skins_.c
1617
1618 $(OBJDIR)/skins.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1619
1620 $(OBJDIR)/sqlcmd_.c: $(SRCDIR)/sqlcmd.c $(OBJDIR)/translate
1621 $(OBJDIR)/translate $(SRCDIR)/sqlcmd.c >$@
1622
1623 $(OBJDIR)/sqlcmd.o: $(OBJDIR)/sqlcmd_.c $(OBJDIR)/sqlcmd.h $(SRCDIR)/config.h
@@ -1790,10 +1806,18 @@
1790
1791 $(OBJDIR)/vfile.o: $(OBJDIR)/vfile_.c $(OBJDIR)/vfile.h $(SRCDIR)/config.h
1792 $(XTCC) -o $(OBJDIR)/vfile.o -c $(OBJDIR)/vfile_.c
1793
1794 $(OBJDIR)/vfile.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1795
1796 $(OBJDIR)/wiki_.c: $(SRCDIR)/wiki.c $(OBJDIR)/translate
1797 $(OBJDIR)/translate $(SRCDIR)/wiki.c >$@
1798
1799 $(OBJDIR)/wiki.o: $(OBJDIR)/wiki_.c $(OBJDIR)/wiki.h $(SRCDIR)/config.h
1800
--- src/main.mk
+++ src/main.mk
@@ -113,10 +113,11 @@
113 $(SRCDIR)/sha1hard.c \
114 $(SRCDIR)/sha3.c \
115 $(SRCDIR)/shun.c \
116 $(SRCDIR)/sitemap.c \
117 $(SRCDIR)/skins.c \
118 $(SRCDIR)/smtp.c \
119 $(SRCDIR)/sqlcmd.c \
120 $(SRCDIR)/stash.c \
121 $(SRCDIR)/stat.c \
122 $(SRCDIR)/statrep.c \
123 $(SRCDIR)/style.c \
@@ -135,10 +136,11 @@
136 $(SRCDIR)/user.c \
137 $(SRCDIR)/utf8.c \
138 $(SRCDIR)/util.c \
139 $(SRCDIR)/verify.c \
140 $(SRCDIR)/vfile.c \
141 $(SRCDIR)/webmail.c \
142 $(SRCDIR)/wiki.c \
143 $(SRCDIR)/wikiformat.c \
144 $(SRCDIR)/winfile.c \
145 $(SRCDIR)/winhttp.c \
146 $(SRCDIR)/wysiwyg.c \
@@ -316,10 +318,11 @@
318 $(OBJDIR)/sha1hard_.c \
319 $(OBJDIR)/sha3_.c \
320 $(OBJDIR)/shun_.c \
321 $(OBJDIR)/sitemap_.c \
322 $(OBJDIR)/skins_.c \
323 $(OBJDIR)/smtp_.c \
324 $(OBJDIR)/sqlcmd_.c \
325 $(OBJDIR)/stash_.c \
326 $(OBJDIR)/stat_.c \
327 $(OBJDIR)/statrep_.c \
328 $(OBJDIR)/style_.c \
@@ -338,10 +341,11 @@
341 $(OBJDIR)/user_.c \
342 $(OBJDIR)/utf8_.c \
343 $(OBJDIR)/util_.c \
344 $(OBJDIR)/verify_.c \
345 $(OBJDIR)/vfile_.c \
346 $(OBJDIR)/webmail_.c \
347 $(OBJDIR)/wiki_.c \
348 $(OBJDIR)/wikiformat_.c \
349 $(OBJDIR)/winfile_.c \
350 $(OBJDIR)/winhttp_.c \
351 $(OBJDIR)/wysiwyg_.c \
@@ -448,10 +452,11 @@
452 $(OBJDIR)/sha1hard.o \
453 $(OBJDIR)/sha3.o \
454 $(OBJDIR)/shun.o \
455 $(OBJDIR)/sitemap.o \
456 $(OBJDIR)/skins.o \
457 $(OBJDIR)/smtp.o \
458 $(OBJDIR)/sqlcmd.o \
459 $(OBJDIR)/stash.o \
460 $(OBJDIR)/stat.o \
461 $(OBJDIR)/statrep.o \
462 $(OBJDIR)/style.o \
@@ -470,10 +475,11 @@
475 $(OBJDIR)/user.o \
476 $(OBJDIR)/utf8.o \
477 $(OBJDIR)/util.o \
478 $(OBJDIR)/verify.o \
479 $(OBJDIR)/vfile.o \
480 $(OBJDIR)/webmail.o \
481 $(OBJDIR)/wiki.o \
482 $(OBJDIR)/wikiformat.o \
483 $(OBJDIR)/winfile.o \
484 $(OBJDIR)/winhttp.o \
485 $(OBJDIR)/wysiwyg.o \
@@ -778,10 +784,11 @@
784 $(OBJDIR)/sha1hard_.c:$(OBJDIR)/sha1hard.h \
785 $(OBJDIR)/sha3_.c:$(OBJDIR)/sha3.h \
786 $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h \
787 $(OBJDIR)/sitemap_.c:$(OBJDIR)/sitemap.h \
788 $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h \
789 $(OBJDIR)/smtp_.c:$(OBJDIR)/smtp.h \
790 $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h \
791 $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h \
792 $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h \
793 $(OBJDIR)/statrep_.c:$(OBJDIR)/statrep.h \
794 $(OBJDIR)/style_.c:$(OBJDIR)/style.h \
@@ -800,10 +807,11 @@
807 $(OBJDIR)/user_.c:$(OBJDIR)/user.h \
808 $(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h \
809 $(OBJDIR)/util_.c:$(OBJDIR)/util.h \
810 $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h \
811 $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h \
812 $(OBJDIR)/webmail_.c:$(OBJDIR)/webmail.h \
813 $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h \
814 $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h \
815 $(OBJDIR)/winfile_.c:$(OBJDIR)/winfile.h \
816 $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h \
817 $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h \
@@ -1614,10 +1622,18 @@
1622
1623 $(OBJDIR)/skins.o: $(OBJDIR)/skins_.c $(OBJDIR)/skins.h $(SRCDIR)/config.h
1624 $(XTCC) -o $(OBJDIR)/skins.o -c $(OBJDIR)/skins_.c
1625
1626 $(OBJDIR)/skins.h: $(OBJDIR)/headers
1627
1628 $(OBJDIR)/smtp_.c: $(SRCDIR)/smtp.c $(OBJDIR)/translate
1629 $(OBJDIR)/translate $(SRCDIR)/smtp.c >$@
1630
1631 $(OBJDIR)/smtp.o: $(OBJDIR)/smtp_.c $(OBJDIR)/smtp.h $(SRCDIR)/config.h
1632 $(XTCC) -o $(OBJDIR)/smtp.o -c $(OBJDIR)/smtp_.c
1633
1634 $(OBJDIR)/smtp.h: $(OBJDIR)/headers
1635
1636 $(OBJDIR)/sqlcmd_.c: $(SRCDIR)/sqlcmd.c $(OBJDIR)/translate
1637 $(OBJDIR)/translate $(SRCDIR)/sqlcmd.c >$@
1638
1639 $(OBJDIR)/sqlcmd.o: $(OBJDIR)/sqlcmd_.c $(OBJDIR)/sqlcmd.h $(SRCDIR)/config.h
@@ -1790,10 +1806,18 @@
1806
1807 $(OBJDIR)/vfile.o: $(OBJDIR)/vfile_.c $(OBJDIR)/vfile.h $(SRCDIR)/config.h
1808 $(XTCC) -o $(OBJDIR)/vfile.o -c $(OBJDIR)/vfile_.c
1809
1810 $(OBJDIR)/vfile.h: $(OBJDIR)/headers
1811
1812 $(OBJDIR)/webmail_.c: $(SRCDIR)/webmail.c $(OBJDIR)/translate
1813 $(OBJDIR)/translate $(SRCDIR)/webmail.c >$@
1814
1815 $(OBJDIR)/webmail.o: $(OBJDIR)/webmail_.c $(OBJDIR)/webmail.h $(SRCDIR)/config.h
1816 $(XTCC) -o $(OBJDIR)/webmail.o -c $(OBJDIR)/webmail_.c
1817
1818 $(OBJDIR)/webmail.h: $(OBJDIR)/headers
1819
1820 $(OBJDIR)/wiki_.c: $(SRCDIR)/wiki.c $(OBJDIR)/translate
1821 $(OBJDIR)/translate $(SRCDIR)/wiki.c >$@
1822
1823 $(OBJDIR)/wiki.o: $(OBJDIR)/wiki_.c $(OBJDIR)/wiki.h $(SRCDIR)/config.h
1824
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -124,10 +124,11 @@
124124
sha1hard
125125
sha3
126126
shun
127127
sitemap
128128
skins
129
+ smtp
129130
sqlcmd
130131
stash
131132
stat
132133
statrep
133134
style
@@ -146,10 +147,11 @@
146147
user
147148
utf8
148149
util
149150
verify
150151
vfile
152
+ webmail
151153
wiki
152154
wikiformat
153155
winfile
154156
winhttp
155157
wysiwyg
156158
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -124,10 +124,11 @@
124 sha1hard
125 sha3
126 shun
127 sitemap
128 skins
 
129 sqlcmd
130 stash
131 stat
132 statrep
133 style
@@ -146,10 +147,11 @@
146 user
147 utf8
148 util
149 verify
150 vfile
 
151 wiki
152 wikiformat
153 winfile
154 winhttp
155 wysiwyg
156
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -124,10 +124,11 @@
124 sha1hard
125 sha3
126 shun
127 sitemap
128 skins
129 smtp
130 sqlcmd
131 stash
132 stat
133 statrep
134 style
@@ -146,10 +147,11 @@
147 user
148 utf8
149 util
150 verify
151 vfile
152 webmail
153 wiki
154 wikiformat
155 winfile
156 winhttp
157 wysiwyg
158
+4 -1
--- src/setup.c
+++ src/setup.c
@@ -114,11 +114,14 @@
114114
"Configure the trouble-ticketing system for this repository");
115115
setup_menu_entry("Search","srchsetup",
116116
"Configure the built-in search engine");
117117
setup_menu_entry("URL Aliases", "waliassetup",
118118
"Configure URL aliases");
119
- setup_menu_entry("Email", "setup_email", "Email notifications");
119
+ setup_menu_entry("Notification", "setup_notification",
120
+ "Automatic notifications of changes via outbound email");
121
+ setup_menu_entry("Email-Server", "setup_smtp",
122
+ "Activate and configure the built-in email server");
120123
setup_menu_entry("Transfers", "xfersetup",
121124
"Configure the transfer system for this repository");
122125
setup_menu_entry("Skins", "setup_skin",
123126
"Select and/or modify the web interface \"skins\"");
124127
setup_menu_entry("Moderation", "setup_modreq",
125128
126129
ADDED src/smtp.c
127130
ADDED src/webmail.c
--- src/setup.c
+++ src/setup.c
@@ -114,11 +114,14 @@
114 "Configure the trouble-ticketing system for this repository");
115 setup_menu_entry("Search","srchsetup",
116 "Configure the built-in search engine");
117 setup_menu_entry("URL Aliases", "waliassetup",
118 "Configure URL aliases");
119 setup_menu_entry("Email", "setup_email", "Email notifications");
 
 
 
120 setup_menu_entry("Transfers", "xfersetup",
121 "Configure the transfer system for this repository");
122 setup_menu_entry("Skins", "setup_skin",
123 "Select and/or modify the web interface \"skins\"");
124 setup_menu_entry("Moderation", "setup_modreq",
125
126 DDED src/smtp.c
127 DDED src/webmail.c
--- src/setup.c
+++ src/setup.c
@@ -114,11 +114,14 @@
114 "Configure the trouble-ticketing system for this repository");
115 setup_menu_entry("Search","srchsetup",
116 "Configure the built-in search engine");
117 setup_menu_entry("URL Aliases", "waliassetup",
118 "Configure URL aliases");
119 setup_menu_entry("Notification", "setup_notification",
120 "Automatic notifications of changes via outbound email");
121 setup_menu_entry("Email-Server", "setup_smtp",
122 "Activate and configure the built-in email server");
123 setup_menu_entry("Transfers", "xfersetup",
124 "Configure the transfer system for this repository");
125 setup_menu_entry("Skins", "setup_skin",
126 "Select and/or modify the web interface \"skins\"");
127 setup_menu_entry("Moderation", "setup_modreq",
128
129 DDED src/smtp.c
130 DDED src/webmail.c
+6
--- a/src/smtp.c
+++ b/src/smtp.c
@@ -0,0 +1,6 @@
1
+
2
+#ifdef __linux__
3
+# define FOSSIL_ENABLE_DNS_LOOKUP
4
+#endif
5
+
6
+#if defined(FOSSIL_ENABLE_DNS_LOOKUPndif /* defined(Fdefined(FOSSIL_EN#endif /* defined(Ffind-mx
--- a/src/smtp.c
+++ b/src/smtp.c
@@ -0,0 +1,6 @@
 
 
 
 
 
 
--- a/src/smtp.c
+++ b/src/smtp.c
@@ -0,0 +1,6 @@
1
2 #ifdef __linux__
3 # define FOSSIL_ENABLE_DNS_LOOKUP
4 #endif
5
6 #if defined(FOSSIL_ENABLE_DNS_LOOKUPndif /* defined(Fdefined(FOSSIL_EN#endif /* defined(Ffind-mx
--- a/src/webmail.c
+++ b/src/webmail.c
@@ -0,0 +1,4 @@
1
+=UBlob content; /* Encodint *aHdr; /* Two integers for each hdr line, offset and length blob_reset(&p->aBody[i].contentpNew->content = empty_blobint iOfst, int nAmtHdrHdr, sizeof(int)*2Hdr[p->nHdr*2-2] = iOfst;
2
+ , int n){
3
+ while( n>0 &&n--;
4
+ z+
--- a/src/webmail.c
+++ b/src/webmail.c
@@ -0,0 +1,4 @@
 
 
 
 
--- a/src/webmail.c
+++ b/src/webmail.c
@@ -0,0 +1,4 @@
1 =UBlob content; /* Encodint *aHdr; /* Two integers for each hdr line, offset and length blob_reset(&p->aBody[i].contentpNew->content = empty_blobint iOfst, int nAmtHdrHdr, sizeof(int)*2Hdr[p->nHdr*2-2] = iOfst;
2 , int n){
3 while( n>0 &&n--;
4 z+
+16 -4
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
2828
2929
SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB
3030
3131
SHELL_OPTIONS = -DNDEBUG=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -Dmain=sqlite3_shell -DSQLITE_SHELL_IS_UTF8=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
3232
33
-SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c email_.c encode_.c etag_.c event_.c export_.c file_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c glob_.c graph_.c gzip_.c hname_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
33
+SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c email_.c encode_.c etag_.c event_.c export_.c file_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c glob_.c graph_.c gzip_.c hname_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c smtp_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c webmail_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
3434
35
-OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\email$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
35
+OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\email$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\smtp$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\webmail$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
3636
3737
3838
RC=$(DMDIR)\bin\rcc
3939
RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
4040
@@ -49,11 +49,11 @@
4949
5050
$(OBJDIR)\fossil.res: $B\win\fossil.rc
5151
$(RC) $(RCFLAGS) -o$@ $**
5252
5353
$(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54
- +echo add allrepo attach bag bisect blob branch browse builtin bundle cache captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd descendants diff diffcmd dispatch doc email encode etag event export file finfo foci forum fshell fusefs glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp report rss schema search security_audit setup sha1 sha1hard sha3 shun sitemap skins sqlcmd stash stat statrep style sync tag tar th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
54
+ +echo add allrepo attach bag bisect blob branch browse builtin bundle cache captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd descendants diff diffcmd dispatch doc email encode etag event export file finfo foci forum fshell fusefs glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp report rss schema search security_audit setup sha1 sha1hard sha3 shun sitemap skins smtp sqlcmd stash stat statrep style sync tag tar th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile webmail wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
5555
+echo fossil >> $@
5656
+echo fossil >> $@
5757
+echo $(LIBS) >> $@
5858
+echo. >> $@
5959
+echo fossil >> $@
@@ -728,10 +728,16 @@
728728
$(OBJDIR)\skins$O : skins_.c skins.h
729729
$(TCC) -o$@ -c skins_.c
730730
731731
skins_.c : $(SRCDIR)\skins.c
732732
+translate$E $** > $@
733
+
734
+$(OBJDIR)\smtp$O : smtp_.c smtp.h
735
+ $(TCC) -o$@ -c smtp_.c
736
+
737
+smtp_.c : $(SRCDIR)\smtp.c
738
+ +translate$E $** > $@
733739
734740
$(OBJDIR)\sqlcmd$O : sqlcmd_.c sqlcmd.h
735741
$(TCC) -o$@ -c sqlcmd_.c
736742
737743
sqlcmd_.c : $(SRCDIR)\sqlcmd.c
@@ -860,10 +866,16 @@
860866
$(OBJDIR)\vfile$O : vfile_.c vfile.h
861867
$(TCC) -o$@ -c vfile_.c
862868
863869
vfile_.c : $(SRCDIR)\vfile.c
864870
+translate$E $** > $@
871
+
872
+$(OBJDIR)\webmail$O : webmail_.c webmail.h
873
+ $(TCC) -o$@ -c webmail_.c
874
+
875
+webmail_.c : $(SRCDIR)\webmail.c
876
+ +translate$E $** > $@
865877
866878
$(OBJDIR)\wiki$O : wiki_.c wiki.h
867879
$(TCC) -o$@ -c wiki_.c
868880
869881
wiki_.c : $(SRCDIR)\wiki.c
@@ -910,7 +922,7 @@
910922
911923
zip_.c : $(SRCDIR)\zip.c
912924
+translate$E $** > $@
913925
914926
headers: makeheaders$E page_index.h builtin_data.h default_css.h VERSION.h
915
- +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h email_.c:email.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
927
+ +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h email_.c:email.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h smtp_.c:smtp.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h webmail_.c:webmail.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
916928
@copy /Y nul: headers
917929
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB
30
31 SHELL_OPTIONS = -DNDEBUG=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -Dmain=sqlite3_shell -DSQLITE_SHELL_IS_UTF8=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c email_.c encode_.c etag_.c event_.c export_.c file_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c glob_.c graph_.c gzip_.c hname_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35 OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\email$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
36
37
38 RC=$(DMDIR)\bin\rcc
39 RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
40
@@ -49,11 +49,11 @@
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
53 $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54 +echo add allrepo attach bag bisect blob branch browse builtin bundle cache captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd descendants diff diffcmd dispatch doc email encode etag event export file finfo foci forum fshell fusefs glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp report rss schema search security_audit setup sha1 sha1hard sha3 shun sitemap skins sqlcmd stash stat statrep style sync tag tar th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
55 +echo fossil >> $@
56 +echo fossil >> $@
57 +echo $(LIBS) >> $@
58 +echo. >> $@
59 +echo fossil >> $@
@@ -728,10 +728,16 @@
728 $(OBJDIR)\skins$O : skins_.c skins.h
729 $(TCC) -o$@ -c skins_.c
730
731 skins_.c : $(SRCDIR)\skins.c
732 +translate$E $** > $@
 
 
 
 
 
 
733
734 $(OBJDIR)\sqlcmd$O : sqlcmd_.c sqlcmd.h
735 $(TCC) -o$@ -c sqlcmd_.c
736
737 sqlcmd_.c : $(SRCDIR)\sqlcmd.c
@@ -860,10 +866,16 @@
860 $(OBJDIR)\vfile$O : vfile_.c vfile.h
861 $(TCC) -o$@ -c vfile_.c
862
863 vfile_.c : $(SRCDIR)\vfile.c
864 +translate$E $** > $@
 
 
 
 
 
 
865
866 $(OBJDIR)\wiki$O : wiki_.c wiki.h
867 $(TCC) -o$@ -c wiki_.c
868
869 wiki_.c : $(SRCDIR)\wiki.c
@@ -910,7 +922,7 @@
910
911 zip_.c : $(SRCDIR)\zip.c
912 +translate$E $** > $@
913
914 headers: makeheaders$E page_index.h builtin_data.h default_css.h VERSION.h
915 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h email_.c:email.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
916 @copy /Y nul: headers
917
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB
30
31 SHELL_OPTIONS = -DNDEBUG=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS -DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_DEPRECATED -DSQLITE_OMIT_GET_TABLE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_USE_ALLOCA -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_DBSTAT_VTAB -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_STMTVTAB -DSQLITE_HAVE_ZLIB -DSQLITE_INTROSPECTION_PRAGMAS -DSQLITE_ENABLE_DBPAGE_VTAB -Dmain=sqlite3_shell -DSQLITE_SHELL_IS_UTF8=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=sqlcmd_get_dbname -DSQLITE_SHELL_INIT_PROC=sqlcmd_init_proc -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c cookies_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c dispatch_.c doc_.c email_.c encode_.c etag_.c event_.c export_.c file_.c finfo_.c foci_.c forum_.c fshell_.c fusefs_.c glob_.c graph_.c gzip_.c hname_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c piechart_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c security_audit_.c setup_.c sha1_.c sha1hard_.c sha3_.c shun_.c sitemap_.c skins_.c smtp_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c unversioned_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c webmail_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35 OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\cookies$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\dispatch$O $(OBJDIR)\doc$O $(OBJDIR)\email$O $(OBJDIR)\encode$O $(OBJDIR)\etag$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\forum$O $(OBJDIR)\fshell$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\hname$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\piechart$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\security_audit$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\sha1hard$O $(OBJDIR)\sha3$O $(OBJDIR)\shun$O $(OBJDIR)\sitemap$O $(OBJDIR)\skins$O $(OBJDIR)\smtp$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\statrep$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\unversioned$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\webmail$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
36
37
38 RC=$(DMDIR)\bin\rcc
39 RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
40
@@ -49,11 +49,11 @@
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
53 $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54 +echo add allrepo attach bag bisect blob branch browse builtin bundle cache captcha cgi checkin checkout clearsign clone comformat configure content cookies db delta deltacmd descendants diff diffcmd dispatch doc email encode etag event export file finfo foci forum fshell fusefs glob graph gzip hname http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path piechart pivot popen pqueue printf publish purge rebuild regexp report rss schema search security_audit setup sha1 sha1hard sha3 shun sitemap skins smtp sqlcmd stash stat statrep style sync tag tar th_main timeline tkt tktsetup undo unicode unversioned update url user utf8 util verify vfile webmail wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
55 +echo fossil >> $@
56 +echo fossil >> $@
57 +echo $(LIBS) >> $@
58 +echo. >> $@
59 +echo fossil >> $@
@@ -728,10 +728,16 @@
728 $(OBJDIR)\skins$O : skins_.c skins.h
729 $(TCC) -o$@ -c skins_.c
730
731 skins_.c : $(SRCDIR)\skins.c
732 +translate$E $** > $@
733
734 $(OBJDIR)\smtp$O : smtp_.c smtp.h
735 $(TCC) -o$@ -c smtp_.c
736
737 smtp_.c : $(SRCDIR)\smtp.c
738 +translate$E $** > $@
739
740 $(OBJDIR)\sqlcmd$O : sqlcmd_.c sqlcmd.h
741 $(TCC) -o$@ -c sqlcmd_.c
742
743 sqlcmd_.c : $(SRCDIR)\sqlcmd.c
@@ -860,10 +866,16 @@
866 $(OBJDIR)\vfile$O : vfile_.c vfile.h
867 $(TCC) -o$@ -c vfile_.c
868
869 vfile_.c : $(SRCDIR)\vfile.c
870 +translate$E $** > $@
871
872 $(OBJDIR)\webmail$O : webmail_.c webmail.h
873 $(TCC) -o$@ -c webmail_.c
874
875 webmail_.c : $(SRCDIR)\webmail.c
876 +translate$E $** > $@
877
878 $(OBJDIR)\wiki$O : wiki_.c wiki.h
879 $(TCC) -o$@ -c wiki_.c
880
881 wiki_.c : $(SRCDIR)\wiki.c
@@ -910,7 +922,7 @@
922
923 zip_.c : $(SRCDIR)\zip.c
924 +translate$E $** > $@
925
926 headers: makeheaders$E page_index.h builtin_data.h default_css.h VERSION.h
927 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h cookies_.c:cookies.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h dispatch_.c:dispatch.h doc_.c:doc.h email_.c:email.h encode_.c:encode.h etag_.c:etag.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h forum_.c:forum.h fshell_.c:fshell.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h hname_.c:hname.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h piechart_.c:piechart.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h security_audit_.c:security_audit.h setup_.c:setup.h sha1_.c:sha1.h sha1hard_.c:sha1hard.h sha3_.c:sha3.h shun_.c:shun.h sitemap_.c:sitemap.h skins_.c:skins.h smtp_.c:smtp.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h statrep_.c:statrep.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h unversioned_.c:unversioned.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h webmail_.c:webmail.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
928 @copy /Y nul: headers
929
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -532,10 +532,11 @@
532532
$(SRCDIR)/sha1hard.c \
533533
$(SRCDIR)/sha3.c \
534534
$(SRCDIR)/shun.c \
535535
$(SRCDIR)/sitemap.c \
536536
$(SRCDIR)/skins.c \
537
+ $(SRCDIR)/smtp.c \
537538
$(SRCDIR)/sqlcmd.c \
538539
$(SRCDIR)/stash.c \
539540
$(SRCDIR)/stat.c \
540541
$(SRCDIR)/statrep.c \
541542
$(SRCDIR)/style.c \
@@ -554,10 +555,11 @@
554555
$(SRCDIR)/user.c \
555556
$(SRCDIR)/utf8.c \
556557
$(SRCDIR)/util.c \
557558
$(SRCDIR)/verify.c \
558559
$(SRCDIR)/vfile.c \
560
+ $(SRCDIR)/webmail.c \
559561
$(SRCDIR)/wiki.c \
560562
$(SRCDIR)/wikiformat.c \
561563
$(SRCDIR)/winfile.c \
562564
$(SRCDIR)/winhttp.c \
563565
$(SRCDIR)/wysiwyg.c \
@@ -735,10 +737,11 @@
735737
$(OBJDIR)/sha1hard_.c \
736738
$(OBJDIR)/sha3_.c \
737739
$(OBJDIR)/shun_.c \
738740
$(OBJDIR)/sitemap_.c \
739741
$(OBJDIR)/skins_.c \
742
+ $(OBJDIR)/smtp_.c \
740743
$(OBJDIR)/sqlcmd_.c \
741744
$(OBJDIR)/stash_.c \
742745
$(OBJDIR)/stat_.c \
743746
$(OBJDIR)/statrep_.c \
744747
$(OBJDIR)/style_.c \
@@ -757,10 +760,11 @@
757760
$(OBJDIR)/user_.c \
758761
$(OBJDIR)/utf8_.c \
759762
$(OBJDIR)/util_.c \
760763
$(OBJDIR)/verify_.c \
761764
$(OBJDIR)/vfile_.c \
765
+ $(OBJDIR)/webmail_.c \
762766
$(OBJDIR)/wiki_.c \
763767
$(OBJDIR)/wikiformat_.c \
764768
$(OBJDIR)/winfile_.c \
765769
$(OBJDIR)/winhttp_.c \
766770
$(OBJDIR)/wysiwyg_.c \
@@ -867,10 +871,11 @@
867871
$(OBJDIR)/sha1hard.o \
868872
$(OBJDIR)/sha3.o \
869873
$(OBJDIR)/shun.o \
870874
$(OBJDIR)/sitemap.o \
871875
$(OBJDIR)/skins.o \
876
+ $(OBJDIR)/smtp.o \
872877
$(OBJDIR)/sqlcmd.o \
873878
$(OBJDIR)/stash.o \
874879
$(OBJDIR)/stat.o \
875880
$(OBJDIR)/statrep.o \
876881
$(OBJDIR)/style.o \
@@ -889,10 +894,11 @@
889894
$(OBJDIR)/user.o \
890895
$(OBJDIR)/utf8.o \
891896
$(OBJDIR)/util.o \
892897
$(OBJDIR)/verify.o \
893898
$(OBJDIR)/vfile.o \
899
+ $(OBJDIR)/webmail.o \
894900
$(OBJDIR)/wiki.o \
895901
$(OBJDIR)/wikiformat.o \
896902
$(OBJDIR)/winfile.o \
897903
$(OBJDIR)/winhttp.o \
898904
$(OBJDIR)/wysiwyg.o \
@@ -1218,10 +1224,11 @@
12181224
$(OBJDIR)/sha1hard_.c:$(OBJDIR)/sha1hard.h \
12191225
$(OBJDIR)/sha3_.c:$(OBJDIR)/sha3.h \
12201226
$(OBJDIR)/shun_.c:$(OBJDIR)/shun.h \
12211227
$(OBJDIR)/sitemap_.c:$(OBJDIR)/sitemap.h \
12221228
$(OBJDIR)/skins_.c:$(OBJDIR)/skins.h \
1229
+ $(OBJDIR)/smtp_.c:$(OBJDIR)/smtp.h \
12231230
$(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h \
12241231
$(OBJDIR)/stash_.c:$(OBJDIR)/stash.h \
12251232
$(OBJDIR)/stat_.c:$(OBJDIR)/stat.h \
12261233
$(OBJDIR)/statrep_.c:$(OBJDIR)/statrep.h \
12271234
$(OBJDIR)/style_.c:$(OBJDIR)/style.h \
@@ -1240,10 +1247,11 @@
12401247
$(OBJDIR)/user_.c:$(OBJDIR)/user.h \
12411248
$(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h \
12421249
$(OBJDIR)/util_.c:$(OBJDIR)/util.h \
12431250
$(OBJDIR)/verify_.c:$(OBJDIR)/verify.h \
12441251
$(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h \
1252
+ $(OBJDIR)/webmail_.c:$(OBJDIR)/webmail.h \
12451253
$(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h \
12461254
$(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h \
12471255
$(OBJDIR)/winfile_.c:$(OBJDIR)/winfile.h \
12481256
$(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h \
12491257
$(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h \
@@ -2056,10 +2064,18 @@
20562064
20572065
$(OBJDIR)/skins.o: $(OBJDIR)/skins_.c $(OBJDIR)/skins.h $(SRCDIR)/config.h
20582066
$(XTCC) -o $(OBJDIR)/skins.o -c $(OBJDIR)/skins_.c
20592067
20602068
$(OBJDIR)/skins.h: $(OBJDIR)/headers
2069
+
2070
+$(OBJDIR)/smtp_.c: $(SRCDIR)/smtp.c $(TRANSLATE)
2071
+ $(TRANSLATE) $(SRCDIR)/smtp.c >$@
2072
+
2073
+$(OBJDIR)/smtp.o: $(OBJDIR)/smtp_.c $(OBJDIR)/smtp.h $(SRCDIR)/config.h
2074
+ $(XTCC) -o $(OBJDIR)/smtp.o -c $(OBJDIR)/smtp_.c
2075
+
2076
+$(OBJDIR)/smtp.h: $(OBJDIR)/headers
20612077
20622078
$(OBJDIR)/sqlcmd_.c: $(SRCDIR)/sqlcmd.c $(TRANSLATE)
20632079
$(TRANSLATE) $(SRCDIR)/sqlcmd.c >$@
20642080
20652081
$(OBJDIR)/sqlcmd.o: $(OBJDIR)/sqlcmd_.c $(OBJDIR)/sqlcmd.h $(SRCDIR)/config.h
@@ -2232,10 +2248,18 @@
22322248
22332249
$(OBJDIR)/vfile.o: $(OBJDIR)/vfile_.c $(OBJDIR)/vfile.h $(SRCDIR)/config.h
22342250
$(XTCC) -o $(OBJDIR)/vfile.o -c $(OBJDIR)/vfile_.c
22352251
22362252
$(OBJDIR)/vfile.h: $(OBJDIR)/headers
2253
+
2254
+$(OBJDIR)/webmail_.c: $(SRCDIR)/webmail.c $(TRANSLATE)
2255
+ $(TRANSLATE) $(SRCDIR)/webmail.c >$@
2256
+
2257
+$(OBJDIR)/webmail.o: $(OBJDIR)/webmail_.c $(OBJDIR)/webmail.h $(SRCDIR)/config.h
2258
+ $(XTCC) -o $(OBJDIR)/webmail.o -c $(OBJDIR)/webmail_.c
2259
+
2260
+$(OBJDIR)/webmail.h: $(OBJDIR)/headers
22372261
22382262
$(OBJDIR)/wiki_.c: $(SRCDIR)/wiki.c $(TRANSLATE)
22392263
$(TRANSLATE) $(SRCDIR)/wiki.c >$@
22402264
22412265
$(OBJDIR)/wiki.o: $(OBJDIR)/wiki_.c $(OBJDIR)/wiki.h $(SRCDIR)/config.h
22422266
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -532,10 +532,11 @@
532 $(SRCDIR)/sha1hard.c \
533 $(SRCDIR)/sha3.c \
534 $(SRCDIR)/shun.c \
535 $(SRCDIR)/sitemap.c \
536 $(SRCDIR)/skins.c \
 
537 $(SRCDIR)/sqlcmd.c \
538 $(SRCDIR)/stash.c \
539 $(SRCDIR)/stat.c \
540 $(SRCDIR)/statrep.c \
541 $(SRCDIR)/style.c \
@@ -554,10 +555,11 @@
554 $(SRCDIR)/user.c \
555 $(SRCDIR)/utf8.c \
556 $(SRCDIR)/util.c \
557 $(SRCDIR)/verify.c \
558 $(SRCDIR)/vfile.c \
 
559 $(SRCDIR)/wiki.c \
560 $(SRCDIR)/wikiformat.c \
561 $(SRCDIR)/winfile.c \
562 $(SRCDIR)/winhttp.c \
563 $(SRCDIR)/wysiwyg.c \
@@ -735,10 +737,11 @@
735 $(OBJDIR)/sha1hard_.c \
736 $(OBJDIR)/sha3_.c \
737 $(OBJDIR)/shun_.c \
738 $(OBJDIR)/sitemap_.c \
739 $(OBJDIR)/skins_.c \
 
740 $(OBJDIR)/sqlcmd_.c \
741 $(OBJDIR)/stash_.c \
742 $(OBJDIR)/stat_.c \
743 $(OBJDIR)/statrep_.c \
744 $(OBJDIR)/style_.c \
@@ -757,10 +760,11 @@
757 $(OBJDIR)/user_.c \
758 $(OBJDIR)/utf8_.c \
759 $(OBJDIR)/util_.c \
760 $(OBJDIR)/verify_.c \
761 $(OBJDIR)/vfile_.c \
 
762 $(OBJDIR)/wiki_.c \
763 $(OBJDIR)/wikiformat_.c \
764 $(OBJDIR)/winfile_.c \
765 $(OBJDIR)/winhttp_.c \
766 $(OBJDIR)/wysiwyg_.c \
@@ -867,10 +871,11 @@
867 $(OBJDIR)/sha1hard.o \
868 $(OBJDIR)/sha3.o \
869 $(OBJDIR)/shun.o \
870 $(OBJDIR)/sitemap.o \
871 $(OBJDIR)/skins.o \
 
872 $(OBJDIR)/sqlcmd.o \
873 $(OBJDIR)/stash.o \
874 $(OBJDIR)/stat.o \
875 $(OBJDIR)/statrep.o \
876 $(OBJDIR)/style.o \
@@ -889,10 +894,11 @@
889 $(OBJDIR)/user.o \
890 $(OBJDIR)/utf8.o \
891 $(OBJDIR)/util.o \
892 $(OBJDIR)/verify.o \
893 $(OBJDIR)/vfile.o \
 
894 $(OBJDIR)/wiki.o \
895 $(OBJDIR)/wikiformat.o \
896 $(OBJDIR)/winfile.o \
897 $(OBJDIR)/winhttp.o \
898 $(OBJDIR)/wysiwyg.o \
@@ -1218,10 +1224,11 @@
1218 $(OBJDIR)/sha1hard_.c:$(OBJDIR)/sha1hard.h \
1219 $(OBJDIR)/sha3_.c:$(OBJDIR)/sha3.h \
1220 $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h \
1221 $(OBJDIR)/sitemap_.c:$(OBJDIR)/sitemap.h \
1222 $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h \
 
1223 $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h \
1224 $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h \
1225 $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h \
1226 $(OBJDIR)/statrep_.c:$(OBJDIR)/statrep.h \
1227 $(OBJDIR)/style_.c:$(OBJDIR)/style.h \
@@ -1240,10 +1247,11 @@
1240 $(OBJDIR)/user_.c:$(OBJDIR)/user.h \
1241 $(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h \
1242 $(OBJDIR)/util_.c:$(OBJDIR)/util.h \
1243 $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h \
1244 $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h \
 
1245 $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h \
1246 $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h \
1247 $(OBJDIR)/winfile_.c:$(OBJDIR)/winfile.h \
1248 $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h \
1249 $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h \
@@ -2056,10 +2064,18 @@
2056
2057 $(OBJDIR)/skins.o: $(OBJDIR)/skins_.c $(OBJDIR)/skins.h $(SRCDIR)/config.h
2058 $(XTCC) -o $(OBJDIR)/skins.o -c $(OBJDIR)/skins_.c
2059
2060 $(OBJDIR)/skins.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
2061
2062 $(OBJDIR)/sqlcmd_.c: $(SRCDIR)/sqlcmd.c $(TRANSLATE)
2063 $(TRANSLATE) $(SRCDIR)/sqlcmd.c >$@
2064
2065 $(OBJDIR)/sqlcmd.o: $(OBJDIR)/sqlcmd_.c $(OBJDIR)/sqlcmd.h $(SRCDIR)/config.h
@@ -2232,10 +2248,18 @@
2232
2233 $(OBJDIR)/vfile.o: $(OBJDIR)/vfile_.c $(OBJDIR)/vfile.h $(SRCDIR)/config.h
2234 $(XTCC) -o $(OBJDIR)/vfile.o -c $(OBJDIR)/vfile_.c
2235
2236 $(OBJDIR)/vfile.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
2237
2238 $(OBJDIR)/wiki_.c: $(SRCDIR)/wiki.c $(TRANSLATE)
2239 $(TRANSLATE) $(SRCDIR)/wiki.c >$@
2240
2241 $(OBJDIR)/wiki.o: $(OBJDIR)/wiki_.c $(OBJDIR)/wiki.h $(SRCDIR)/config.h
2242
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -532,10 +532,11 @@
532 $(SRCDIR)/sha1hard.c \
533 $(SRCDIR)/sha3.c \
534 $(SRCDIR)/shun.c \
535 $(SRCDIR)/sitemap.c \
536 $(SRCDIR)/skins.c \
537 $(SRCDIR)/smtp.c \
538 $(SRCDIR)/sqlcmd.c \
539 $(SRCDIR)/stash.c \
540 $(SRCDIR)/stat.c \
541 $(SRCDIR)/statrep.c \
542 $(SRCDIR)/style.c \
@@ -554,10 +555,11 @@
555 $(SRCDIR)/user.c \
556 $(SRCDIR)/utf8.c \
557 $(SRCDIR)/util.c \
558 $(SRCDIR)/verify.c \
559 $(SRCDIR)/vfile.c \
560 $(SRCDIR)/webmail.c \
561 $(SRCDIR)/wiki.c \
562 $(SRCDIR)/wikiformat.c \
563 $(SRCDIR)/winfile.c \
564 $(SRCDIR)/winhttp.c \
565 $(SRCDIR)/wysiwyg.c \
@@ -735,10 +737,11 @@
737 $(OBJDIR)/sha1hard_.c \
738 $(OBJDIR)/sha3_.c \
739 $(OBJDIR)/shun_.c \
740 $(OBJDIR)/sitemap_.c \
741 $(OBJDIR)/skins_.c \
742 $(OBJDIR)/smtp_.c \
743 $(OBJDIR)/sqlcmd_.c \
744 $(OBJDIR)/stash_.c \
745 $(OBJDIR)/stat_.c \
746 $(OBJDIR)/statrep_.c \
747 $(OBJDIR)/style_.c \
@@ -757,10 +760,11 @@
760 $(OBJDIR)/user_.c \
761 $(OBJDIR)/utf8_.c \
762 $(OBJDIR)/util_.c \
763 $(OBJDIR)/verify_.c \
764 $(OBJDIR)/vfile_.c \
765 $(OBJDIR)/webmail_.c \
766 $(OBJDIR)/wiki_.c \
767 $(OBJDIR)/wikiformat_.c \
768 $(OBJDIR)/winfile_.c \
769 $(OBJDIR)/winhttp_.c \
770 $(OBJDIR)/wysiwyg_.c \
@@ -867,10 +871,11 @@
871 $(OBJDIR)/sha1hard.o \
872 $(OBJDIR)/sha3.o \
873 $(OBJDIR)/shun.o \
874 $(OBJDIR)/sitemap.o \
875 $(OBJDIR)/skins.o \
876 $(OBJDIR)/smtp.o \
877 $(OBJDIR)/sqlcmd.o \
878 $(OBJDIR)/stash.o \
879 $(OBJDIR)/stat.o \
880 $(OBJDIR)/statrep.o \
881 $(OBJDIR)/style.o \
@@ -889,10 +894,11 @@
894 $(OBJDIR)/user.o \
895 $(OBJDIR)/utf8.o \
896 $(OBJDIR)/util.o \
897 $(OBJDIR)/verify.o \
898 $(OBJDIR)/vfile.o \
899 $(OBJDIR)/webmail.o \
900 $(OBJDIR)/wiki.o \
901 $(OBJDIR)/wikiformat.o \
902 $(OBJDIR)/winfile.o \
903 $(OBJDIR)/winhttp.o \
904 $(OBJDIR)/wysiwyg.o \
@@ -1218,10 +1224,11 @@
1224 $(OBJDIR)/sha1hard_.c:$(OBJDIR)/sha1hard.h \
1225 $(OBJDIR)/sha3_.c:$(OBJDIR)/sha3.h \
1226 $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h \
1227 $(OBJDIR)/sitemap_.c:$(OBJDIR)/sitemap.h \
1228 $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h \
1229 $(OBJDIR)/smtp_.c:$(OBJDIR)/smtp.h \
1230 $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h \
1231 $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h \
1232 $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h \
1233 $(OBJDIR)/statrep_.c:$(OBJDIR)/statrep.h \
1234 $(OBJDIR)/style_.c:$(OBJDIR)/style.h \
@@ -1240,10 +1247,11 @@
1247 $(OBJDIR)/user_.c:$(OBJDIR)/user.h \
1248 $(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h \
1249 $(OBJDIR)/util_.c:$(OBJDIR)/util.h \
1250 $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h \
1251 $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h \
1252 $(OBJDIR)/webmail_.c:$(OBJDIR)/webmail.h \
1253 $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h \
1254 $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h \
1255 $(OBJDIR)/winfile_.c:$(OBJDIR)/winfile.h \
1256 $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h \
1257 $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h \
@@ -2056,10 +2064,18 @@
2064
2065 $(OBJDIR)/skins.o: $(OBJDIR)/skins_.c $(OBJDIR)/skins.h $(SRCDIR)/config.h
2066 $(XTCC) -o $(OBJDIR)/skins.o -c $(OBJDIR)/skins_.c
2067
2068 $(OBJDIR)/skins.h: $(OBJDIR)/headers
2069
2070 $(OBJDIR)/smtp_.c: $(SRCDIR)/smtp.c $(TRANSLATE)
2071 $(TRANSLATE) $(SRCDIR)/smtp.c >$@
2072
2073 $(OBJDIR)/smtp.o: $(OBJDIR)/smtp_.c $(OBJDIR)/smtp.h $(SRCDIR)/config.h
2074 $(XTCC) -o $(OBJDIR)/smtp.o -c $(OBJDIR)/smtp_.c
2075
2076 $(OBJDIR)/smtp.h: $(OBJDIR)/headers
2077
2078 $(OBJDIR)/sqlcmd_.c: $(SRCDIR)/sqlcmd.c $(TRANSLATE)
2079 $(TRANSLATE) $(SRCDIR)/sqlcmd.c >$@
2080
2081 $(OBJDIR)/sqlcmd.o: $(OBJDIR)/sqlcmd_.c $(OBJDIR)/sqlcmd.h $(SRCDIR)/config.h
@@ -2232,10 +2248,18 @@
2248
2249 $(OBJDIR)/vfile.o: $(OBJDIR)/vfile_.c $(OBJDIR)/vfile.h $(SRCDIR)/config.h
2250 $(XTCC) -o $(OBJDIR)/vfile.o -c $(OBJDIR)/vfile_.c
2251
2252 $(OBJDIR)/vfile.h: $(OBJDIR)/headers
2253
2254 $(OBJDIR)/webmail_.c: $(SRCDIR)/webmail.c $(TRANSLATE)
2255 $(TRANSLATE) $(SRCDIR)/webmail.c >$@
2256
2257 $(OBJDIR)/webmail.o: $(OBJDIR)/webmail_.c $(OBJDIR)/webmail.h $(SRCDIR)/config.h
2258 $(XTCC) -o $(OBJDIR)/webmail.o -c $(OBJDIR)/webmail_.c
2259
2260 $(OBJDIR)/webmail.h: $(OBJDIR)/headers
2261
2262 $(OBJDIR)/wiki_.c: $(SRCDIR)/wiki.c $(TRANSLATE)
2263 $(TRANSLATE) $(SRCDIR)/wiki.c >$@
2264
2265 $(OBJDIR)/wiki.o: $(OBJDIR)/wiki_.c $(OBJDIR)/wiki.h $(SRCDIR)/config.h
2266
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -478,10 +478,11 @@
478478
sha1hard_.c \
479479
sha3_.c \
480480
shun_.c \
481481
sitemap_.c \
482482
skins_.c \
483
+ smtp_.c \
483484
sqlcmd_.c \
484485
stash_.c \
485486
stat_.c \
486487
statrep_.c \
487488
style_.c \
@@ -500,10 +501,11 @@
500501
user_.c \
501502
utf8_.c \
502503
util_.c \
503504
verify_.c \
504505
vfile_.c \
506
+ webmail_.c \
505507
wiki_.c \
506508
wikiformat_.c \
507509
winfile_.c \
508510
winhttp_.c \
509511
wysiwyg_.c \
@@ -681,10 +683,11 @@
681683
$(OX)\sha3$O \
682684
$(OX)\shell$O \
683685
$(OX)\shun$O \
684686
$(OX)\sitemap$O \
685687
$(OX)\skins$O \
688
+ $(OX)\smtp$O \
686689
$(OX)\sqlcmd$O \
687690
$(OX)\sqlite3$O \
688691
$(OX)\stash$O \
689692
$(OX)\stat$O \
690693
$(OX)\statrep$O \
@@ -707,10 +710,11 @@
707710
$(OX)\user$O \
708711
$(OX)\utf8$O \
709712
$(OX)\util$O \
710713
$(OX)\verify$O \
711714
$(OX)\vfile$O \
715
+ $(OX)\webmail$O \
712716
$(OX)\wiki$O \
713717
$(OX)\wikiformat$O \
714718
$(OX)\winfile$O \
715719
$(OX)\winhttp$O \
716720
$(OX)\wysiwyg$O \
@@ -872,10 +876,11 @@
872876
echo $(OX)\sha3.obj >> $@
873877
echo $(OX)\shell.obj >> $@
874878
echo $(OX)\shun.obj >> $@
875879
echo $(OX)\sitemap.obj >> $@
876880
echo $(OX)\skins.obj >> $@
881
+ echo $(OX)\smtp.obj >> $@
877882
echo $(OX)\sqlcmd.obj >> $@
878883
echo $(OX)\sqlite3.obj >> $@
879884
echo $(OX)\stash.obj >> $@
880885
echo $(OX)\stat.obj >> $@
881886
echo $(OX)\statrep.obj >> $@
@@ -898,10 +903,11 @@
898903
echo $(OX)\user.obj >> $@
899904
echo $(OX)\utf8.obj >> $@
900905
echo $(OX)\util.obj >> $@
901906
echo $(OX)\verify.obj >> $@
902907
echo $(OX)\vfile.obj >> $@
908
+ echo $(OX)\webmail.obj >> $@
903909
echo $(OX)\wiki.obj >> $@
904910
echo $(OX)\wikiformat.obj >> $@
905911
echo $(OX)\winfile.obj >> $@
906912
echo $(OX)\winhttp.obj >> $@
907913
echo $(OX)\wysiwyg.obj >> $@
@@ -1623,10 +1629,16 @@
16231629
$(OX)\skins$O : skins_.c skins.h
16241630
$(TCC) /Fo$@ -c skins_.c
16251631
16261632
skins_.c : $(SRCDIR)\skins.c
16271633
translate$E $** > $@
1634
+
1635
+$(OX)\smtp$O : smtp_.c smtp.h
1636
+ $(TCC) /Fo$@ -c smtp_.c
1637
+
1638
+smtp_.c : $(SRCDIR)\smtp.c
1639
+ translate$E $** > $@
16281640
16291641
$(OX)\sqlcmd$O : sqlcmd_.c sqlcmd.h
16301642
$(TCC) /Fo$@ -c sqlcmd_.c
16311643
16321644
sqlcmd_.c : $(SRCDIR)\sqlcmd.c
@@ -1755,10 +1767,16 @@
17551767
$(OX)\vfile$O : vfile_.c vfile.h
17561768
$(TCC) /Fo$@ -c vfile_.c
17571769
17581770
vfile_.c : $(SRCDIR)\vfile.c
17591771
translate$E $** > $@
1772
+
1773
+$(OX)\webmail$O : webmail_.c webmail.h
1774
+ $(TCC) /Fo$@ -c webmail_.c
1775
+
1776
+webmail_.c : $(SRCDIR)\webmail.c
1777
+ translate$E $** > $@
17601778
17611779
$(OX)\wiki$O : wiki_.c wiki.h
17621780
$(TCC) /Fo$@ -c wiki_.c
17631781
17641782
wiki_.c : $(SRCDIR)\wiki.c
@@ -1908,10 +1926,11 @@
19081926
sha1hard_.c:sha1hard.h \
19091927
sha3_.c:sha3.h \
19101928
shun_.c:shun.h \
19111929
sitemap_.c:sitemap.h \
19121930
skins_.c:skins.h \
1931
+ smtp_.c:smtp.h \
19131932
sqlcmd_.c:sqlcmd.h \
19141933
stash_.c:stash.h \
19151934
stat_.c:stat.h \
19161935
statrep_.c:statrep.h \
19171936
style_.c:style.h \
@@ -1930,10 +1949,11 @@
19301949
user_.c:user.h \
19311950
utf8_.c:utf8.h \
19321951
util_.c:util.h \
19331952
verify_.c:verify.h \
19341953
vfile_.c:vfile.h \
1954
+ webmail_.c:webmail.h \
19351955
wiki_.c:wiki.h \
19361956
wikiformat_.c:wikiformat.h \
19371957
winfile_.c:winfile.h \
19381958
winhttp_.c:winhttp.h \
19391959
wysiwyg_.c:wysiwyg.h \
19401960
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -478,10 +478,11 @@
478 sha1hard_.c \
479 sha3_.c \
480 shun_.c \
481 sitemap_.c \
482 skins_.c \
 
483 sqlcmd_.c \
484 stash_.c \
485 stat_.c \
486 statrep_.c \
487 style_.c \
@@ -500,10 +501,11 @@
500 user_.c \
501 utf8_.c \
502 util_.c \
503 verify_.c \
504 vfile_.c \
 
505 wiki_.c \
506 wikiformat_.c \
507 winfile_.c \
508 winhttp_.c \
509 wysiwyg_.c \
@@ -681,10 +683,11 @@
681 $(OX)\sha3$O \
682 $(OX)\shell$O \
683 $(OX)\shun$O \
684 $(OX)\sitemap$O \
685 $(OX)\skins$O \
 
686 $(OX)\sqlcmd$O \
687 $(OX)\sqlite3$O \
688 $(OX)\stash$O \
689 $(OX)\stat$O \
690 $(OX)\statrep$O \
@@ -707,10 +710,11 @@
707 $(OX)\user$O \
708 $(OX)\utf8$O \
709 $(OX)\util$O \
710 $(OX)\verify$O \
711 $(OX)\vfile$O \
 
712 $(OX)\wiki$O \
713 $(OX)\wikiformat$O \
714 $(OX)\winfile$O \
715 $(OX)\winhttp$O \
716 $(OX)\wysiwyg$O \
@@ -872,10 +876,11 @@
872 echo $(OX)\sha3.obj >> $@
873 echo $(OX)\shell.obj >> $@
874 echo $(OX)\shun.obj >> $@
875 echo $(OX)\sitemap.obj >> $@
876 echo $(OX)\skins.obj >> $@
 
877 echo $(OX)\sqlcmd.obj >> $@
878 echo $(OX)\sqlite3.obj >> $@
879 echo $(OX)\stash.obj >> $@
880 echo $(OX)\stat.obj >> $@
881 echo $(OX)\statrep.obj >> $@
@@ -898,10 +903,11 @@
898 echo $(OX)\user.obj >> $@
899 echo $(OX)\utf8.obj >> $@
900 echo $(OX)\util.obj >> $@
901 echo $(OX)\verify.obj >> $@
902 echo $(OX)\vfile.obj >> $@
 
903 echo $(OX)\wiki.obj >> $@
904 echo $(OX)\wikiformat.obj >> $@
905 echo $(OX)\winfile.obj >> $@
906 echo $(OX)\winhttp.obj >> $@
907 echo $(OX)\wysiwyg.obj >> $@
@@ -1623,10 +1629,16 @@
1623 $(OX)\skins$O : skins_.c skins.h
1624 $(TCC) /Fo$@ -c skins_.c
1625
1626 skins_.c : $(SRCDIR)\skins.c
1627 translate$E $** > $@
 
 
 
 
 
 
1628
1629 $(OX)\sqlcmd$O : sqlcmd_.c sqlcmd.h
1630 $(TCC) /Fo$@ -c sqlcmd_.c
1631
1632 sqlcmd_.c : $(SRCDIR)\sqlcmd.c
@@ -1755,10 +1767,16 @@
1755 $(OX)\vfile$O : vfile_.c vfile.h
1756 $(TCC) /Fo$@ -c vfile_.c
1757
1758 vfile_.c : $(SRCDIR)\vfile.c
1759 translate$E $** > $@
 
 
 
 
 
 
1760
1761 $(OX)\wiki$O : wiki_.c wiki.h
1762 $(TCC) /Fo$@ -c wiki_.c
1763
1764 wiki_.c : $(SRCDIR)\wiki.c
@@ -1908,10 +1926,11 @@
1908 sha1hard_.c:sha1hard.h \
1909 sha3_.c:sha3.h \
1910 shun_.c:shun.h \
1911 sitemap_.c:sitemap.h \
1912 skins_.c:skins.h \
 
1913 sqlcmd_.c:sqlcmd.h \
1914 stash_.c:stash.h \
1915 stat_.c:stat.h \
1916 statrep_.c:statrep.h \
1917 style_.c:style.h \
@@ -1930,10 +1949,11 @@
1930 user_.c:user.h \
1931 utf8_.c:utf8.h \
1932 util_.c:util.h \
1933 verify_.c:verify.h \
1934 vfile_.c:vfile.h \
 
1935 wiki_.c:wiki.h \
1936 wikiformat_.c:wikiformat.h \
1937 winfile_.c:winfile.h \
1938 winhttp_.c:winhttp.h \
1939 wysiwyg_.c:wysiwyg.h \
1940
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -478,10 +478,11 @@
478 sha1hard_.c \
479 sha3_.c \
480 shun_.c \
481 sitemap_.c \
482 skins_.c \
483 smtp_.c \
484 sqlcmd_.c \
485 stash_.c \
486 stat_.c \
487 statrep_.c \
488 style_.c \
@@ -500,10 +501,11 @@
501 user_.c \
502 utf8_.c \
503 util_.c \
504 verify_.c \
505 vfile_.c \
506 webmail_.c \
507 wiki_.c \
508 wikiformat_.c \
509 winfile_.c \
510 winhttp_.c \
511 wysiwyg_.c \
@@ -681,10 +683,11 @@
683 $(OX)\sha3$O \
684 $(OX)\shell$O \
685 $(OX)\shun$O \
686 $(OX)\sitemap$O \
687 $(OX)\skins$O \
688 $(OX)\smtp$O \
689 $(OX)\sqlcmd$O \
690 $(OX)\sqlite3$O \
691 $(OX)\stash$O \
692 $(OX)\stat$O \
693 $(OX)\statrep$O \
@@ -707,10 +710,11 @@
710 $(OX)\user$O \
711 $(OX)\utf8$O \
712 $(OX)\util$O \
713 $(OX)\verify$O \
714 $(OX)\vfile$O \
715 $(OX)\webmail$O \
716 $(OX)\wiki$O \
717 $(OX)\wikiformat$O \
718 $(OX)\winfile$O \
719 $(OX)\winhttp$O \
720 $(OX)\wysiwyg$O \
@@ -872,10 +876,11 @@
876 echo $(OX)\sha3.obj >> $@
877 echo $(OX)\shell.obj >> $@
878 echo $(OX)\shun.obj >> $@
879 echo $(OX)\sitemap.obj >> $@
880 echo $(OX)\skins.obj >> $@
881 echo $(OX)\smtp.obj >> $@
882 echo $(OX)\sqlcmd.obj >> $@
883 echo $(OX)\sqlite3.obj >> $@
884 echo $(OX)\stash.obj >> $@
885 echo $(OX)\stat.obj >> $@
886 echo $(OX)\statrep.obj >> $@
@@ -898,10 +903,11 @@
903 echo $(OX)\user.obj >> $@
904 echo $(OX)\utf8.obj >> $@
905 echo $(OX)\util.obj >> $@
906 echo $(OX)\verify.obj >> $@
907 echo $(OX)\vfile.obj >> $@
908 echo $(OX)\webmail.obj >> $@
909 echo $(OX)\wiki.obj >> $@
910 echo $(OX)\wikiformat.obj >> $@
911 echo $(OX)\winfile.obj >> $@
912 echo $(OX)\winhttp.obj >> $@
913 echo $(OX)\wysiwyg.obj >> $@
@@ -1623,10 +1629,16 @@
1629 $(OX)\skins$O : skins_.c skins.h
1630 $(TCC) /Fo$@ -c skins_.c
1631
1632 skins_.c : $(SRCDIR)\skins.c
1633 translate$E $** > $@
1634
1635 $(OX)\smtp$O : smtp_.c smtp.h
1636 $(TCC) /Fo$@ -c smtp_.c
1637
1638 smtp_.c : $(SRCDIR)\smtp.c
1639 translate$E $** > $@
1640
1641 $(OX)\sqlcmd$O : sqlcmd_.c sqlcmd.h
1642 $(TCC) /Fo$@ -c sqlcmd_.c
1643
1644 sqlcmd_.c : $(SRCDIR)\sqlcmd.c
@@ -1755,10 +1767,16 @@
1767 $(OX)\vfile$O : vfile_.c vfile.h
1768 $(TCC) /Fo$@ -c vfile_.c
1769
1770 vfile_.c : $(SRCDIR)\vfile.c
1771 translate$E $** > $@
1772
1773 $(OX)\webmail$O : webmail_.c webmail.h
1774 $(TCC) /Fo$@ -c webmail_.c
1775
1776 webmail_.c : $(SRCDIR)\webmail.c
1777 translate$E $** > $@
1778
1779 $(OX)\wiki$O : wiki_.c wiki.h
1780 $(TCC) /Fo$@ -c wiki_.c
1781
1782 wiki_.c : $(SRCDIR)\wiki.c
@@ -1908,10 +1926,11 @@
1926 sha1hard_.c:sha1hard.h \
1927 sha3_.c:sha3.h \
1928 shun_.c:shun.h \
1929 sitemap_.c:sitemap.h \
1930 skins_.c:skins.h \
1931 smtp_.c:smtp.h \
1932 sqlcmd_.c:sqlcmd.h \
1933 stash_.c:stash.h \
1934 stat_.c:stat.h \
1935 statrep_.c:statrep.h \
1936 style_.c:style.h \
@@ -1930,10 +1949,11 @@
1949 user_.c:user.h \
1950 utf8_.c:utf8.h \
1951 util_.c:util.h \
1952 verify_.c:verify.h \
1953 vfile_.c:vfile.h \
1954 webmail_.c:webmail.h \
1955 wiki_.c:wiki.h \
1956 wikiformat_.c:wikiformat.h \
1957 winfile_.c:winfile.h \
1958 winhttp_.c:winhttp.h \
1959 wysiwyg_.c:wysiwyg.h \
1960

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button