[Pkg-wmaker-commits] [wmtv] 21/48: wmtv: Remaining changes from debian package versions 0.6.5-8 through 13.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Mon Feb 1 20:13:21 UTC 2016


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository wmtv.

commit ed68b53e044357668ea042790eb940cb1a2b70cc
Author: Doug Torrance <dtorrance at piedmont.edu>
Date:   Mon Feb 1 00:45:14 2016 -0500

    wmtv: Remaining changes from debian package versions 0.6.5-8 through 13.
    
    (I couldn't find the patches separately in, e.g., a bug report.)
    
    Patches by Nicolas Boullis <Boullis.Nicolas at libertysurf.fr>.
    
    Corresponding entries from debian/changelog:
    
    0.6.5-8
    =======
      * Drop privileges to access files, and then regain privileges.
        (Closes: #120825)
      * A new user's configuration file is automatically created when needed.
      * Cleaned up a few possible buffer overflows.
    
    0.6.5-9
    =======
      * The program does not need any more to be setuid root.
        (Closes: #120832)
    
    0.6.5-10
    ========
      * Trying to change channel while the TV is off does nothing, and does
        not segfault anymore.
      * Corrected strange behavior when the mouse was moved out of a pressed
        button.
    
    0.6.5-11
    ========
      * Corrected a bug introduced in version 0.6.5-9, causing the program to
        segfault while reverting from fullscreen back to normal mode.
        (Closes: #128409)
    
    0.6.5-12
    ========
      * Catch SIGCHLD signals to remove zombies. (Closes: #129435)
    
    0.6.5-13
    ========
      * Added missing #include in wmtv.c.
      * Automatically restarts the TV when the external application finishes.
      * In fullscreen mode, the left and right arrow keys now behave as
        specified in the README file and in the manpage. (Closes: #133301)
      * Added the ability to pass some parameters to the external
        application.
---
 src/wmtv.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 190 insertions(+), 50 deletions(-)

diff --git a/src/wmtv.c b/src/wmtv.c
index fd482eb..8a06cfe 100644
--- a/src/wmtv.c
+++ b/src/wmtv.c
@@ -29,6 +29,7 @@
 #include <fcntl.h>
 #include <time.h>
 #include <errno.h>
+#include <signal.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/types.h>
@@ -82,6 +83,9 @@
 #define COMPOSITE   1
 #define SVIDEO		2
 
+#ifndef GLOBALCONFFILE
+#define GLOBALCONFFILE "/etc/wmtvrc"
+#endif
 
 /* Global Variables */
 int tfd;
@@ -111,6 +115,8 @@ int dcret;
 int tml;
 int fswidth = 0;
 int fsheight = 0;
+pid_t child_pid = -1;
+int restart = FALSE;
 
 unsigned long ccrfreq;
 unsigned long rfreq;
@@ -127,6 +133,9 @@ long ftune[MAXCHAN];
 char *progname;
 char *dev = "/dev/video";
 
+char *sysConfFile = GLOBALCONFFILE;
+char *usrConfFile;
+
 int  wmtv_mask_width = 64;
 int  wmtv_mask_height = 64;
 char wmtv_mask_bits[64*64];
@@ -195,21 +204,89 @@ void GrabImage(void);
 
 void ParseRCFile(const char *, rckeys *);
 void ParseRCFile2(const char *);
-void WriteRCFile(const char *);
+void WriteRCFile(const char *, rckeys *);
 void InitConfig(void);
 void InitPalette(void);
 
 void Usage(void);
 void Version(void);
 
+void
+sigchld_handler(int i)
+{
+	pid_t pid;
+	pid = waitpid((pid_t)-1, NULL, WNOHANG);
+	while (pid>(pid_t)0) {
+		if (pid == child_pid) {
+			child_pid = -1;
+			restart = TRUE;
+		}
+		pid = waitpid((pid_t)-1, NULL, WNOHANG);
+	}
+}
+
+void
+init_signal()
+{
+	struct sigaction sa;
+
+	sa.sa_handler = &sigchld_handler;
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = SA_RESTART;
+	sigaction(SIGCHLD, &sa, NULL);
+}
+
+char *
+expand_format(char *format, char *letters, char **expansions)
+{
+	char *string;
+	unsigned int string_pos = 0;
+	unsigned int size;
+	size = strlen(format)+1;
+	string = (char *)malloc(size*sizeof(char));
+	for (; *format != '\0'; format++) {
+		if (*format == '%') {
+			format++;
+			if (*format != '%') {
+				unsigned int i;
+				for (i = 0; letters[i] != '\0'; i++) {
+					if (letters[i] == *format)
+						break;
+				}
+				if (letters[i] != '\0') {
+					unsigned int expansion_size;
+					expansion_size = strlen(expansions[i]);
+					while (string_pos+expansion_size+1 > size) {
+						size *= 2;
+						string = realloc(string, size*sizeof(char));
+					}
+					memcpy(string+string_pos, expansions[i], expansion_size);
+					string_pos += expansion_size;
+					continue;
+				}
+				else {
+					format--;
+				}
+			}
+		}
+		while (string_pos+1+1 > size) {
+			size *= 2;
+			string = realloc(string, size*sizeof(char));
+		}
+		string[string_pos] = *format;
+		string_pos++;
+	}
+	string[string_pos] = '\0';
+	return string;
+}
 
 /* main function */
 int
 main(int argc, char *argv[])
 {
-	int i, c, opind;
+	int c, opind;
+	int pressed_button = -1;
 	/* pid_t pid; */
-	char cfile[128];
 	static struct option long_options[] = {
 		{"display", 1, 0, 'd'},
 		{"geometry", 1, 0, 'g'},
@@ -222,8 +299,18 @@ main(int argc, char *argv[])
 
 	progname = strdup(argv[0]);
 
-	strncpy(cfile, (char *)getenv("HOME"), sizeof(char)*128);
-	strcat(cfile, "/.wmtvrc");
+	{
+		char *home = getenv("HOME");
+
+		if (home == NULL) {
+			fprintf(stderr, "wmtv: $HOME should be set.\n");
+			exit(1);
+		}
+
+		usrConfFile = (char *)malloc(sizeof(char)*(strlen(home)+8+1));
+		strcpy(usrConfFile, home);
+		strcat(usrConfFile, "/.wmtvrc");
+	}
 
 	while (1) {
 		opind = 0;
@@ -277,9 +364,21 @@ main(int argc, char *argv[])
 	AddMouseRegion (SCANRB, 35, 48, 47, 59); 	/* Right Preset/Scan Button */
 	AddMouseRegion (FULLSB, 5, 5, 59, 44);		/* Toggle FullScreen */
 
+	init_signal();
+
 	/* wmtv main loop */
 	while (1)
 	{
+		if (restart) {
+			TVOn();
+			if (ntfb_status == SETOFF) {
+				ntfb_status = SETON;
+				RedrawWindow();
+				XFlush(display);
+			}
+			restart = FALSE;
+			continue;
+		}
 		while (XPending(display))
 		{
 			XNextEvent(display, &Event);
@@ -302,8 +401,8 @@ main(int argc, char *argv[])
 						RetScreen();
 					}
 					else {
-					i = CheckMouseRegion (Event.xbutton.x, Event.xbutton.y);
-					switch (i) {
+					pressed_button = CheckMouseRegion (Event.xbutton.x, Event.xbutton.y);
+					switch (pressed_button) {
 						case NTFB:
 							ButtonDown(NTFB);
 							t_lc = Event.xbutton.time;
@@ -325,7 +424,7 @@ main(int argc, char *argv[])
 										break;
 								}
 							}
-							else
+							else if (ntfb_status == SETON)
 									ChanDown();
 							break;
 						case SCANRB:
@@ -344,7 +443,7 @@ main(int argc, char *argv[])
 										break;
 								}
 							}
-							else
+							else if (ntfb_status == SETON)
 									ChanUp();
 							break;
 						case FULLSB:
@@ -371,8 +470,7 @@ main(int argc, char *argv[])
 					}
 					break;
 				case ButtonRelease:
-					i = CheckMouseRegion (Event.xbutton.x, Event.xbutton.y);
-					switch (i) {
+					switch (pressed_button) {
 						case NTFB:
 							ButtonUp(NTFB);
 								if (but_pressed) {
@@ -383,9 +481,11 @@ main(int argc, char *argv[])
 								}
 
 								if (ntfb_status == SETOFF) {
+									if (child_pid == -1) {
 										ntfb_status = SETON;
 										TVOn();
 								}
+								}
 								else if (ntfb_status == SETON) {
 										if (!btime) {
 										ntfb_status = SETUNE;
@@ -403,7 +503,7 @@ main(int argc, char *argv[])
 										if (!btime) {
 											ftune[cchannel] = (rfreq - ccrfreq);
 											/* fprintf(stderr, "wmtv: finetune offset = %ld\n", ftune[cchannel]); */
-											WriteRCFile(cfile);
+											WriteRCFile(usrConfFile, wmtv_keys);
 											ntfb_status = SETON;
 											DrawPresetChan(cchannel);
 										}
@@ -437,19 +537,39 @@ main(int argc, char *argv[])
 											{
 												if ((ntfb_status == SETON) || (ntfb_status == SETUNE)) {
 													if (exe) {
+														pid_t pid;
+														char *command;
+														char *letters = "#nf";
+														char *(expansions[3]);
 														ntfb_status = SETOFF;
 														TVOff();
+														expansions[0] = malloc(3*sizeof(char));
+														snprintf(expansions[0], 3, "%d", cchannel+1);
+														expansions[1] = comment[cchannel];
+														expansions[2] = malloc(15*sizeof(char));
+														snprintf(expansions[2], 15, "%ld", rfreq);
+														command = expand_format(exe, letters, expansions);
 														/* system(exe); */
-														if (fork() == (pid_t) 0) {
+														child_pid = fork();
+														if (child_pid == (pid_t) 0) {
 														char *argv[4];
-														setuid(getuid()); /* Drop the privileges */
 														argv[0] = "sh";
 														argv[1] = "-c";
-														argv[2] = exe;
+															argv[2] = command;
 														argv[3] = NULL;
 														execv("/bin/sh", argv);
 														exit(-1);
 														}
+														free(expansions[0]);
+														free(expansions[2]);
+														free(command);
+														pid = waitpid(child_pid, NULL, WNOHANG);
+														if (pid != 0) {
+															child_pid = -1;
+															restart = TRUE;
+														}
+														/* printf("Returned pid:\n"); */
+
 #if 0
 														pid = fork();
 
@@ -554,12 +674,10 @@ main(int argc, char *argv[])
 									ChanDown();
 									break;
 								case XK_Right:
-									if (isource == TELEVISION)
-									FineTuneUp();
+									VolumeUp();
 									break;
 								case XK_Left:
-									if (isource == TELEVISION)
-									FineTuneDown();
+									VolumeDown();
 									break;
 								case XK_m:
 									if (!mute) {
@@ -642,7 +760,6 @@ TVOn(void)
 	int rx, ry;
 	char *p;
 
-
 	XWindowAttributes winattr;
 
 	if (!XGetWindowAttributes (display, iconwin, &winattr)) {
@@ -656,6 +773,18 @@ TVOn(void)
 		fprintf(stderr, "wmtv: error translating coordinates\n");
 	}
 
+	/* This part was taken from xawtv's source code */
+	switch (system("v4l-conf -q")) {
+	case -1: /* can't run */
+		fprintf(stderr,"could'nt start v4l-conf\n");
+		break;
+	case 0: /* ok */
+		break;
+	default: /* non-zero return */
+		fprintf(stderr,"v4l-conf had some trouble, "
+				"trying to continue anyway\n");
+	}
+	/* End of "stolen" part */
 	InitConfig();
 	GetFrameBuffer();
 	InitPalette();
@@ -716,7 +845,7 @@ TVOn(void)
 
 		if (vaud.flags & VIDEO_AUDIO_MUTE) {
 			vaud.flags &= ~VIDEO_AUDIO_MUTE; 	/* Unmute */
-			vaud.volume = (0xFFFF/2)+1;
+			vaud.volume = 0xFFFF;
 		}
 
 	if (isource == TELEVISION) {
@@ -787,9 +916,11 @@ void
 VolumeUp(void)
 {
 	if(vchn.flags & VIDEO_VC_AUDIO) {
-		if (vaud.volume <= 0xFFFF) {
+		if ((vaud.flags & VIDEO_AUDIO_VOLUME) == 0)
+			fprintf(stderr, "Warning: v4l device does not support volume control.\n");
+		else if (vaud.volume <= 0xEEEE) {
 			vaud.audio = tvsource;
-			vaud.volume += (0xFFFF/10);
+			vaud.volume += 0x1111;
 			if (ioctl(tfd, VIDIOCSAUDIO, &vaud) < 0)
 				perror("ioctl VIDIOCSAUDIO");
 		}
@@ -802,9 +933,11 @@ void
 VolumeDown(void)
 {
 	if (vchn.flags & VIDEO_VC_AUDIO) {
-		if (vaud.volume > 0) {
+		if ((vaud.flags & VIDEO_AUDIO_VOLUME) == 0)
+			fprintf(stderr, "Warning: v4l device does not support volume control.\n");
+		else if (vaud.volume >= 0x1111) {
 			vaud.audio = tvsource;
-			vaud.volume -= (0xFFFF/10);
+			vaud.volume -= 0x1111;
 			if (ioctl(tfd, VIDIOCSAUDIO, &vaud) < 0)
 				perror("ioctl VIDIOCSAUDIO");
 		}
@@ -1038,8 +1171,16 @@ ParseRCFile2(const char *filename)
 			if (menu) {
 				ftune[i]=0;
 				if(sscanf(temp, " %s %n(%ld) %n", name, &len, &ftune[i], &len)>=1) {
+					char *pos;
 					cname[i]=strdup(name);
-					comment[i]=temp[len]?strdup(temp+len):"\n";
+					comment[i]=temp[len]?strdup(temp+len):"";
+					/* Remove the end-of-line symbol */
+					for (pos = comment[i]; *pos != '\0'; pos++) {
+						if (*pos == '\n') {
+							*pos = '\0';
+							break;
+						}
+					}
 				}
 				if(++i>=MAXCHAN)
 					break;
@@ -1056,28 +1197,27 @@ ParseRCFile2(const char *filename)
 
 /* WriteRCFile function */
 void
-WriteRCFile(const char *filename)
+WriteRCFile(const char *filename, rckeys *keys)
 {
 	long i;
-	char temp[128];
 	FILE *fp;
+	int key;
 
-	if ((fp = fopen(filename, "r+")) == NULL) {
+	if ((fp = fopen(filename, "w")) == NULL) {
 		fprintf(stderr, "wmtv: %s\n", strerror(errno));
 		return;
 	}
 
-	while (fgets(temp, 128, fp)) {
-		if (*temp != '\n' && strchr(temp, '[')) {
-			fseek(fp, 0L, SEEK_CUR);	/* required between read and write */
+	for (key=0; keys[key].label; key++)
+		if (*keys[key].var)
+			fprintf(fp, "%s = %s\n", keys[key].label, *keys[key].var);
+
+	fprintf(fp, "\n[channel]\n");
+
 			for (i = 0; i <= maxpst; i++)
-				fprintf(fp, "%s (%ld)\t%s", cname[i], ftune[i], comment[i]);
-			break;
-		}
-	}
-	i=ftell(fp);
+		fprintf(fp, "%s (%ld)\t%s\n", cname[i], ftune[i], comment[i]);
+
 	fclose(fp);
-	truncate(filename, i);
 }
 
 
@@ -1128,17 +1268,13 @@ void
 InitConfig(void)
 {
 	int i;
-	char temp[128];
 
-	strncpy(temp, (char *)getenv("HOME"), (sizeof(char)*128));
-	strcat(temp, "/.wmtvrc");
-	ParseRCFile(temp, wmtv_keys);
-	ParseRCFile2(temp);
+	ParseRCFile(usrConfFile, wmtv_keys);
+	ParseRCFile2(usrConfFile);
 
 	if (norcfile) {
-		strcpy(temp, "/etc/wmtvrc");
-		ParseRCFile(temp, wmtv_keys);
-		ParseRCFile2(temp);
+		ParseRCFile(sysConfFile, wmtv_keys);
+		ParseRCFile2(sysConfFile);
 
 		if (norcfile) {
 			fprintf(stderr, "wmtv: error - config file not found\n");
@@ -1272,17 +1408,20 @@ InitConfig(void)
 void
 GetFrameBuffer(void)
 {
+#if 0
 	void *baseaddr = NULL;
 	int evbr, erbr, flr = 0;
 	int bankr, memr, depth;
 	int i, n;
-	int bytesperline, bytesperpixel;
+	int bytesperline, bitsperpixel;
 	XPixmapFormatValues *pf;
+#endif
 
 	if (!XGetWindowAttributes(display, DefaultRootWindow(display), &Winattr)) {
 		fprintf(stderr, "wmtv: error getting winattr of root\n");
 	}
 
+#if 0
 	depth = Winattr.depth;
 
 	if (XF86DGAQueryExtension(display, &evbr, &erbr)) {
@@ -1306,13 +1445,13 @@ GetFrameBuffer(void)
 			}
 	}
 
-	bytesperpixel = (depth+7) & 0xf8;
-	bytesperline *= bytesperpixel;
+	bitsperpixel = (depth+7) & 0xf8;
+	bytesperline *= bitsperpixel/8;
 
 	vfb.base = baseaddr;
 	vfb.height = Winattr.height;
 	vfb.width  = Winattr.width;
-	vfb.depth  = bytesperpixel;
+	vfb.depth  = bitsperpixel;
 	vfb.bytesperline = bytesperline;
 
 	if (Winattr.depth == 15)
@@ -1321,6 +1460,7 @@ GetFrameBuffer(void)
 	if (ioctl(tfd, VIDIOCSFBUF, &vfb) < 0) {
 		perror("ioctl VIDIOCSFBUF");
 	}
+#endif
 }
 
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmtv.git



More information about the Pkg-wmaker-commits mailing list