aboutsummaryrefslogtreecommitdiffstats
path: root/nph-png
blob: 0240b64fb76736937486edc3069e23e802d3235d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl

use strict;
use vars qw ($file $DELAY);
########## CONFIG
  $file = "lcd4linux"; # .png is appended
  $DELAY = 0;          # delay in seconds
                       # if delay is zero, file is sent when modified.
#################

use CGI qw/:push -nph/;
$| = 1;
my ($mtime, $nmtime, $size, $nsize);
(undef, undef, undef, undef, undef, undef, undef, $size, undef,
   $mtime) = stat "$file.png";
print multipart_init(-boundary=>'----------------here we go!');
while (1) {
  print multipart_start(-type=>'image/png');
  undef $/;
  open(IN, "$file.png") or die("Can't read '$file.png'");
  $_ = <IN>;
  print $_;
  close(IN);
  print multipart_end;
  if ($DELAY) {
    sleep $DELAY;
  }  
  else {
    W: while (1) {
  #    sleep(1);
      (undef, undef, undef, undef, undef, undef, undef, $nsize, undef,
         $nmtime) = stat "$file.png";
      if($mtime != $nmtime || $size != $nsize) {	 
        $mtime = $nmtime;
	$size = $nsize;
	last W;
      }	
    }	 
  }	
}
="w"> char buffer[16]; int fd, len, pid; snprintf(tmpfile, sizeof(tmpfile), "%s.%s", pidfile, "XXXXXX"); if ((fd=mkstemp(tmpfile))==-1) { error ("mkstemp(%s) failed: %s", tmpfile, strerror(errno)); return -1; } if (fchmod(fd,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)==-1) { error ("fchmod(%s) failed: %s", tmpfile, strerror(errno)); close(fd); unlink(tmpfile); return -1; } snprintf (buffer, sizeof(buffer), "%d\n", (int)getpid()); if (write(fd, buffer, strlen(buffer))!=strlen(buffer)) { error ("write(%s) failed: %s", tmpfile, strerror(errno)); close(fd); unlink(tmpfile); return -1; } close (fd); while (link(tmpfile, pidfile)==-1) { if (errno!=EEXIST) { error ("link(%s, %s) failed: %s", tmpfile, pidfile, strerror(errno)); unlink(tmpfile); return -1; } if ((fd=open(pidfile, O_RDONLY))==-1) { if (errno==ENOENT) continue; // pidfile disappared error ("open(%s) failed: %s", pidfile, strerror(errno)); unlink (tmpfile); return -1; } len=read(fd, buffer, sizeof(buffer)-1); if (len<0) { error ("read(%s) failed: %s", pidfile, strerror(errno)); unlink (tmpfile); return -1; } buffer[len]='\0'; if (sscanf(buffer, "%d", &pid)!=1 || pid==0) { error ("scan(%s) failed.", pidfile); unlink (tmpfile); return -1; } if (pid==getpid()) { error ("%s already locked by us. uh-oh...", pidfile); unlink(tmpfile); return 0; } if ((kill(pid, 0)==-1) && errno==ESRCH) { error ("removing stale PID file %s", pidfile); if (unlink(pidfile)==-1 && errno!=ENOENT) { error ("unlink(%s) failed: %s", pidfile, strerror(errno)); unlink(tmpfile); return pid; } continue; } unlink (tmpfile); return pid; } unlink (tmpfile); return 0; } int pid_exit (const char *pidfile) { return unlink(pidfile); }