Blame


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>
9 18824b58 2008-08-03 rsc
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)"
16 18824b58 2008-08-03 rsc
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);
23 18824b58 2008-08-03 rsc
24 18824b58 2008-08-03 rsc
25 18824b58 2008-08-03 rsc // Generic cache
26 18824b58 2008-08-03 rsc
27 18824b58 2008-08-03 rsc typedef struct Cache Cache;
28 18824b58 2008-08-03 rsc typedef struct CEntry CEntry;
29 18824b58 2008-08-03 rsc
30 18824b58 2008-08-03 rsc struct CEntry
31 18824b58 2008-08-03 rsc {
32 18824b58 2008-08-03 rsc char *name;
33 18824b58 2008-08-03 rsc struct {
34 18824b58 2008-08-03 rsc CEntry *next;
35 18824b58 2008-08-03 rsc CEntry *prev;
36 18824b58 2008-08-03 rsc } list;
37 18824b58 2008-08-03 rsc struct {
38 18824b58 2008-08-03 rsc CEntry *next;
39 18824b58 2008-08-03 rsc } hash;
40 18824b58 2008-08-03 rsc };
41 18824b58 2008-08-03 rsc
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*);
45 18824b58 2008-08-03 rsc
46 18824b58 2008-08-03 rsc // JSON parser
47 18824b58 2008-08-03 rsc
48 18824b58 2008-08-03 rsc typedef struct Json Json;
49 18824b58 2008-08-03 rsc
50 18824b58 2008-08-03 rsc enum
51 18824b58 2008-08-03 rsc {
52 18824b58 2008-08-03 rsc Jstring,
53 18824b58 2008-08-03 rsc Jnumber,
54 18824b58 2008-08-03 rsc Jobject,
55 18824b58 2008-08-03 rsc Jarray,
56 18824b58 2008-08-03 rsc Jtrue,
57 18824b58 2008-08-03 rsc Jfalse,
58 18824b58 2008-08-03 rsc Jnull
59 18824b58 2008-08-03 rsc };
60 18824b58 2008-08-03 rsc
61 18824b58 2008-08-03 rsc struct Json
62 18824b58 2008-08-03 rsc {
63 18824b58 2008-08-03 rsc int ref;
64 18824b58 2008-08-03 rsc int type;
65 18824b58 2008-08-03 rsc char *string;
66 18824b58 2008-08-03 rsc double number;
67 18824b58 2008-08-03 rsc char **name;
68 18824b58 2008-08-03 rsc Json **value;
69 18824b58 2008-08-03 rsc int len;
70 18824b58 2008-08-03 rsc };
71 18824b58 2008-08-03 rsc
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*);
82 18824b58 2008-08-03 rsc
83 18824b58 2008-08-03 rsc
84 18824b58 2008-08-03 rsc // Wrapper to hide whether we're using OpenSSL for HTTPS.
85 18824b58 2008-08-03 rsc
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
89 18824b58 2008-08-03 rsc {
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*);
94 18824b58 2008-08-03 rsc };
95 18824b58 2008-08-03 rsc
96 18824b58 2008-08-03 rsc Protocol http;
97 18824b58 2008-08-03 rsc Protocol https;
98 18824b58 2008-08-03 rsc
99 18824b58 2008-08-03 rsc
100 18824b58 2008-08-03 rsc // HTTP library
101 18824b58 2008-08-03 rsc
102 18824b58 2008-08-03 rsc typedef struct HTTPHeader HTTPHeader;
103 18824b58 2008-08-03 rsc struct HTTPHeader
104 18824b58 2008-08-03 rsc {
105 18824b58 2008-08-03 rsc int code;
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];
110 18824b58 2008-08-03 rsc };
111 18824b58 2008-08-03 rsc
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);
114 18824b58 2008-08-03 rsc
115 18824b58 2008-08-03 rsc
116 18824b58 2008-08-03 rsc // URL downloader - caches in files on disk
117 18824b58 2008-08-03 rsc
118 18824b58 2008-08-03 rsc int download(char *url, HTTPHeader *hdr);
119 18824b58 2008-08-03 rsc void downloadflush(char*);
120 18824b58 2008-08-03 rsc
121 18824b58 2008-08-03 rsc // JSON RPC
122 18824b58 2008-08-03 rsc
123 18824b58 2008-08-03 rsc enum
124 18824b58 2008-08-03 rsc {
125 18824b58 2008-08-03 rsc MaxResponse = 1<<29,
126 18824b58 2008-08-03 rsc };
127 18824b58 2008-08-03 rsc
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*);
131 18824b58 2008-08-03 rsc
132 18824b58 2008-08-03 rsc extern int chattyhttp;
133 18824b58 2008-08-03 rsc
134 18824b58 2008-08-03 rsc
135 18824b58 2008-08-03 rsc // SmugMug RPC
136 18824b58 2008-08-03 rsc
137 18824b58 2008-08-03 rsc #ifdef __GNUC__
138 18824b58 2008-08-03 rsc #define check_nil __attribute__((sentinel))
139 18824b58 2008-08-03 rsc #else
140 18824b58 2008-08-03 rsc #define check_nil
141 18824b58 2008-08-03 rsc #endif
142 18824b58 2008-08-03 rsc
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
145 18824b58 2008-08-03 rsc
146 18824b58 2008-08-03 rsc
147 18824b58 2008-08-03 rsc // Session information
148 18824b58 2008-08-03 rsc
149 18824b58 2008-08-03 rsc extern Json *userinfo;
150 18824b58 2008-08-03 rsc extern char *sessid;
151 18824b58 2008-08-03 rsc
152 18824b58 2008-08-03 rsc
153 18824b58 2008-08-03 rsc // File system
154 18824b58 2008-08-03 rsc
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*);
158 18824b58 2008-08-03 rsc
159 18824b58 2008-08-03 rsc // Logging
160 18824b58 2008-08-03 rsc
161 18824b58 2008-08-03 rsc typedef struct Logbuf Logbuf;
162 18824b58 2008-08-03 rsc struct Logbuf
163 18824b58 2008-08-03 rsc {
164 18824b58 2008-08-03 rsc Req *wait;
165 18824b58 2008-08-03 rsc Req **waitlast;
166 18824b58 2008-08-03 rsc int rp;
167 18824b58 2008-08-03 rsc int wp;
168 18824b58 2008-08-03 rsc char *msg[128];
169 18824b58 2008-08-03 rsc };
170 18824b58 2008-08-03 rsc
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 */
178 18824b58 2008-08-03 rsc
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*);
183 18824b58 2008-08-03 rsc
184 18824b58 2008-08-03 rsc enum
185 18824b58 2008-08-03 rsc {
186 18824b58 2008-08-03 rsc STACKSIZE = 32768
187 18824b58 2008-08-03 rsc };
188 18824b58 2008-08-03 rsc
189 18824b58 2008-08-03 rsc extern int printerrors;