334
343
void peDestroyStream(struct pine *);
335
344
void pePrepareForAuthException(void);
336
345
char *peAuthException(void);
346
void peInitVars(struct pine *);
337
347
int peSelect(Tcl_Interp *, int, Tcl_Obj **, int);
338
348
int peSelectNumber(Tcl_Interp *, int, Tcl_Obj **, int);
339
349
int peSelectDate(Tcl_Interp *, int, Tcl_Obj **, int);
387
397
int peNullWritec(int);
388
398
void peGetMimeTyping(BODY *, Tcl_Obj **, Tcl_Obj **, Tcl_Obj **, Tcl_Obj **);
389
399
int peGetFlag(Tcl_Interp *, imapuid_t, int, Tcl_Obj **);
400
int peIsFlagged(MAILSTREAM *, imapuid_t, char *);
390
401
int peSetFlag(Tcl_Interp *, imapuid_t, int, Tcl_Obj **);
391
402
int peMsgSelect(Tcl_Interp *, imapuid_t, int, Tcl_Obj **);
392
403
int peReplyHeaders(Tcl_Interp *, imapuid_t, int, Tcl_Obj **);
414
425
long peSequenceNumber(imapuid_t);
415
426
int peMsgCollector(Tcl_Interp *, int, Tcl_Obj **,
416
427
int (*)(METAENV *, BODY *, char *, CONTEXT_S **, char *), long);
417
int peMsgCollected(Tcl_Interp *, MSG_COL_S *, char *);
428
int peMsgCollected(Tcl_Interp *, MSG_COL_S *, char *, long);
418
429
void peMsgSetParm(PARAMETER **, char *, char *);
419
430
Tcl_Obj *peMsgAttachCollector(Tcl_Interp *, BODY *);
420
431
int peFccAppend(Tcl_Interp *, Tcl_Obj *, char *, int);
462
473
long peAppendMsg(MAILSTREAM *, void *, char **, char **, STRING **);
463
474
int remote_pinerc_failure(void);
464
475
char *peWebAlpinePrefix(void);
476
void peNewMailAnnounce(MAILSTREAM *, long, long);
465
477
int peMessageNeedPassphrase(Tcl_Interp *, imapuid_t, int, Tcl_Obj **);
466
478
int peRssReturnFeed(Tcl_Interp *, char *, char *);
467
479
int peRssPackageFeed(Tcl_Interp *, RSS_FEED_S *);
1838
1847
return(TCL_OK);
1840
else if(!strcmp(s1, "expungecheck")) {
1842
* Return open folders and how many deleted messages they have
1844
* return looks something like a list of these:
1845
* {folder-name number-deleted isinbox isincoming}
1851
type = Tcl_GetStringFromObj(objv[2], NULL);
1852
if(!type) return(TCL_ERROR);
1853
if(strcmp(type, "current") != 0 && strcmp(type, "quit") != 0)
1855
if(ps_global->mail_stream != sp_inbox_stream()
1856
|| strcmp(type, "current") == 0){
1857
delete_count = count_flagged(ps_global->mail_stream, F_DEL);
1858
resObj = Tcl_NewListObj(0, NULL);
1859
Tcl_ListObjAppendElement(interp, resObj,
1860
Tcl_NewStringObj(pretty_fn(ps_global->cur_folder), -1));
1861
Tcl_ListObjAppendElement(interp, resObj,
1862
Tcl_NewIntObj(delete_count));
1863
Tcl_ListObjAppendElement(interp, resObj,
1864
Tcl_NewIntObj((ps_global->mail_stream
1865
== sp_inbox_stream())
1867
Tcl_ListObjAppendElement(interp, resObj,
1868
Tcl_NewIntObj((ps_global->context_current->use & CNTXT_INCMNG)
1870
Tcl_ListObjAppendElement(interp, Tcl_GetObjResult(interp),
1873
if(strcmp(type, "quit") == 0){
1874
delete_count = count_flagged(sp_inbox_stream(), F_DEL);
1875
resObj = Tcl_NewListObj(0, NULL);
1876
Tcl_ListObjAppendElement(interp, resObj,
1877
Tcl_NewStringObj("INBOX", -1));
1878
Tcl_ListObjAppendElement(interp, resObj,
1879
Tcl_NewIntObj(delete_count));
1880
Tcl_ListObjAppendElement(interp, resObj,
1882
Tcl_ListObjAppendElement(interp, resObj,
1884
Tcl_ListObjAppendElement(interp,
1885
Tcl_GetObjResult(interp), resObj);
1889
1849
else if(!strcmp(s1, "rawsig")){
1891
1851
if(ps_global->VAR_LITERAL_SIG){
4436
4396
err = "S/MIME not configured for this server";
4437
4397
#endif /* SMIME */
4399
else if(!strcmp(op, "expungecheck")) {
4401
* Return open folders and how many deleted messages they have
4403
* return looks something like a list of these:
4404
* {folder-name number-deleted isinbox isincoming}
4411
err = "PESession: expungecheck <type>";
4414
type = Tcl_GetStringFromObj(objv[2], NULL);
4415
if(type && (strcmp(type, "current") == 0 || strcmp(type, "quit") == 0)){
4417
if(ps_global->mail_stream != sp_inbox_stream()
4418
|| strcmp(type, "current") == 0){
4419
delete_count = count_flagged(ps_global->mail_stream, F_DEL);
4420
resObj = Tcl_NewListObj(0, NULL);
4421
Tcl_ListObjAppendElement(interp, resObj,
4422
Tcl_NewStringObj(pretty_fn(ps_global->cur_folder), -1));
4423
Tcl_ListObjAppendElement(interp, resObj,
4424
Tcl_NewIntObj(delete_count));
4425
Tcl_ListObjAppendElement(interp, resObj,
4426
Tcl_NewIntObj((ps_global->mail_stream
4427
== sp_inbox_stream())
4429
Tcl_ListObjAppendElement(interp, resObj,
4430
Tcl_NewIntObj((ps_global->context_current->use & CNTXT_INCMNG)
4432
Tcl_ListObjAppendElement(interp, Tcl_GetObjResult(interp),
4435
if(strcmp(type, "quit") == 0){
4436
delete_count = count_flagged(sp_inbox_stream(), F_DEL);
4437
resObj = Tcl_NewListObj(0, NULL);
4438
Tcl_ListObjAppendElement(interp, resObj,
4439
Tcl_NewStringObj("INBOX", -1));
4440
Tcl_ListObjAppendElement(interp, resObj,
4441
Tcl_NewIntObj(delete_count));
4442
Tcl_ListObjAppendElement(interp, resObj,
4444
Tcl_ListObjAppendElement(interp, resObj,
4446
Tcl_ListObjAppendElement(interp,
4447
Tcl_GetObjResult(interp), resObj);
4452
err = "PESession: expungecheck unknown type";
4455
else if(!strcmp(op, "mailcheck")) {
4459
* ARGS: reload -- "1" if we're reloading
4460
* (vs. just checking newmail as a side effect
4461
* of building a new page)
4463
* Return list of folders with new or expunged messages
4465
* return looks something like a list of these:
4466
* {new-count newest-uid announcement-msg}
4468
int reload, force = UFU_NONE, rv;
4469
time_t now = time(0);
4472
if(objc < 3 || Tcl_GetIntFromObj(interp, objv[2], &reload) == TCL_ERROR)
4475
/* minimum 10 second between IMAP pings */
4476
if(!time_of_last_input() || now - time_of_last_input() > 10){
4482
peED.interp = interp;
4484
/* check for new mail */
4485
new_mail(force, reload ? GoodTime : VeryBadTime, NM_STATUS_MSG);
4487
if(!reload){ /* announced */
4488
zero_new_mail_count();
4494
err = "PESession: mailcheck <reload>";
4441
4498
Tcl_SetResult(interp, err, TCL_STATIC);
5492
5551
Tcl_WrongNumArgs(interp, 1, objv, "cmd ?args?");
5494
5553
else if((op = Tcl_GetStringFromObj(objv[1], NULL)) != NULL){
5495
if(ps_global && ps_global->mail_stream){
5554
if(!strucmp(op, "open")){
5559
peED.uid = 0; /* forget cached embedded data */
5562
* CMD: open <context-index> <folder>
5567
Tcl_SetResult(interp, (!sp_dead_stream(ps_global->mail_stream)) ? "0" : "1", TCL_VOLATILE);
5571
if(Tcl_GetIntFromObj(interp,objv[2],&colid) != TCL_ERROR){
5572
if((folder = Tcl_GetStringFromObj(objv[objc - 1], NULL)) != NULL) {
5573
for(i = 0, cp = ps_global->context_list; cp ; i++, cp = cp->next)
5575
if(PEMakeFolderString(interp, cp, objc - 3, objv + 3,
5579
dprint((1, "* PEMailbox open dir=%s folder=%s",cp->dir->ref,folder));
5581
return(peCreateStream(interp, cp, folder, FALSE));
5584
err = "open: Unrecognized collection ID";
5587
err = "open: Can't read folder";
5590
err = "open: Can't get collection ID";
5592
else if(!strcmp(op, "indexformat")){
5596
* Returns: list of lists where:
5597
* * the first element is the name of the
5598
* field which may be "From", "Subject"
5599
* "Date" or the emtpy string.
5600
* * the second element which is either
5601
* the percentage width or empty string
5604
return(peIndexFormat(interp));
5606
else if(ps_global && ps_global->mail_stream){
5496
5607
if(!strcmp(op, "select")){
5497
5608
return(peSelect(interp, objc - 2, &((Tcl_Obj **) objv)[2], MN_SLCT));
5502
5613
else if(!strucmp(op, "apply")){
5503
5614
return(peApply(interp, objc - 2, &((Tcl_Obj **) objv)[2]));
5505
else if(!strucmp(op, "open")){
5510
peED.uid = 0; /* forget cached embedded data */
5513
* CMD: open <context-index> <folder>
5518
Tcl_SetResult(interp, (!sp_dead_stream(ps_global->mail_stream)) ? "0" : "1", TCL_VOLATILE);
5522
if(Tcl_GetIntFromObj(interp,objv[2],&colid) != TCL_ERROR){
5523
if((folder = Tcl_GetStringFromObj(objv[objc - 1], NULL)) != NULL) {
5524
for(i = 0, cp = ps_global->context_list; cp ; i++, cp = cp->next)
5526
if(PEMakeFolderString(interp, cp, objc - 3, objv + 3,
5530
dprint((1, "* PEMailbox open dir=%s folder=%s",cp->dir->ref,folder));
5532
return(peCreateStream(interp, cp, folder, FALSE));
5535
err = "open: Unrecognized collection ID";
5538
err = "open: Can't read folder";
5541
err = "open: Can't get collection ID";
5543
5616
else if(!strcmp(op, "expunge")){
5717
5790
if(!strcmp(s, "statusbits")){
5718
5791
char *s = peMsgStatBitString(ps_global, ps_global->mail_stream,
5719
5792
sp_msgmap(ps_global->mail_stream), peMessageNumber(uid),
5720
peITop, peICount, &fetched);
5793
gPeITop, gPeICount, &fetched);
5721
5794
Tcl_ListObjAppendElement(interp, avObj, Tcl_NewStringObj(s, -1));
5723
5796
else if(!strcmp(s, "statuslist")){
5724
5797
Tcl_Obj *nObj = peMsgStatNameList(interp, ps_global, ps_global->mail_stream,
5725
5798
sp_msgmap(ps_global->mail_stream), peMessageNumber(uid),
5726
peITop, peICount, &fetched);
5799
gPeITop, gPeICount, &fetched);
5727
5800
Tcl_ListObjAppendElement(interp, avObj, nObj);
5729
5802
else if(!strcmp(s, "status")){
5876
5949
Tcl_SetResult(interp, ps_global->cur_folder, TCL_VOLATILE);
5877
5950
return(TCL_OK);
5879
else if(!strcmp(op, "indexformat")){
5883
* Returns: list of lists where:
5884
* * the first element is the name of the
5885
* field which may be "From", "Subject"
5886
* "Date" or the emtpy string.
5887
* * the second element which is either
5888
* the percentage width or empty string
5890
return(peIndexFormat(interp));
5892
5952
else if(!strcmp(op, "close")){
7105
7165
else if(objc == 2){
7166
if(!strucmp(subcmd, "count")){
7171
long n, rawno, count = 0;
7173
if((flagname = Tcl_GetStringFromObj(objv[1], NULL)) != NULL){
7174
for(n = 1L; n <= mn_get_total(sp_msgmap(ps_global->mail_stream)); n++){
7175
rawno = mn_m2raw(sp_msgmap(ps_global->mail_stream), n);
7176
if(get_lflag(ps_global->mail_stream, NULL, rawno, MN_SLCT)
7177
&& peIsFlagged(ps_global->mail_stream,
7178
mail_uid(ps_global->mail_stream, rawno),
7185
Tcl_SetResult(interp, long2string(count), TCL_VOLATILE);
7107
7189
else if(objc == 3){
7108
7190
if(!strucmp(subcmd, "flag")){
9071
9152
peGetFlag(Tcl_Interp *interp, imapuid_t uid, int objc, Tcl_Obj **objv)
9156
Tcl_SetResult(interp,
9157
int2string(((flagname = Tcl_GetStringFromObj(objv[0], NULL)) != NULL)
9158
? peIsFlagged(ps_global->mail_stream, uid, flagname)
9166
peIsFlagged(MAILSTREAM *stream, imapuid_t uid, char *flagname)
9076
9168
MESSAGECACHE *mc;
9078
if((flagname = Tcl_GetStringFromObj(objv[0], NULL)) != NULL){
9079
raw = peSequenceNumber(uid);
9081
if(!((mc = mail_elt(ps_global->mail_stream, raw))
9083
mail_fetch_flags(ps_global->mail_stream,
9084
ulong2string(uid), FT_UID);
9085
mc = mail_elt(ps_global->mail_stream, raw);
9088
if(!strucmp(flagname, "deleted")){
9089
value = mc->deleted;
9091
else if(!strucmp(flagname, "new")){
9094
else if(!strucmp(flagname, "important")){
9095
value = mc->flagged;
9097
else if(!strucmp(flagname, "answered")){
9098
value = mc->answered;
9100
else if(!strucmp(flagname, "recent")){
9169
long raw = peSequenceNumber(uid);
9171
if(!((mc = mail_elt(stream, raw)) && mc->valid)){
9172
mail_fetch_flags(stream, ulong2string(uid), FT_UID);
9173
mc = mail_elt(stream, raw);
9105
Tcl_SetResult(interp, int2string(value), TCL_VOLATILE);
9176
if(!strucmp(flagname, "deleted"))
9177
return(mc->deleted);
9179
if(!strucmp(flagname, "new"))
9182
if(!strucmp(flagname, "important"))
9183
return(mc->flagged);
9185
if(!strucmp(flagname, "answered"))
9186
return(mc->answered);
9188
if(!strucmp(flagname, "recent"))
9112
9196
* peSetFlag - Set requested flags value to 1 or 0
9219
9303
if((h = build_header_work(ps_global, ps_global->mail_stream,
9220
9304
sp_msgmap(ps_global->mail_stream), peMessageNumber(uid),
9221
peITop, peICount, fetched)) != NULL){
9305
gPeITop, gPeICount, fetched)) != NULL){
9222
9306
for(f = h->ifield; f; f = f->next){
9224
9308
if((objField = Tcl_NewListObj(0, NULL)) == NULL)
11041
peInitVars(struct pine *ps)
11043
init_vars(ps, NULL);
11046
* fix display/keyboard-character-set to utf-8
11051
if(ps->display_charmap)
11052
fs_give((void **) &ps->display_charmap);
11054
ps->display_charmap = cpystr(WP_INTERNAL_CHARSET);
11056
if(ps->keyboard_charmap)
11057
fs_give((void **) &ps->keyboard_charmap);
11059
ps->keyboard_charmap = cpystr(WP_INTERNAL_CHARSET);
11061
(void) setup_for_input_output(FALSE, &ps->display_charmap, &ps->keyboard_charmap, &ps->input_cs, NULL);;
10956
11067
peMessageBounce(Tcl_Interp *interp, imapuid_t uid, int objc, Tcl_Obj **objv)
12126
12245
for(i = 0; i < nMsg; i++){
12127
12246
if(Tcl_ListObjGetElements(interp, objMsg[i], &nField, &objField) != TCL_OK){
12128
12247
err = ""; /* interp's result object has error message */
12129
return(peMsgCollected(interp, &md, err));
12248
return(peMsgCollected(interp, &md, err, flags));
12132
12251
if(nField && (field = Tcl_GetStringFromObj(objField[0], NULL))){
12133
12252
if(!strcmp(field, "body")){
12134
12253
if(md.msgtext){
12135
12254
err = "Too many bodies";
12136
return(peMsgCollected(interp, &md, err));
12255
return(peMsgCollected(interp, &md, err, flags));
12138
12257
else if((md.msgtext = so_get(CharStar, NULL, EDIT_ACCESS)) != NULL){
12139
12258
/* mark storage object as user edited */
12150
12269
err = "Value read failure";
12151
return(peMsgCollected(interp, &md, err));
12270
return(peMsgCollected(interp, &md, err, flags));
12156
12275
err = "Can't acquire body storage";
12157
return(peMsgCollected(interp, &md, err));
12276
return(peMsgCollected(interp, &md, err, flags));
12160
12279
else if(!strucmp(field, "attach")){
12285
12404
err = "Post option read failure";
12286
return(peMsgCollected(interp, &md, err));
12405
return(peMsgCollected(interp, &md, err, flags));
12290
12409
sprintf(err = tmp_20k_buf, "Unknown Post Option: %s", value);
12291
return(peMsgCollected(interp, &md, err));
12410
return(peMsgCollected(interp, &md, err, flags));
12295
12414
sprintf(err = tmp_20k_buf, "Malformed Post Option");
12296
return(peMsgCollected(interp, &md, err));
12415
return(peMsgCollected(interp, &md, err, flags));
12300
12419
if(nField != 2){
12301
12420
sprintf(err = tmp_20k_buf, "Malformed header (%s)", field);
12302
return(peMsgCollected(interp, &md, err));
12421
return(peMsgCollected(interp, &md, err, flags));
12305
12424
if((value = Tcl_GetStringFromObj(objField[1], &vl)) != NULL){
12402
12521
* peMsgCollected - Dispatch collected message data and cleanup
12405
peMsgCollected(Tcl_Interp *interp, MSG_COL_S *md, char *err)
12524
peMsgCollected(Tcl_Interp *interp, MSG_COL_S *md, char *err, long flags)
12408
BODY *body = NULL, *tbp = NULL;
12409
char errbuf[WP_MAX_POST_ERROR + 1], *charset;
12526
int rv = TCL_OK, non_ascii = FALSE;
12528
BODY *body = NULL, *tbp = NULL;
12529
char errbuf[WP_MAX_POST_ERROR + 1], *charset;
12413
12533
if(md->msgtext)
12530
12657
/* assign MIME parameters to text body part */
12531
12658
tbp->type = TYPETEXT;
12533
tbp->subtype = cpystr("HTML");
12659
if(md->html) tbp->subtype = cpystr("HTML");
12535
12661
tbp->contents.text.data = (void *) md->msgtext;
12538
* set up text body part's charset
12539
* if it came from compose form as something other
12540
* than UTF-8, toss hands up into air, shrug shoulders.
12542
charset = (!md->charset || !strucmp(md->charset, "utf-8")) ? "UTF-8" : "X-UNKNOWN";
12543
peMsgSetParm(&tbp->parameter, "charset", charset);
12545
/* possibly up/downgrade charset, figure out c-t-e? */
12546
12662
tbp->encoding = ENCOTHER;
12547
set_mime_type_by_grope(tbp);
12548
set_charset_possibly_to_ascii(tbp, charset);
12550
12664
/* set any text flowed param */
12551
12665
if(md->flowed)
13286
13401
if(completions){
13287
13402
for(cp = completions; cp; cp = cp->next)
13288
peAppListF(interp, Tcl_GetObjResult(interp), "%s %s",
13403
peAppListF(interp, Tcl_GetObjResult(interp), "%s %s %s",
13289
13404
cp->nickname ? cp->nickname : "",
13290
cp->full_address ? cp->full_address : "");
13405
cp->full_address ? cp->full_address : "",
13406
cp->fcc ? cp->fcc : "");
13292
13408
free_complete_s(&completions);
15974
void peNewMailAnnounce(MAILSTREAM *stream, long n, long t_nm_count){
15975
char subject[MAILTMPLEN+1], subjtext[MAILTMPLEN+1], from[MAILTMPLEN+1],
15976
*folder = NULL, intro[MAILTMPLEN+1];
15978
ENVELOPE *e = NULL;
15981
if(n && (resObj = Tcl_NewListObj(0, NULL)) != NULL){
15983
Tcl_ListObjAppendElement(peED.interp, resObj, Tcl_NewLongObj(number = sp_mail_since_cmd(stream)));
15984
Tcl_ListObjAppendElement(peED.interp, resObj, Tcl_NewLongObj(mail_uid(stream, n)));
15987
e = pine_mail_fetchstructure(stream, n, NULL);
15989
if(sp_flagged(stream, SP_INBOX))
15992
folder = STREAMNAME(stream);
15993
if(folder[0] == '?' && folder[1] == '\0')
15998
format_new_mail_msg(folder, number, e, intro, from, subject, subjtext, sizeof(intro));
16000
snprintf(tmp_20k_buf, SIZEOF_20KBUF,
16001
"%s%s%s%.80s%.80s", intro,
16002
from ? ((number > 1L) ? " Most recent f" : " F") : "",
16003
from ? "rom " : "",
16007
Tcl_ListObjAppendElement(peED.interp, resObj, Tcl_NewStringObj(tmp_20k_buf,-1));
16009
Tcl_ListObjAppendElement(peED.interp, Tcl_GetObjResult(peED.interp), resObj);
15858
16014
/* * * * * * * * * RSS 2.0 Support Routines * * * * * * * * * * * */
16031
16194
query ? "?" : "", query ? query : "", loc,
16032
16195
ALPINE_VERSION, SYSTYPE, get_alpine_revision_string(rev, sizeof(rev)));
16197
mail_parameters(NULL, SET_WRITETIMEOUT, (void *)(long) 5);
16034
16198
mail_parameters(NULL, SET_READTIMEOUT, (void *)(long) 5);
16036
16200
if(tcp_sout(tcp_stream, tmp_20k_buf, strlen(tmp_20k_buf))){
16201
int ok = 0, chunked = FALSE;
16039
16203
while((p = tcp_getline(tcp_stream)) != NULL){
16042
16206
if(strucmp(p,"HTTP/1.1 200 OK")){
16043
16207
fs_give((void **) &p);
16047
else if(*p == '\0'){
16211
else if(*p == '\0'){ /* first blank line, start of body */
16212
if(buffer || feed_so){
16213
fs_give((void **) &p);
16048
16217
if(buffer_len){
16049
16218
buffer = fs_get(buffer_len + 16);
16050
16219
if(!tcp_getbuffer(tcp_stream, buffer_len, buffer))
16051
16220
fs_give((void **) &buffer);
16053
16222
fs_give((void **) &p);
16056
else{ /* no content-length: */
16057
if((feed_so = so_get(CharStar, NULL, EDIT_ACCESS)) == NULL){
16225
else if((feed_so = so_get(CharStar, NULL, EDIT_ACCESS)) == NULL){
16226
fs_give((void **) &p);
16230
else if(feed_so){ /* collect body */
16232
int chunk_len = 0, gotbuf;
16234
/* first line is chunk size in hex */
16235
for(q = p; *q && isxdigit((unsigned char) *q); q++)
16236
chunk_len = (chunk_len * 16) + XDIGIT2C(*q);
16238
if(chunk_len > 0){ /* collect chunk */
16239
char *tbuf = fs_get(chunk_len + 16);
16240
gotbuf = tcp_getbuffer(tcp_stream, chunk_len, tbuf);
16242
so_nputs(feed_so, tbuf, chunk_len);
16244
fs_give((void **) &tbuf);
16247
fs_give((void **) &p);
16252
/* collect trailing CRLF */
16253
gotbuf = ((q = tcp_getline(tcp_stream)) != NULL && *q == '\0');
16255
fs_give((void **) &q);
16257
if(chunk_len == 0 || !gotbuf){
16058
16258
fs_give((void **) &p);
16064
so_puts(feed_so, p);
16263
so_puts(feed_so, p);
16265
else{ /* in header, grok fields */
16067
16266
if(q = strchr(p,':')){
16068
16267
int l = q - p;
16074
16273
/* content-length */
16075
if(l == 14 && !strucmp(p,"content-length")){
16274
if(l == 4 && !strucmp(p, "date")){
16275
theirdate = date_to_local_time_t(q);
16277
else if(l == 7 && !strucmp(p, "expires")){
16278
time_t expires = date_to_local_time_t(q) - ((theirdate > 0) ? theirdate : time(0));
16280
if(expires > 0 && expires < (8 * 60 * 60))
16283
else if(l == 12 && !strucmp(p, "content-type")
16284
&& struncmp(q,"text/xml", 8)
16285
&& struncmp(q,"application/xhtml+xml", 21)
16286
&& struncmp(q,"application/rss+xml", 19)
16287
&& struncmp(q,"application/xml", 15)){
16288
fs_give((void **) &p);
16291
else if(l == 13 && !strucmp(p, "cache-control")){
16292
if(!struncmp(q,"max-age=",8)){
16295
for(q += 8; *q && isdigit((unsigned char) *q); q++)
16296
secs = ((secs * 10) + (*q - '0'));
16302
else if(l == 14 && !strucmp(p,"content-length")){
16076
16303
while(*q && isdigit((unsigned char) *q))
16077
16304
buffer_len = ((buffer_len * 10) + (*q++ - '0'));
16082
else if(l == 12 && !strucmp(p, "content-type")
16083
&& strucmp(q,"text/xml")
16084
&& strucmp(q,"application/xhtml+xml")
16085
&& strucmp(q,"application/xml")){
16088
/* SHOULD: if(l == 7 && !strucmp(p, "expires")) */
16307
fs_give((void **) &p);
16311
else if(l == 17 && !strucmp(p, "transfer-encoding")){
16312
if(!struncmp(q,"chunked", 7)){
16315
else{ /* unknown encoding */
16316
fs_give((void **) &p);