// Written by Sven Killig <sven@killig.de> 2010
// gcc -lrt -o webcam.cgi webcam.c && chmod +s webcam.cgi

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <semaphore.h>
#include <fcntl.h>


void sig_handler_ready(int sig) {}


int main(int argc, char *argv[]) {
	// Workaround for strange client that makes accesses in rapid succession:
	char *http_user_agent=getenv("HTTP_USER_AGENT");
	if(!strncmp(http_user_agent, "WorldViewLive", 13)) {
		printf("Location: http://images.webcams.travel/webcam/1239964324.jpg\x0D\x0A");
		printf("\x0D\x0A");
		fflush(stdout);
    exit(0);
	}

	printf("content-type: image/jpeg\x0D\x0A");
	//printf("Cache-Control: no-cache\x0D\x0A");
	printf("Cache-Control: max-age=10\x0D\x0A");
	printf("\x0D\x0A");
	fflush(stdout);

	sigset_t mask, oldmask;
	signal(SIGUSR1, sig_handler_ready);
	/* Set up the mask of signals to temporarily block. */
	sigemptyset (&mask);
	sigaddset (&mask, SIGUSR1);

  char SEM_NAME[]= "gphoto_webcam";
  sem_t *mutex;
  //create & initialize semaphore
  mutex = sem_open(SEM_NAME,O_CREAT,0644,1);
  if(mutex == SEM_FAILED) {
    perror("unable to create semaphore");
    sem_unlink(SEM_NAME);
    exit(-1);
  }
  sem_wait(mutex);

	char *query_string=getenv("QUERY_STRING");
	FILE *pFile;
	pFile = fopen("/tmp/gphoto_settings.txt", "w");
	if(strlen(query_string)!=0) fprintf(pFile, "%s", query_string);
	else fprintf(pFile, "shootingmode=1&iso=1&imageformat=1&zoom=0");
	fclose(pFile);

	system("killall -s SIGUSR1 gphoto2");

	/* Wait for a signal to arrive. */
	sigprocmask (SIG_BLOCK, &mask, &oldmask);
  sigsuspend (&oldmask);
	sigprocmask (SIG_UNBLOCK, &mask, NULL);

	sem_post(mutex);
	sem_close(mutex);
	sem_unlink(SEM_NAME);

	system("cat /tmp/webcam.jpg");
}

