1 18824b58 2008-08-03 rsc #include <u.h>
2 18824b58 2008-08-03 rsc #include <errno.h>
3 18824b58 2008-08-03 rsc #include <libc.h>
4 18824b58 2008-08-03 rsc #include <fcall.h>
5 18824b58 2008-08-03 rsc #include <thread.h>
6 18824b58 2008-08-03 rsc #include <auth.h>
7 18824b58 2008-08-03 rsc #include <9p.h>
8 18824b58 2008-08-03 rsc #include <libsec.h>
10 18824b58 2008-08-03 rsc #define APIKEY "G9ANE2zvCozKEoLQ5qaR1AUtcE5YpuDj"
11 18824b58 2008-08-03 rsc #define HOST "api.smugmug.com"
12 18824b58 2008-08-03 rsc #define UPLOAD_HOST "upload.smugmug.com"
13 18824b58 2008-08-03 rsc #define API_VERSION "1.2.1"
14 18824b58 2008-08-03 rsc #define PATH "/services/api/json/" API_VERSION "/"
15 18824b58 2008-08-03 rsc #define USER_AGENT "smugfs (part of Plan 9 from User Space)"
17 18824b58 2008-08-03 rsc void* emalloc(int);
18 18824b58 2008-08-03 rsc void* erealloc(void*, int);
19 18824b58 2008-08-03 rsc char* estrdup(char*);
20 18824b58 2008-08-03 rsc int urlencodefmt(Fmt*);
21 18824b58 2008-08-03 rsc int timefmt(Fmt*);
22 18824b58 2008-08-03 rsc int writen(int, void*, int);
25 18824b58 2008-08-03 rsc // Generic cache
27 18824b58 2008-08-03 rsc typedef struct Cache Cache;
28 18824b58 2008-08-03 rsc typedef struct CEntry CEntry;
30 18824b58 2008-08-03 rsc struct CEntry
34 18824b58 2008-08-03 rsc CEntry *next;
35 18824b58 2008-08-03 rsc CEntry *prev;
38 18824b58 2008-08-03 rsc CEntry *next;
42 18824b58 2008-08-03 rsc Cache *newcache(int sizeofentry, int maxentry, void (*cefree)(CEntry*));
43 18824b58 2008-08-03 rsc CEntry *cachelookup(Cache*, char*, int);
44 18824b58 2008-08-03 rsc void cacheflush(Cache*, char*);
46 18824b58 2008-08-03 rsc // JSON parser
48 18824b58 2008-08-03 rsc typedef struct Json Json;
65 18824b58 2008-08-03 rsc char *string;
66 18824b58 2008-08-03 rsc double number;
68 18824b58 2008-08-03 rsc Json **value;
72 18824b58 2008-08-03 rsc void jclose(Json*);
73 18824b58 2008-08-03 rsc Json* jincref(Json*);
74 18824b58 2008-08-03 rsc vlong jint(Json*);
75 18824b58 2008-08-03 rsc Json* jlookup(Json*, char*);
76 18824b58 2008-08-03 rsc double jnumber(Json*);
77 18824b58 2008-08-03 rsc int jsonfmt(Fmt*);
78 18824b58 2008-08-03 rsc int jstrcmp(Json*, char*);
79 18824b58 2008-08-03 rsc char* jstring(Json*);
80 18824b58 2008-08-03 rsc Json* jwalk(Json*, char*);
81 18824b58 2008-08-03 rsc Json* parsejson(char*);
84 18824b58 2008-08-03 rsc // Wrapper to hide whether we're using OpenSSL for HTTPS.
86 18824b58 2008-08-03 rsc typedef struct Protocol Protocol;
87 18824b58 2008-08-03 rsc typedef struct Pfd Pfd;
88 18824b58 2008-08-03 rsc struct Protocol
90 18824b58 2008-08-03 rsc Pfd *(*connect)(char *host);
91 18824b58 2008-08-03 rsc int (*read)(Pfd*, void*, int);
92 18824b58 2008-08-03 rsc int (*write)(Pfd*, void*, int);
93 18824b58 2008-08-03 rsc void (*close)(Pfd*);
96 18824b58 2008-08-03 rsc Protocol http;
97 18824b58 2008-08-03 rsc Protocol https;
100 18824b58 2008-08-03 rsc // HTTP library
102 18824b58 2008-08-03 rsc typedef struct HTTPHeader HTTPHeader;
103 18824b58 2008-08-03 rsc struct HTTPHeader
106 18824b58 2008-08-03 rsc char proto[100];
107 18824b58 2008-08-03 rsc char codedesc[100];
108 18824b58 2008-08-03 rsc vlong contentlength;
109 18824b58 2008-08-03 rsc char contenttype[100];
112 18824b58 2008-08-03 rsc char *httpreq(Protocol *proto, char *host, char *request, HTTPHeader *hdr, int rfd, vlong rlength);
113 18824b58 2008-08-03 rsc int httptofile(Protocol *proto, char *host, char *req, HTTPHeader *hdr, int wfd);
116 18824b58 2008-08-03 rsc // URL downloader - caches in files on disk
118 18824b58 2008-08-03 rsc int download(char *url, HTTPHeader *hdr);
119 18824b58 2008-08-03 rsc void downloadflush(char*);
125 18824b58 2008-08-03 rsc MaxResponse = 1<<29,
128 18824b58 2008-08-03 rsc Json* jsonrpc(Protocol *proto, char *host, char *path, char *method, char *name1, va_list arg, int usecache);
129 18824b58 2008-08-03 rsc Json* jsonupload(Protocol *proto, char *host, char *req, int rfd, vlong rlength);
130 18824b58 2008-08-03 rsc void jcacheflush(char*);
132 18824b58 2008-08-03 rsc extern int chattyhttp;
135 18824b58 2008-08-03 rsc // SmugMug RPC
137 18824b58 2008-08-03 rsc #ifdef __GNUC__
138 18824b58 2008-08-03 rsc #define check_nil __attribute__((sentinel))
140 18824b58 2008-08-03 rsc #define check_nil
143 18824b58 2008-08-03 rsc Json* smug(char *method, char *name1, ...) check_nil; // cached, http
144 18824b58 2008-08-03 rsc Json* ncsmug(char *method, char *name1, ...) check_nil; // not cached, https
147 18824b58 2008-08-03 rsc // Session information
149 18824b58 2008-08-03 rsc extern Json *userinfo;
150 18824b58 2008-08-03 rsc extern char *sessid;
153 18824b58 2008-08-03 rsc // File system
155 18824b58 2008-08-03 rsc extern Srv xsrv;
156 18824b58 2008-08-03 rsc void xinit(void);
157 18824b58 2008-08-03 rsc extern int nickindex(char*);
161 18824b58 2008-08-03 rsc typedef struct Logbuf Logbuf;
162 18824b58 2008-08-03 rsc struct Logbuf
165 18824b58 2008-08-03 rsc Req **waitlast;
168 18824b58 2008-08-03 rsc char *msg[128];
171 18824b58 2008-08-03 rsc extern void lbkick(Logbuf*);
172 18824b58 2008-08-03 rsc extern void lbappend(Logbuf*, char*, ...);
173 18824b58 2008-08-03 rsc extern void lbvappend(Logbuf*, char*, va_list);
174 18824b58 2008-08-03 rsc /* #pragma varargck argpos lbappend 2 */
175 18824b58 2008-08-03 rsc extern void lbread(Logbuf*, Req*);
176 18824b58 2008-08-03 rsc extern void lbflush(Logbuf*, Req*);
177 18824b58 2008-08-03 rsc /* #pragma varargck argpos flog 1 */
179 18824b58 2008-08-03 rsc extern void rpclog(char*, ...);
180 18824b58 2008-08-03 rsc extern void rpclogflush(Req*);
181 18824b58 2008-08-03 rsc extern void rpclogread(Req*);
182 18824b58 2008-08-03 rsc extern void rpclogwrite(Req*);
186 18824b58 2008-08-03 rsc STACKSIZE = 32768
189 18824b58 2008-08-03 rsc extern int printerrors;