10 #define APIKEY "G9ANE2zvCozKEoLQ5qaR1AUtcE5YpuDj"
11 #define HOST "api.smugmug.com"
12 #define UPLOAD_HOST "upload.smugmug.com"
13 #define API_VERSION "1.2.1"
14 #define PATH "/services/api/json/" API_VERSION "/"
15 #define USER_AGENT "smugfs (part of Plan 9 from User Space)"
18 void* erealloc(void*, int);
20 int urlencodefmt(Fmt*);
22 int writen(int, void*, int);
27 typedef struct Cache Cache;
28 typedef struct CEntry CEntry;
42 Cache *newcache(int sizeofentry, int maxentry, void (*cefree)(CEntry*));
43 CEntry *cachelookup(Cache*, char*, int);
44 void cacheflush(Cache*, char*);
48 typedef struct Json Json;
75 Json* jlookup(Json*, char*);
76 double jnumber(Json*);
78 int jstrcmp(Json*, char*);
80 Json* jwalk(Json*, char*);
81 Json* parsejson(char*);
84 // Wrapper to hide whether we're using OpenSSL for HTTPS.
86 typedef struct Protocol Protocol;
87 typedef struct Pfd Pfd;
90 Pfd *(*connect)(char *host);
91 int (*read)(Pfd*, void*, int);
92 int (*write)(Pfd*, void*, int);
102 typedef struct HTTPHeader HTTPHeader;
109 char contenttype[100];
112 char *httpreq(Protocol *proto, char *host, char *request, HTTPHeader *hdr, int rfd, vlong rlength);
113 int httptofile(Protocol *proto, char *host, char *req, HTTPHeader *hdr, int wfd);
116 // URL downloader - caches in files on disk
118 int download(char *url, HTTPHeader *hdr);
119 void downloadflush(char*);
128 Json* jsonrpc(Protocol *proto, char *host, char *path, char *method, char *name1, va_list arg, int usecache);
129 Json* jsonupload(Protocol *proto, char *host, char *req, int rfd, vlong rlength);
130 void jcacheflush(char*);
132 extern int chattyhttp;
138 #define check_nil __attribute__((sentinel))
143 Json* smug(char *method, char *name1, ...) check_nil; // cached, http
144 Json* ncsmug(char *method, char *name1, ...) check_nil; // not cached, https
147 // Session information
149 extern Json *userinfo;
157 extern int nickindex(char*);
161 typedef struct Logbuf Logbuf;
171 extern void lbkick(Logbuf*);
172 extern void lbappend(Logbuf*, char*, ...);
173 extern void lbvappend(Logbuf*, char*, va_list);
174 /* #pragma varargck argpos lbappend 2 */
175 extern void lbread(Logbuf*, Req*);
176 extern void lbflush(Logbuf*, Req*);
177 /* #pragma varargck argpos flog 1 */
179 extern void rpclog(char*, ...);
180 extern void rpclogflush(Req*);
181 extern void rpclogread(Req*);
182 extern void rpclogwrite(Req*);
189 extern int printerrors;