plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

a.h (3425B)


      1 #include <u.h>
      2 #include <errno.h>
      3 #include <libc.h>
      4 #include <fcall.h>
      5 #include <thread.h>
      6 #include <auth.h>
      7 #include <9p.h>
      8 #include <libsec.h>
      9 
     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)"
     16 
     17 void*	emalloc(int);
     18 void*	erealloc(void*, int);
     19 char*	estrdup(char*);
     20 int	urlencodefmt(Fmt*);
     21 int	timefmt(Fmt*);
     22 int	writen(int, void*, int);
     23 
     24 
     25 // Generic cache
     26 
     27 typedef struct Cache Cache;
     28 typedef struct CEntry CEntry;
     29 
     30 struct CEntry
     31 {
     32 	char *name;
     33 	struct {
     34 		CEntry *next;
     35 		CEntry *prev;
     36 	} list;
     37 	struct {
     38 		CEntry *next;
     39 	} hash;
     40 };
     41 
     42 Cache *newcache(int sizeofentry, int maxentry, void (*cefree)(CEntry*));
     43 CEntry *cachelookup(Cache*, char*, int);
     44 void cacheflush(Cache*, char*);
     45 
     46 // JSON parser
     47 
     48 typedef struct Json Json;
     49 
     50 enum
     51 {
     52 	Jstring,
     53 	Jnumber,
     54 	Jobject,
     55 	Jarray,
     56 	Jtrue,
     57 	Jfalse,
     58 	Jnull
     59 };
     60 
     61 struct Json
     62 {
     63 	int ref;
     64 	int type;
     65 	char *string;
     66 	double number;
     67 	char **name;
     68 	Json **value;
     69 	int len;
     70 };
     71 
     72 void	jclose(Json*);
     73 Json*	jincref(Json*);
     74 vlong	jint(Json*);
     75 Json*	jlookup(Json*, char*);
     76 double	jnumber(Json*);
     77 int	jsonfmt(Fmt*);
     78 int	jstrcmp(Json*, char*);
     79 char*	jstring(Json*);
     80 Json*	jwalk(Json*, char*);
     81 Json*	parsejson(char*);
     82 
     83 
     84 // Wrapper to hide whether we're using OpenSSL for HTTPS.
     85 
     86 typedef struct Protocol Protocol;
     87 typedef struct Pfd Pfd;
     88 struct Protocol
     89 {
     90 	Pfd *(*connect)(char *host);
     91 	int (*read)(Pfd*, void*, int);
     92 	int (*write)(Pfd*, void*, int);
     93 	void (*close)(Pfd*);
     94 };
     95 
     96 Protocol http;
     97 Protocol https;
     98 
     99 
    100 // HTTP library
    101 
    102 typedef struct HTTPHeader HTTPHeader;
    103 struct HTTPHeader
    104 {
    105 	int code;
    106 	char proto[100];
    107 	char codedesc[100];
    108 	vlong contentlength;
    109 	char contenttype[100];
    110 };
    111 
    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);
    114 
    115 
    116 // URL downloader - caches in files on disk
    117 
    118 int download(char *url, HTTPHeader *hdr);
    119 void downloadflush(char*);
    120 
    121 // JSON RPC
    122 
    123 enum
    124 {
    125 	MaxResponse = 1<<29,
    126 };
    127 
    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*);
    131 
    132 extern int chattyhttp;
    133 
    134 
    135 // SmugMug RPC
    136 
    137 #ifdef __GNUC__
    138 #define check_nil __attribute__((sentinel))
    139 #else
    140 #define check_nil
    141 #endif
    142 
    143 Json* smug(char *method, char *name1, ...) check_nil;  // cached, http
    144 Json* ncsmug(char *method, char *name1, ...) check_nil;  // not cached, https
    145 
    146 
    147 // Session information
    148 
    149 extern Json *userinfo;
    150 extern char *sessid;
    151 
    152 
    153 // File system
    154 
    155 extern Srv xsrv;
    156 void xinit(void);
    157 extern int nickindex(char*);
    158 
    159 // Logging
    160 
    161 typedef struct Logbuf Logbuf;
    162 struct Logbuf
    163 {
    164 	Req *wait;
    165 	Req **waitlast;
    166 	int rp;
    167 	int wp;
    168 	char *msg[128];
    169 };
    170 
    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 */
    178 
    179 extern void	rpclog(char*, ...);
    180 extern void	rpclogflush(Req*);
    181 extern void	rpclogread(Req*);
    182 extern void	rpclogwrite(Req*);
    183 
    184 enum
    185 {
    186 	STACKSIZE = 32768
    187 };
    188 
    189 extern int printerrors;