Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
L
libvncserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
rasky
libvncserver
Commits
f6e87107
Commit
f6e87107
authored
Nov 11, 2003
by
dscho
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
-inetd, -noshm and friends added
parent
8b0d8da5
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
119 additions
and
10 deletions
+119
-10
ChangeLog
ChangeLog
+3
-0
x11vnc.c
contrib/x11vnc.c
+116
-10
No files found.
ChangeLog
View file @
f6e87107
2003-11-07 Karl Runge
* support "-inetd", "-noshm", "-flipbyteorder" in x11vnc
2003-10-26 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
* released Version 0.6
...
...
contrib/x11vnc.c
View file @
f6e87107
...
...
@@ -166,6 +166,7 @@ hint_t *hint_list;
int
shared
=
0
;
/* share vnc display. */
int
view_only
=
0
;
/* clients can only watch. */
int
inetd
=
0
;
/* spawned from inetd(1) */
int
connect_once
=
1
;
/* disconnect after first connection session. */
int
flash_cmap
=
0
;
/* follow installed colormaps */
...
...
@@ -175,6 +176,8 @@ int local_cursor = 1; /* whether the viewer draws a local cursor */
int
show_mouse
=
0
;
/* display a cursor for the real mouse */
int
show_root_cursor
=
0
;
/* show X when on root background */
int
using_shm
=
1
;
/* whether mit-shm is used */
int
flip_byte_order
=
0
;
/* sometimes needed when using_shm = 0 */
/*
* waitms is the msec to wait between screen polls. Not too old h/w shows
* poll times of 10-35ms, so maybe this value cuts the idle load by 2 or so.
...
...
@@ -337,8 +340,8 @@ enum rfbNewClientAction new_client(rfbClientPtr client) {
return
(
RFB_CLIENT_REFUSE
);
}
}
client
->
clientGoneHook
=
client_gone
;
}
client
->
clientGoneHook
=
client_gone
;
if
(
view_only
)
{
client
->
clientData
=
(
void
*
)
-
1
;
}
else
{
...
...
@@ -1107,6 +1110,20 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
screen
->
frameBuffer
=
fb
->
data
;
if
(
inetd
)
{
int
fd
=
dup
(
0
);
if
(
fd
<
3
)
{
rfbErr
(
"dup(0) = %d failed.
\n
"
,
fd
);
perror
(
"dup"
);
exit
(
1
);
}
fclose
(
stdin
);
fclose
(
stdout
);
/* we keep stderr for logging */
screen
->
inetdSock
=
fd
;
screen
->
rfbPort
=
0
;
}
/* XXX the following 3 settings are based on libvncserver defaults. */
if
(
screen
->
rfbPort
==
5900
)
{
screen
->
autoPort
=
TRUE
;
...
...
@@ -1194,6 +1211,45 @@ void shm_create(XShmSegmentInfo *shm, XImage **ximg_ptr, int w, int h,
X_LOCK
;
if
(
!
using_shm
)
{
/* we only need the XImage created */
xim
=
XCreateImage
(
dpy
,
visual
,
bpp
,
ZPixmap
,
0
,
NULL
,
w
,
h
,
BitmapPad
(
dpy
),
0
);
X_UNLOCK
;
if
(
xim
==
NULL
)
{
rfbErr
(
"XCreateImage(%s) failed.
\n
"
,
name
);
exit
(
1
);
}
xim
->
data
=
(
char
*
)
malloc
(
xim
->
bytes_per_line
*
xim
->
height
);
if
(
xim
->
data
==
NULL
)
{
rfbErr
(
"XCreateImage(%s) data malloc failed.
\n
"
,
name
);
exit
(
1
);
}
if
(
flip_byte_order
)
{
static
int
reported
=
0
;
char
*
bo
;
if
(
xim
->
byte_order
==
LSBFirst
)
{
bo
=
"MSBFirst"
;
xim
->
byte_order
=
MSBFirst
;
xim
->
bitmap_bit_order
=
MSBFirst
;
}
else
{
bo
=
"LSBFirst"
;
xim
->
byte_order
=
LSBFirst
;
xim
->
bitmap_bit_order
=
LSBFirst
;
}
if
(
!
reported
&&
!
quiet
)
{
fprintf
(
stderr
,
"changing XImage byte order"
" to %s
\n
"
,
bo
);
reported
=
1
;
}
}
*
ximg_ptr
=
xim
;
return
;
}
xim
=
XShmCreateImage
(
dpy
,
visual
,
bpp
,
ZPixmap
,
NULL
,
shm
,
w
,
h
);
if
(
xim
==
NULL
)
{
...
...
@@ -1203,6 +1259,7 @@ void shm_create(XShmSegmentInfo *shm, XImage **ximg_ptr, int w, int h,
*
ximg_ptr
=
xim
;
shm
->
shmid
=
shmget
(
IPC_PRIVATE
,
xim
->
bytes_per_line
*
xim
->
height
,
IPC_CREAT
|
0777
);
...
...
@@ -1231,11 +1288,17 @@ void shm_create(XShmSegmentInfo *shm, XImage **ximg_ptr, int w, int h,
}
void
shm_delete
(
XShmSegmentInfo
*
shm
)
{
if
(
!
using_shm
)
{
return
;
}
shmdt
(
shm
->
shmaddr
);
shmctl
(
shm
->
shmid
,
IPC_RMID
,
0
);
}
void
shm_clean
(
XShmSegmentInfo
*
shm
,
XImage
*
xim
)
{
if
(
!
using_shm
)
{
return
;
}
X_LOCK
;
XShmDetach
(
dpy
,
shm
);
XDestroyImage
(
xim
);
...
...
@@ -1460,12 +1523,12 @@ void copy_tile(int tx, int ty) {
n
=
tx
+
ty
*
ntiles_x
;
/* number of the tile */
X_LOCK
;
if
(
size_x
==
tile_x
&&
size_y
==
tile_y
)
{
if
(
using_shm
&&
size_x
==
tile_x
&&
size_y
==
tile_y
)
{
/* general case: */
XShmGetImage
(
dpy
,
window
,
tile
,
x
,
y
,
AllPlanes
);
}
else
{
/*
*
near bottom or
rhs edge case:
*
No shm or near bottom/
rhs edge case:
* (but only if tile size does not divide screen size)
*/
XGetSubImage
(
dpy
,
window
,
x
,
y
,
size_x
,
size_y
,
AllPlanes
,
...
...
@@ -1832,7 +1895,7 @@ int grow_islands() {
void
copy_screen
()
{
int
pixelsize
=
bpp
>>
3
;
char
*
rfb_fb
;
int
i
,
y
,
block_size
,
xi
;
int
i
,
y
,
block_size
;
block_size
=
(
dpy_x
*
(
dpy_y
/
fs_factor
)
*
pixelsize
);
...
...
@@ -1842,7 +1905,13 @@ void copy_screen() {
X_LOCK
;
for
(
i
=
0
;
i
<
fs_factor
;
i
++
)
{
xi
=
XShmGetImage
(
dpy
,
window
,
fullscreen
,
0
,
y
,
AllPlanes
);
if
(
using_shm
)
{
XShmGetImage
(
dpy
,
window
,
fullscreen
,
0
,
y
,
AllPlanes
);
}
else
{
XGetSubImage
(
dpy
,
window
,
0
,
y
,
fullscreen
->
width
,
fullscreen
->
height
,
AllPlanes
,
ZPixmap
,
fullscreen
,
0
,
0
);
}
memcpy
(
rfb_fb
,
fullscreen
->
data
,
(
size_t
)
block_size
);
y
+=
dpy_y
/
fs_factor
;
...
...
@@ -1963,7 +2032,13 @@ int scan_display(int ystart, int rescan) {
/* grab the horizontal scanline from the display: */
X_LOCK
;
if
(
using_shm
)
{
XShmGetImage
(
dpy
,
window
,
scanline
,
0
,
y
,
AllPlanes
);
}
else
{
XGetSubImage
(
dpy
,
window
,
0
,
y
,
scanline
->
width
,
scanline
->
height
,
AllPlanes
,
ZPixmap
,
scanline
,
0
,
0
);
}
X_UNLOCK
;
/* for better memory i/o try the whole line at once */
...
...
@@ -2215,6 +2290,12 @@ void print_help() {
"-shared VNC display is shared (default %s).
\n
"
"-many keep listening for more connections rather than exiting
\n
"
" as soon as the first clients disconnect.
\n
"
"-inetd launched by inetd(1): stdio instead of listening socket.
\n
"
"-noshm do not use the MIT-SHM extension for the polling.
\n
"
" remote displays can be polled this way: be careful
\n
"
" this can use large amounts of network bandwidth.
\n
"
"-flipbyteorder sometimes needed if remotely polled host has different
\n
"
" endianness. ignored unless -noshm is set.
\n
"
"
\n
"
"-q be quiet by printing less informational output.
\n
"
"-bg go into the background after screen setup.
\n
"
...
...
@@ -2321,6 +2402,7 @@ int main(int argc, char** argv) {
char
*
use_dpy
=
NULL
;
int
dt
=
0
;
int
bg
=
0
;
int
got_waitms
=
0
;
/* used to pass args we do not know about to rfbGetScreen(): */
int
argc2
=
1
;
char
*
argv2
[
100
];
...
...
@@ -2346,6 +2428,12 @@ int main(int argc, char** argv) {
shared
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-many"
))
{
connect_once
=
0
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-inetd"
))
{
inetd
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-noshm"
))
{
using_shm
=
0
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-flipbyteorder"
))
{
flip_byte_order
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-modtweak"
))
{
use_modifier_tweak
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-nomodtweak"
))
{
...
...
@@ -2365,6 +2453,7 @@ int main(int argc, char** argv) {
defer_update
=
atoi
(
argv
[
++
i
]);
}
else
if
(
!
strcmp
(
argv
[
i
],
"-wait"
))
{
waitms
=
atoi
(
argv
[
++
i
]);
got_waitms
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-nap"
))
{
take_naps
=
1
;
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
...
...
@@ -2415,10 +2504,22 @@ int main(int argc, char** argv) {
if
(
waitms
<
0
)
{
waitms
=
0
;
}
if
(
!
using_shm
&&
!
got_waitms
)
{
/* try to cut down on polling over network... */
waitms
*=
2
;
}
if
(
inetd
)
{
shared
=
0
;
connect_once
=
1
;
bg
=
0
;
}
if
(
!
quiet
)
{
fprintf
(
stderr
,
"viewonly: %d
\n
"
,
view_only
);
fprintf
(
stderr
,
"shared: %d
\n
"
,
shared
);
fprintf
(
stderr
,
"inetd: %d
\n
"
,
inetd
);
fprintf
(
stderr
,
"conn_once: %d
\n
"
,
connect_once
);
fprintf
(
stderr
,
"using_shm: %d
\n
"
,
using_shm
);
fprintf
(
stderr
,
"flipbyteo: %d
\n
"
,
flip_byte_order
);
fprintf
(
stderr
,
"mod_tweak: %d
\n
"
,
use_modifier_tweak
);
fprintf
(
stderr
,
"loc_curs: %d
\n
"
,
local_cursor
);
fprintf
(
stderr
,
"mouse: %d
\n
"
,
show_mouse
);
...
...
@@ -2460,10 +2561,15 @@ int main(int argc, char** argv) {
exit
(
1
);
}
if
(
!
XShmQueryExtension
(
dpy
))
{
fprintf
(
stderr
,
"Display does not support XShm extension"
" (must be local).
\n
"
);
if
(
!
using_shm
)
{
fprintf
(
stderr
,
"warning: display does not support "
"XShm.
\n
"
);
}
else
{
fprintf
(
stderr
,
"Display does not support XShm "
"extension (must be local).
\n
"
);
exit
(
1
);
}
}
/*
* Window managers will often grab the display during resize, etc.
...
...
@@ -2527,7 +2633,7 @@ int main(int argc, char** argv) {
initialize_tiles
();
initialize_shm
();
initialize_shm
();
/* also creates XImages when using_shm = 0 */
set_signals
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment