summaryrefslogtreecommitdiffstats
path: root/libvncclient/vncviewer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvncclient/vncviewer.c')
-rw-r--r--libvncclient/vncviewer.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/libvncclient/vncviewer.c b/libvncclient/vncviewer.c
index 6a58e78..712f52e 100644
--- a/libvncclient/vncviewer.c
+++ b/libvncclient/vncviewer.c
@@ -34,7 +34,23 @@ static rfbBool DummyPoint(rfbClient* client, int x, int y) {
static void DummyRect(rfbClient* client, int x, int y, int w, int h) {
}
static char* NoPassword(rfbClient* client) {
- return "";
+ return strdup("");
+}
+#include <stdio.h>
+#include <termios.h>
+static char* ReadPassword(rfbClient* client) {
+ int i=8;
+ char* p=malloc(9);
+ struct termios save,noecho;
+ p[0]=0;
+ if(tcgetattr(fileno(stdin),&save)!=0) return p;
+ noecho=save; noecho.c_lflag &= ~ECHO;
+ if(tcsetattr(fileno(stdin),TCSAFLUSH,&noecho)!=0) return p;
+ fprintf(stderr,"Password: ");
+ getline(&p,&i,stdin);
+ if(i>0 && p[i-2]=='\n') p[i-2]=0;
+ tcsetattr(fileno(stdin),TCSAFLUSH,&save);
+ return p;
}
static rfbBool MallocFrameBuffer(rfbClient* client) {
if(client->frameBuffer)
@@ -107,7 +123,7 @@ rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,
client->SoftCursorLockArea = DummyRect;
client->SoftCursorUnlockScreen = Dummy;
client->GotFrameBufferUpdate = DummyRect;
- client->GetPassword = NoPassword;
+ client->GetPassword = ReadPassword;
client->MallocFrameBuffer = MallocFrameBuffer;
client->Bell = Dummy;
@@ -143,15 +159,22 @@ static rfbBool rfbInitConnection(rfbClient* client)
}
rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv) {
- int i;
+ int i,j;
if(client->programName==0)
client->programName=argv[0];
for (i = 1; i < *argc; i++) {
+ j = i;
if (strcmp(argv[i], "-listen") == 0) {
listenForIncomingConnections(client);
break;
+ } else if (strcmp(argv[i], "-play") == 0) {
+ client->serverPort = -1;
+ j++;
+ } else if (i+1<*argc && strcmp(argv[i], "-encodings") == 0) {
+ client->appData.encodingsString = argv[i+1];
+ j+=2;
} else {
char* colon=strchr(argv[i],':');
@@ -159,9 +182,15 @@ rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv) {
if(colon) {
*colon=0;
client->serverPort=atoi(colon+1);
- } else
- client->serverPort=0;
- client->serverPort+=5900;
+ }
+ if(client->serverPort>=0 && client->serverPort<5900)
+ client->serverPort+=5900;
+ }
+ /* purge arguments */
+ if (j>i) {
+ *argc-=j-i;
+ memmove(argv+i,argv+j,(*argc-i)*sizeof(char*));
+ i--;
}
}