int kv_read_object_meta(struct http_request *req, const char *account, const char *bucket, const char *name) { struct kv_onode *onode = NULL; char vdi_name[SD_MAX_VDI_LEN]; uint32_t bucket_vid; int ret; snprintf(vdi_name, SD_MAX_VDI_LEN, "%s/%s", account, bucket); ret = sd_lookup_vdi(vdi_name, &bucket_vid); if (ret != SD_RES_SUCCESS) return ret; onode = xzalloc(sizeof(*onode)); ret = onode_lookup(onode, bucket_vid, name); if (ret != SD_RES_SUCCESS) goto out; req->data_length = onode->size; http_request_writef(req, "Last-Modified: %s\n", http_time(onode->mtime)); out: free(onode); return ret; }
int main(int argc, char *argv[]) { long length; char *buffer; char *server_url = NULL; long i; long filter=0; #ifdef MUST_DISABLE_SIGFPE signal(SIGFPE,SIG_IGN); #endif #ifdef MUST_DISABLE_FPMASK fpsetmask(0); #endif optind = 0; opterr = 0; /* initialize getopt */ /* what do we get for cmdline arguments? for (i=0;i<argc;i++) printf("%d-'%s'\n",i,argv[i]); */ while (1) { static struct option long_options[] = { { "filter", no_argument, 0, 'f' }, { 0, 0, 0, 0} }; int option_index = 0; int opt; opt = getopt_long(argc, argv, "f", long_options, &option_index); if (opt == EOF) { break; } switch(opt) { case 'f': filter=1; break; case '?': printf("unknown commandline option '%s'\n",argv[optind-1]); return -1; } } if (!filter) { rrdcgiDebug(0,0); rrdcgiArg = rrdcgiInit(); server_url = getenv("SERVER_URL"); } /* make sure we have one extra argument, if there are others, we do not care Apache gives several */ /* if ( (optind != argc-2 && strstr( getenv("SERVER_SOFTWARE"),"Apache/2") != NULL) && optind != argc-1) { */ if ( optind >= argc ) { fprintf(stderr, "ERROR: expected a filename\n"); exit(1); } else { length = readfile(argv[optind], &buffer, 1); } if(rrd_test_error()) { fprintf(stderr, "ERROR: %s\n",rrd_get_error()); exit(1); } /* initialize variable heap */ initvar(); #ifdef DEBUG_PARSER /* some fake header for testing */ printf ("Content-Type: text/html\nContent-Length: 10000000\n\n\n"); #endif /* expand rrd directives in buffer recursivly */ for (i=0; buffer[i]; i++) { if (buffer[i] != '<') continue; if (!filter) { parse(&buffer, i, "<RRD::CV", cgiget); parse(&buffer, i, "<RRD::CV::PATH", cgigetqp); parse(&buffer, i, "<RRD::CV::QUOTE", cgigetq); parse(&buffer, i, "<RRD::GETENV", rrdgetenv); } parse(&buffer, i, "<RRD::GETVAR", rrdgetvar); parse(&buffer, i, "<RRD::GOODFOR", rrdgoodfor); parse(&buffer, i, "<RRD::GRAPH", drawgraph); parse(&buffer, i, "<RRD::INCLUDE", includefile); parse(&buffer, i, "<RRD::PRINT", drawprint); parse(&buffer, i, "<RRD::SETCONSTVAR", rrdsetvarconst); parse(&buffer, i, "<RRD::SETENV", rrdsetenv); parse(&buffer, i, "<RRD::SETVAR", rrdsetvar); parse(&buffer, i, "<RRD::TIME::LAST", printtimelast); parse(&buffer, i, "<RRD::TIME::NOW", printtimenow); parse(&buffer, i, "<RRD::TIME::STRFTIME", printstrftime); parse(&buffer, i, "<RRD::INTERNAL", rrdgetinternal); } if (!filter) { printf ("Content-Type: text/html\n" "Content-Length: %d\n", strlen(buffer)); if (labs(goodfor) > 0) { time_t now; now = time(NULL); printf("Last-Modified: %s\n", http_time(&now)); now += labs(goodfor); printf("Expires: %s\n", http_time(&now)); if (goodfor < 0) { printf("Refresh: %ld\n", labs(goodfor)); } } printf("\n"); } /* output result */ printf("%s", buffer); /* cleanup */ calfree(); if (buffer){ free(buffer); } donevar(); exit(0); }
/* * Read the file to be transfered. * Write that file on the data socket. * The caller closes the socket. */ int source(int sock) { int fd, n, size; char *s; char file[100]; char hbuf[1024]; struct stat sb; #define name &buf[5] n = read(sock, buf, XFERSIZE); if (n <= 0) { perror("control nbytes"); return (-1); } buf[n] = 0; if (dflg) printf("%.*s\n", n, buf); if (zflg) { return (0); } if (!strncmp(buf, "EXIT", 4)) { exit(0); } if (strncmp(buf, "GET /", 5)) { perror(buf); return(1); } for (s = buf; *s && *s != '\r' && *s != '\n'; s++) ; *s = 0; for (s = name; *s && *s != ' '; s++) ; *s = 0; if (lflg) strncpy(file, name, sizeof(file)); if (dflg) printf("OPEN %s\n", name); fd = open(name, 0); if (fd == -1) { error: perror(name); close(fd); return (1); } if (fstat(fd, &sb) == -1) { if (dflg) printf("Couldn't stat %s\n", name); goto error; } size = sb.st_size; n = sprintf(hbuf, "HTTP/1.0 200 OK\r\n%s\r\nServer: lmhttp/0.1\r\nContent-Type: %s\r\nLast-Modified: %s\r\n\r\n", http_time(), type(name), date(&sb.st_mtime)); if (write(sock, hbuf, n) != n) { goto error; } if (Dflg && isdir(name)) { dodir(name, sock); } else if (nflg) { fake(sock, buf, size); } else if ((size > MMAPS_BETTER)) { /* XXX */ if (mmap_rdwr(fd, sock, size) == -1) { printf("%s mmap failed\n", name); } } else { rdwr(fd, sock, buf); } if (lflg) logit(sock, file, size); close(fd); return(0); }