fd = -1;
for(i=0; i<50; i++){
- if((fd = create(jar->lockfile, OWRITE, DMEXCL|0666)) < 0){
+ if((fd = create(jar->lockfile, OWRITE, DMEXCL|0600)) < 0){
sleep(100);
continue;
}
purgejar(jar);
if(dowrite){
- b = Bopen(jar->file, OTRUNC|OWRITE);
- if(b == nil){
+ i = create(jar->file, OWRITE, 0600);
+ if(i < 0 || (b = Bfdopen(i, OWRITE)) == nil){
if(debug)
fprint(2, "Bopen write %s: %r", jar->file);
+ if(i >= 0)
+ close(i);
close(fd);
return -1;
}
return 0;
}
+void
+closejar(Jar *jar)
+{
+ int i;
+
+ if(jar == nil)
+ return;
+ expirejar(jar, 0);
+ if(jar->dirty)
+ if(syncjar(jar) < 0)
+ fprint(2, "warning: cannot rewrite cookie jar: %r\n");
+
+ for(i=0; i<jar->nc; i++)
+ freecookie(&jar->c[i]);
+
+ free(jar->lockfile);
+ free(jar->file);
+ free(jar->c);
+ free(jar);
+}
+
Jar*
readjar(char *file)
{
Jar *jar;
jar = newjar();
+ file = estrdup9p(file);
lock = emalloc9p(strlen(file)+10);
strcpy(lock, file);
if((p = strrchr(lock, '/')) != nil)
jar->dirty = 0;
if(syncjar(jar) < 0){
- free(jar->file);
- free(jar->lockfile);
- free(jar);
+ closejar(jar);
return nil;
}
return jar;
}
-void
-closejar(Jar *jar)
-{
- int i;
-
- if(jar == nil)
- return;
- expirejar(jar, 0);
- if(jar->dirty)
- if(syncjar(jar) < 0)
- fprint(2, "warning: cannot rewrite cookie jar: %r\n");
-
- for(i=0; i<jar->nc; i++)
- freecookie(&jar->c[i]);
-
- free(jar->file);
- free(jar->c);
- free(jar);
-}
/*
* Domain name matching is per RFC2109, section 2:
}
/*
+ * Parse a date in one of these formats:
* Sunday, 25-Jan-2002 12:24:36 GMT
* Sunday, 25 Jan 2002 12:24:36 GMT
* Sun, 25 Jan 02 12:24:36 GMT
*/
-int
-isleap(int year)
-{
- return year%4==0 && (year%100!=0 || year%400==0);
-}
-
uint
strtotime(char *s)
{
- char *os;
- int i;
- Tm tm;
-
- static int mday[2][12] = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
- 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
+ char **f, *fmts[] = {
+ "?WW, ?DD-?MM-?YYYY hh:mm:ss ?Z",
+ "?WW, ?DD ?MM ?YYYY hh:mm:ss ?Z",
+ nil,
};
- static char *wday[] = {
- "Sunday", "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday",
- };
- static char *mon[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
- };
-
- os = s;
- /* Sunday, */
- for(i=0; i<nelem(wday); i++){
- if(cistrncmp(s, wday[i], strlen(wday[i])) == 0){
- s += strlen(wday[i]);
- break;
- }
- if(cistrncmp(s, wday[i], 3) == 0){
- s += 3;
- break;
- }
- }
- if(i==nelem(wday)){
- if(debug)
- fprint(2, "bad wday (%s)\n", os);
- return -1;
- }
- if(*s++ != ',' || *s++ != ' '){
- if(debug)
- fprint(2, "bad wday separator (%s)\n", os);
- return -1;
- }
-
- /* 25- */
- if(!isdigit(s[0]) || !isdigit(s[1]) || (s[2]!='-' && s[2]!=' ')){
- if(debug)
- fprint(2, "bad day of month (%s)\n", os);
- return -1;
- }
- tm.mday = strtol(s, 0, 10);
- s += 3;
-
- /* Jan- */
- for(i=0; i<nelem(mon); i++)
- if(cistrncmp(s, mon[i], 3) == 0){
- tm.mon = i;
- s += 3;
- break;
- }
- if(i==nelem(mon)){
- if(debug)
- fprint(2, "bad month (%s)\n", os);
- return -1;
- }
- if(s[0] != '-' && s[0] != ' '){
- if(debug)
- fprint(2, "bad month separator (%s)\n", os);
- return -1;
- }
- s++;
-
- /* 2002 */
- if(!isdigit(s[0]) || !isdigit(s[1])){
- if(debug)
- fprint(2, "bad year (%s)\n", os);
- return -1;
- }
- tm.year = strtol(s, 0, 10);
- s += 2;
- if(isdigit(s[0]) && isdigit(s[1]))
- s += 2;
- else{
- if(tm.year <= 68)
- tm.year += 2000;
- else
- tm.year += 1900;
- }
- if(tm.mday==0 || tm.mday > mday[isleap(tm.year)][tm.mon]){
- if(debug)
- fprint(2, "invalid day of month (%s)\n", os);
- return -1;
- }
- tm.year -= 1900;
- if(*s++ != ' '){
- if(debug)
- fprint(2, "bad year separator (%s)\n", os);
- return -1;
- }
-
- if(!isdigit(s[0]) || !isdigit(s[1]) || s[2]!=':'
- || !isdigit(s[3]) || !isdigit(s[4]) || s[5]!=':'
- || !isdigit(s[6]) || !isdigit(s[7]) || s[8]!=' '){
- if(debug)
- fprint(2, "bad time (%s)\n", os);
- return -1;
- }
-
- tm.hour = atoi(s);
- tm.min = atoi(s+3);
- tm.sec = atoi(s+6);
- if(tm.hour >= 24 || tm.min >= 60 || tm.sec >= 60){
- if(debug)
- fprint(2, "invalid time (%s)\n", os);
- return -1;
- }
- s += 9;
+ Tm tm;
- if(cistrcmp(s, "GMT") != 0){
- if(debug)
- fprint(2, "time zone not GMT (%s)\n", os);
- return -1;
- }
- strcpy(tm.zone, "GMT");
- tm.yday = 0;
- return tm2sec(&tm);
+ for(f = fmts; *f != nil; f++)
+ if(tmparse(&tm, *f, s, nil, nil) != nil)
+ return tmnorm(&tm);
+ return -1;
}
/*
}
}
snprint(a->outhttp, AuxBuf, "%J", j);
- if(j)
- closejar(j);
+ closejar(j);
}else{
if(strlen(a->inhttp)+r->ifcall.count >= AuxBuf){
respond(r, "http headers too large");
main(int argc, char **argv)
{
char *file, *mtpt, *home, *srv;
- int fd;
file = nil;
srv = nil;
strcpy(file, home);
strcat(file, "/lib/webcookies");
}
- if(access(file, AEXIST) < 0){
- if((fd = create(file, OWRITE, 0600)) < 0)
- sysfatal("create %s: %r", file);
- close(fd);
- }
-
+
jar = readjar(file);
if(jar == nil)
sysfatal("readjar: %r");