Mercurial > mplayer.hg
view TOOLS/cache.c @ 7492:5465cbd5c5ef
Modern versions of OpenSSH listen on localhost to forward the X11 connection
(X11UseLocalhost defaults to yes). The following patch permits to consider
as non local any DISPLAY environment which port is greater or equal to 10
else mplayer tries a local optimization on a distant X server which doesn't
work.
patch by Denis.Ducamp@groar.org
author | arpi |
---|---|
date | Mon, 23 Sep 2002 21:17:30 +0000 |
parents | b3385775390d |
children |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> //int open(const char *pathname, int flags); #define BUFFSIZE (4*65536) #define NUM_BUFS (16) unsigned char *buffer[NUM_BUFS]; unsigned int buf_read=0; unsigned int buf_write=0; unsigned int buf_read_pos=0; unsigned int buf_write_pos=0; int full_buffers=0; int main(int argc,char* argv[]){ fd_set rfds; fd_set wfds; struct timeval tv; int retval; int i; // int empty=1; int can_read=1; int eof=0; int in_fd=0; // stdin if(argc>1) in_fd=open(argv[1],O_RDONLY|O_NDELAY); for(i=0;i<NUM_BUFS;i++) buffer[i]=malloc(BUFFSIZE); while(1){ /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); if(can_read){ FD_SET(in_fd, &rfds);} FD_ZERO(&wfds); FD_SET(1, &wfds); /* Wait up to five seconds. */ tv.tv_sec = 1; tv.tv_usec = 0; retval = select((in_fd<1?1:in_fd)+1, &rfds, &wfds, NULL, &tv); /* Don't rely on the value of tv now! */ if (retval){ if(FD_ISSET(in_fd, &rfds) || !full_buffers){ fprintf(stderr,"\n%d r",full_buffers);fflush(stderr); if(full_buffers==NUM_BUFS){ // buffer is full! can_read=0; fprintf(stderr,"\n%d full!\n",full_buffers);fflush(stderr); } else { // we can read input. int len=BUFFSIZE-buf_read_pos; fprintf(stderr,"R");fflush(stderr); len=read(in_fd,buffer[buf_read]+buf_read_pos,len); fprintf(stderr,"(%d)\n",len);fflush(stderr); if(len>0){ buf_read_pos+=len; if(buf_read_pos>=BUFFSIZE){ // block is full, find next! buf_read=(buf_read+1)%NUM_BUFS; ++full_buffers; buf_read_pos=0; fprintf(stderr,"+");fflush(stderr); } } else { eof=1; } } } if(FD_ISSET(1, &wfds)){ fprintf(stderr,"\n%d w",full_buffers);fflush(stderr); if(full_buffers==0){ if(eof){ // flush buffer! int pos=0; int len; fprintf(stderr,"\nf");fflush(stderr); while((len=buf_read_pos-pos)>0){ len=write(1,buffer[buf_write]+pos,len); fprintf(stderr,"(%d)",len);fflush(stderr); if(len<=0) break; pos+=len; } exit(1); } fprintf(stderr," empty");fflush(stderr); //empty=1; // we must fill buffers! } else { // yeah, we can read from the buffer! int len=BUFFSIZE-buf_write_pos; fprintf(stderr,"W");fflush(stderr); len=write(1,buffer[buf_write]+buf_write_pos,len); fprintf(stderr,"(%d)",len);fflush(stderr); if(len>0){ buf_write_pos+=len; if(buf_write_pos>=BUFFSIZE){ // block is empty, find next! buf_write=(buf_write+1)%NUM_BUFS; --full_buffers; buf_write_pos=0; fprintf(stderr,"-");fflush(stderr); can_read=1; } } } } } else { fprintf(stderr,".");fflush(stderr); } } return 0; }