// Author: Douglas MacDougall <mac@gnajp.com>
// Copyright (c) 2001 GNA, Inc. Japan
// http://www.gnajp.com
// このプログラムをご使用になられる方はご一報下さい <info@gnajp.com>
// このプログラムは、コンパイルしてご使用ください
// UNIXでのコンパイル例: gcc -o getimg.cgi getimg.c
// 画像を置くディレクトリを、UNIXかWINDOWS別に指定する
// 例では、ベースディレクトリ下にある「camera_img」ディレクトリ
#ifdef WIN32 // RUNNING ON WINDOWS (IIS)
#define CAM_JPG_DIR "..\\camera_img\\"
#else // LINUX OR OTHER UNIX
#define CAM_JPG_DIR "../camera_img/"
#endif
// 画像ファイル名(数字の前部分)を設定する
// 例では「cam」 これだと「cam01.jpg, cam02.jpg, cam03.jpg, ...」となります
#define CAM_JPG_PREFIX "cam"
// 送信する(循環する)画像数を設定する
// 例では、「20」(常に20の画像が上記ディレクトリにある)
#define CAM_NUMBER_JPEGS 20
// 上記の画像数が「10〜99」の場合はこの行をコメント(//)しない
// 今回の例では、送信する画像数が20なのでコメントしていません
// IF CAM_NUMBER_JPEGS IS 10~99 UNCOMMENT NEXT LINE
#define CAM_IMAGES_10
// 上記の画像数が「100〜999」の場合はこの行をコメント(//)しない
// 今回の例では、送信する画像数が20なのでコメントしてあります
// #define CAM_IMAGES_100
/** DO NOT CHANGE ANYTHING BELOW THIS **/
/** ここから下は何も変更しないでください **/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#ifdef CAM_IMAGES_10
#define CAM_ZEROS "%02d"
#elif CAM_IMAGES_100
#define CAM_ZEROS "%03d"
#else
#define CAM_ZEROS "%d"
#endif
int main(int argc, char *argv[])
{
FILE *f;
char buf[BUFSIZ];
char fname[FILENAME_MAX];
struct stat st;
register int i,last=1;
time_t newest=0;
unsigned int bytes;
for(i=1; i<=CAM_NUMBER_JPEGS; i++) {
sprintf(fname,CAM_JPG_DIR CAM_JPG_PREFIX CAM_ZEROS ".jpg", i);
if(stat(fname,&st))
{
fprintf(stderr,"Stat failed for %s: %s\n",fname,strerror(errno));
continue;
}
if(newest<st.st_mtime)
{
newest=st.st_mtime;
last=i;
}
}
if(last==1)
last=CAM_NUMBER_JPEGS;
else
last--;
sprintf(fname,CAM_JPG_DIR CAM_JPG_PREFIX CAM_ZEROS ".jpg", last);
if((f=fopen(fname,"r"))==NULL)
{
fprintf(stderr,"Failed to open %s: %s\n",fname,strerror(errno));
exit(1);
}
puts("Content-type: image/jpeg");
puts("Expires: 0");
puts("");
while((bytes=fread(buf,1,BUFSIZ,f)))
{
fwrite(buf,1,bytes,stdout);
}
fclose(f);
}
|