Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
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
dimbor
nx-libs
Commits
b214c73b
Commit
b214c73b
authored
Jun 23, 2016
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nxauth: Drop nxauth tool completely, xauth can be successfully used with nxagent / nxproxy instead.
parent
a3a29528
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
14 additions
and
3477 deletions
+14
-3477
Makefile
Makefile
+2
-5
README.source
debian/README.source
+1
-1
control
debian/control
+10
-34
nxauth.dirs
debian/nxauth.dirs
+0
-2
nxauth.install
debian/nxauth.install
+0
-3
rules
debian/rules
+0
-1
Imakefile
nx-X11/programs/Imakefile
+0
-4
CHANGELOG
nx-X11/programs/nxauth/CHANGELOG
+0
-108
COPYING
nx-X11/programs/nxauth/COPYING
+0
-339
Imakefile
nx-X11/programs/nxauth/Imakefile
+0
-38
LICENSE
nx-X11/programs/nxauth/LICENSE
+0
-26
gethost.c
nx-X11/programs/nxauth/gethost.c
+0
-287
nxauth.man
nx-X11/programs/nxauth/nxauth.man
+0
-236
parsedpy.c
nx-X11/programs/nxauth/parsedpy.c
+0
-259
process.c
nx-X11/programs/nxauth/process.c
+0
-1872
xauth.c
nx-X11/programs/nxauth/xauth.c
+0
-184
xauth.h
nx-X11/programs/nxauth/xauth.h
+0
-58
nx-libs.spec
nx-libs.spec
+0
-19
roll-tarballs.sh
roll-tarballs.sh
+1
-1
No files found.
Makefile
View file @
b214c73b
...
...
@@ -103,7 +103,7 @@ install-lite:
gzip
$(DESTDIR)$(PREFIX)/share/man/man1/*.1
install-full
:
for
f
in
nxagent
nxauth
;
do
\
for
f
in
nxagent
;
do
\
$(INSTALL_PROGRAM)
bin/
$$
f
$(DESTDIR)$(BINDIR)
;
done
for
d
in
nxcompext nxcompshad
;
do
\
$(MAKE)
-C
$$
d
install
;
done
...
...
@@ -115,13 +115,10 @@ install-full:
$(INSTALL_FILE)
nx-X11/programs/Xserver/Xext/SecurityPolicy
$(DESTDIR)$(PREFIX)/share/nx
$(INSTALL_DIR)
$(DESTDIR)$(NXLIBDIR)/bin
$(INSTALL_PROGRAM)
nx-X11/programs/nxauth/nxauth
$(DESTDIR)$(NXLIBDIR)/bin
$(INSTALL_PROGRAM)
nx-X11/programs/Xserver/nxagent
$(DESTDIR)$(NXLIBDIR)/bin
$(INSTALL_DIR)
$(DESTDIR)$(PREFIX)/share/man/man1/
$(INSTALL_FILE)
nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1
$(DESTDIR)$(PREFIX)/share/man/man1/
$(INSTALL_FILE)
nx-X11/programs/nxauth/nxauth.man
$(DESTDIR)$(PREFIX)/share/man/man1/
mv
-f
$(DESTDIR)$(PREFIX)/share/man/man1/nxauth.man
$(DESTDIR)$(PREFIX)/share/man/man1/nxauth.1
gzip
$(DESTDIR)$(PREFIX)/share/man/man1/*.1
# create a clean nx-X11/.build-exports space
...
...
@@ -180,7 +177,7 @@ uninstall-lite:
$(RM_DIR)
$(DESTDIR)$(NXLIBDIR)/share/nx/
uninstall-full
:
for
f
in
nxagent
nxauth
;
do
\
for
f
in
nxagent
;
do
\
$(RM_FILE)
$(DESTDIR)$(BINDIR)
/
$$
f
;
done
$(RM_FILE)
$(DESTDIR)$(PREFIX)/share/nx/VERSION.nxagent
...
...
debian/README.source
View file @
b214c73b
...
...
@@ -10,7 +10,7 @@ This package originally pulled in 7 source tarballs from NoMachine:
nx-X11
nxagent
nxauth
nxauth
(discontinued in nx-libs)
nxcomp
nxcompshad
nxcompext
...
...
debian/control
View file @
b214c73b
...
...
@@ -430,6 +430,10 @@ Depends:
Recommends:
xfonts-base,
xkb-data,
Breaks:
nxauth,
Replaces:
nxauth,
Description: NX agent
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
...
...
@@ -473,12 +477,16 @@ Description: NX agent (debug package)
Package: nxproxy
Architecture: any
Breaks: qvd-nxproxy
Replaces: qvd-nxproxy
Multi-Arch: foreign
Depends:
${shlibs:Depends},
${misc:Depends},
Breaks:
qvd-nxproxy,
nxauth,
Replaces:
qvd-nxproxy,
nxauth,
Description: NX proxy
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
...
...
@@ -507,38 +515,6 @@ Description: NX proxy (debug package)
helpful backtraces. You can safely remove it if you do not intend to
debug NX packages on this system.
Package: nxauth
Architecture: any
Multi-Arch: foreign
Depends:
${shlibs:Depends},
${misc:Depends},
Description: NX xauth
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
using X applications over a network, especially a slow one.
.
This package provides the NX xauth binary.
Package: nxauth-dbg
Section: debug
Architecture: any
Multi-Arch: foreign
Depends:
nxauth (= ${binary:Version}),
${misc:Depends},
Breaks: nx-x11-dbg (<< 2:3.5.0.29-1~),
Description: NX auth (debug package)
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
using X applications over a network, especially a slow one.
.
This package provides the NX auth binary.
.
This package contains detached debug symbols that help generating more
helpful backtraces. You can safely remove it if you do not intend to
debug NX packages on this system.
Package: libxcomp3
Architecture: any
Multi-Arch: same
...
...
debian/nxauth.dirs
deleted
100644 → 0
View file @
a3a29528
usr/bin
usr/lib/nx/bin
debian/nxauth.install
deleted
100644 → 0
View file @
a3a29528
usr
/
lib
/
nx
/
bin
/
nxauth
usr
/
bin
/
nxauth
usr
/
share
/
man
/
man1
/
nxauth
.
1
*
debian/rules
View file @
b214c73b
...
...
@@ -63,5 +63,4 @@ override_dh_strip:
dh_strip -plibxcompext3 --dbg-package=libxcompext3-dbg
dh_strip -pnxagent --dbg-package=nxagent-dbg
dh_strip -pnxproxy --dbg-package=nxproxy-dbg
dh_strip -pnxauth --dbg-package=nxauth-dbg
nx-X11/programs/Imakefile
View file @
b214c73b
...
...
@@ -22,11 +22,7 @@
XSSRCDIR = Xserver
#endif
#if defined(NXEmbeddedXServer)
SUBDIRS = $(XSSRCDIR)
#else
SUBDIRS = $(XSSRCDIR) nxauth
#endif
MakeSubdirs($(SUBDIRS))
DependSubdirs($(SUBDIRS))
nx-X11/programs/nxauth/CHANGELOG
deleted
100644 → 0
View file @
a3a29528
ChangeLog:
nxauth-3.5.0-1
- Opened the 3.5.0 branch based on nxauth-3.4.0-3.
- Updated copyright to year 2011.
nxauth-3.4.0-3
- Updated the launchd socket detection to support OSX versions relea-
sed so far.
nxauth-3.4.0-2
- Updated copyright to year 2010.
nxauth-3.4.0-1
- Opened the 3.4.0 branch based on nxauth-3.3.0-1.
- Updated copyright to year 2009.
nxauth-3.3.0-1
- Opened the 3.3.0 branch based on nxauth-3.2.0-1.
nxauth-3.2.0-1
- Opened the 3.2.0 branch based on nxauth-3.1.0-2.
nxauth-3.1.0-2
- Added support for launchd socket.
nxauth-3.1.0-1
- Opened the 3.1.0 branch based on nxauth-3.0.0-6.
nxauth-3.0.0-6
- Updated the NoMachine copyright notice.
nxauth-3.0.0-5
- Changed the copyright attribution from Medialogic to NoMachine.
nxauth-3.0.0-4
- Changed the LICENSE file to state that the software is only made
available under the version 2 of the GPL.
- Added file COPYING.
nxauth-3.0.0-3
- Updated copyright notices to year 2007.
nxauth-3.0.0-2
- Imported changes up to nxauth-2.1.0-1.
- Ignoring lock on '.Xauthority' file.
- Using '__CYGWIN__' definition in process.c. 'WIN32' is not defined
during compilation under nx-X11 and wrong code block is used to
rename xauth temporary file.
nxauth-3.0.0-1
- Opened the 3.0.0 branch based on nxauth-2.0.0-2.
nxauth-2.0.0-2
- Updated the NoMachine copyright notices.
nxauth-2.0.0-1
- Opened the 2.0.0 branch based on the 1.6.0-1.
nxauth-1.6.0-1
- Opened the 1.6.0 branch based on nxauth-1.5.0-1.
nxauth-1.5.0-1
- Opened the 1.5.0 branch.
nxauth-1.4.1-1
- Opened the 1.4.1 branch.
nxauth-1.4.0-2
- Removed debug message 'host name is'.
nxauth-1.4.0-1
- Opened the 1.4.0 branch based on nxauth-1.3.2-1.
nxauth-1.3.2-1
- Opened the 1.3.2 branch.
nxauth-1.3.1-2
- Fixed problem with compilation on systems without
X11 includes instaled.
nx-X11/programs/nxauth/COPYING
deleted
100644 → 0
View file @
a3a29528
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
nx-X11/programs/nxauth/Imakefile
deleted
100644 → 0
View file @
a3a29528
XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:54:11 cpqbld Exp $
XCOMM $XFree86: xc/programs/xauth/Imakefile,v 3.5 2001/03/30 02:15:23 keithp Exp $
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2010 NoMachine, http://www.nomachine.com/. */
/* */
/* NXAUTH, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
/* LOCAL_LIBRARIES = $(DESTDIR)$(SHLIBDIR)/libXau.a */
INCLUDES=-I../../lib
DEPLIBS = $(DEPXAUTHLIB)
LOCAL_LIBRARIES = $(XAUTHLIB)
SRCS = xauth.c gethost.c process.c parsedpy.c
OBJS = xauth.o gethost.o process.o parsedpy.o
CONN_DEFINES = $(CONNECTION_FLAGS)
ComplexProgramTarget(nxauth)
SpecialCObjectRule(gethost,$(ICONFIGFILES),$(CONN_DEFINES) $(SIGNAL_DEFINES))
SpecialCObjectRule(process,$(ICONFIGFILES),$(SIGNAL_DEFINES))
SpecialCObjectRule(parsedpy,$(ICONFIGFILES),$(CONN_DEFINES))
nx-X11/programs/nxauth/LICENSE
deleted
100644 → 0
View file @
a3a29528
Copyright (c) 2001, 2010 NoMachine - http://www.nomachine.com/.
NXAUTH and NX extensions to X are copyright of NoMachine.
Redistribution and use of this software is allowed according to the
following terms:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License Version 2, and
not any other version, as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTA-
BILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, you can request a copy to NoMachine
or write to the Free Software Foundation, Inc., 59 Temple Place,
Suite 330, Boston, MA 02111-1307 USA
Parts of this software are derived from XFree86 project. Other copy-
rights and the MIT/X11 license applies to different sources. Please
check the applicable copyrights in each file or subdirectory.
All rights reserved.
nx-X11/programs/nxauth/gethost.c
deleted
100644 → 0
View file @
a3a29528
/*
* $Xorg: gethost.c,v 1.5 2001/02/09 02:05:38 xorgcvs Exp $
*
*
Copyright 1989, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
* *
* Author: Jim Fulton, MIT X Consortium
*/
/* $XFree86: xc/programs/xauth/gethost.c,v 3.16 2001/12/14 20:01:14 dawes Exp $ */
/* sorry, streams support does not really work yet */
#if defined(STREAMSCONN) && defined(SVR4)
#undef STREAMSCONN
#define TCPCONN
#endif
#ifdef WIN32
#include <nx-X11/Xwinsock.h>
#define EPROTOTYPE WSAEPROTOTYPE
#endif
#include <nx-X11/X.h>
#include <signal.h>
#include <setjmp.h>
#include <ctype.h>
#ifndef __TYPES__
#include <sys/types.h>
#define __TYPES__
#endif
#ifndef WIN32
#ifndef STREAMSCONN
#ifndef Lynx
#include <sys/socket.h>
#else
#include <socket.h>
#endif
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#ifdef SYSV
#ifdef i386
#ifndef sco
#include <net/errno.h>
#endif
/* !sco */
#endif
/* i386 */
#endif
/* SYSV */
#endif
/* !STREAMSCONN */
#endif
/* !WIN32 */
#include <errno.h>
#include "xauth.h"
#ifdef DNETCONN
#include <netdnet/dn.h>
#include <netdnet/dnetdb.h>
#endif
#ifdef SIGALRM
Bool
nameserver_timedout
=
False
;
/*
* get_hostname - Given an internet address, return a name (CHARON.MIT.EDU)
* or a string representing the address (18.58.0.13) if the name cannot
* be found. Stolen from xhost.
*/
static
jmp_buf
env
;
static
#ifdef SIGNALRETURNSINT
int
#else
void
#endif
nameserver_lost
(
int
sig
)
{
nameserver_timedout
=
True
;
longjmp
(
env
,
-
1
);
/* NOTREACHED */
#ifdef SIGNALRETURNSINT
return
-
1
;
/* for picky compilers */
#endif
}
#endif
char
*
get_hostname
(
auth
)
Xauth
*
auth
;
{
static
struct
hostent
*
hp
=
NULL
;
#ifdef DNETCONN
struct
nodeent
*
np
;
static
char
nodeaddr
[
4
+
2
*
DN_MAXADDL
];
#endif
/* DNETCONN */
if
(
auth
->
address_length
==
0
)
return
"Illegal Address"
;
#ifdef TCPCONN
if
(
auth
->
family
==
FamilyInternet
)
{
#ifdef SIGALRM
/* gethostbyaddr can take a LONG time if the host does not exist.
Assume that if it does not respond in NAMESERVER_TIMEOUT seconds
that something is wrong and do not make the user wait.
gethostbyaddr will continue after a signal, so we have to
jump out of it.
*/
nameserver_timedout
=
False
;
signal
(
SIGALRM
,
nameserver_lost
);
alarm
(
4
);
if
(
setjmp
(
env
)
==
0
)
{
#endif
hp
=
gethostbyaddr
(
auth
->
address
,
auth
->
address_length
,
AF_INET
);
#ifdef SIGALRM
}
alarm
(
0
);
#endif
if
(
hp
)
return
(
hp
->
h_name
);
else
return
(
inet_ntoa
(
*
((
struct
in_addr
*
)(
auth
->
address
))));
}
#endif
#ifdef DNETCONN
if
(
auth
->
family
==
FamilyDECnet
)
{
struct
dn_naddr
*
addr_ptr
=
(
struct
dn_naddr
*
)
auth
->
address
;
if
(
np
=
getnodebyaddr
(
addr_ptr
->
a_addr
,
addr_ptr
->
a_len
,
AF_DECnet
))
{
sprintf
(
nodeaddr
,
"%s:"
,
np
->
n_name
);
}
else
{
sprintf
(
nodeaddr
,
"%s:"
,
dnet_htoa
(
auth
->
address
));
}
return
(
nodeaddr
);
}
#endif
return
(
NULL
);
}
#ifdef TCPCONN
/*
* cribbed from lib/X/XConnDis.c
*/
static
Bool
get_inet_address
(
char
*
name
,
unsigned
int
*
resultp
)
{
unsigned
int
hostinetaddr
=
inet_addr
(
name
);
struct
hostent
*
host_ptr
;
struct
sockaddr_in
inaddr
;
/* dummy variable for size calcs */
#ifndef INADDR_NONE
#define INADDR_NONE -1
#endif
if
(
hostinetaddr
==
INADDR_NONE
)
{
if
((
host_ptr
=
gethostbyname
(
name
))
==
NULL
)
{
/* No such host! */
errno
=
EINVAL
;
return
False
;
}
/* Check the address type for an internet host. */
if
(
host_ptr
->
h_addrtype
!=
AF_INET
)
{
/* Not an Internet host! */
errno
=
EPROTOTYPE
;
return
False
;
}
memmove
(
(
char
*
)
&
hostinetaddr
,
(
char
*
)
host_ptr
->
h_addr
,
sizeof
(
inaddr
.
sin_addr
));
}
*
resultp
=
hostinetaddr
;
return
True
;
}
#endif
#ifdef DNETCONN
static
Bool
get_dnet_address
(
name
,
resultp
)
char
*
name
;
struct
dn_naddr
*
resultp
;
{
struct
dn_naddr
*
dnaddrp
,
dnaddr
;
struct
nodeent
*
np
;
if
(
dnaddrp
=
dnet_addr
(
name
))
{
/* stolen from xhost */
dnaddr
=
*
dnaddrp
;
}
else
{
if
((
np
=
getnodebyname
(
name
))
==
NULL
)
return
False
;
dnaddr
.
a_len
=
np
->
n_length
;
memmove
(
dnaddr
.
a_addr
,
np
->
n_addr
,
np
->
n_length
);
}
*
resultp
=
dnaddr
;
return
True
;
}
#endif
char
*
get_address_info
(
family
,
fulldpyname
,
prefix
,
host
,
lenp
)
int
family
;
char
*
fulldpyname
;
int
prefix
;
char
*
host
;
int
*
lenp
;
{
char
*
retval
=
NULL
;
int
len
=
0
;
char
*
src
=
NULL
;
#ifdef TCPCONN
unsigned
int
hostinetaddr
;
#endif
#ifdef DNETCONN
struct
dn_naddr
dnaddr
;
#endif
char
buf
[
255
];
/*
* based on the family, set the pointer src to the start of the address
* information to be copied and set len to the number of bytes.
*/
switch
(
family
)
{
case
FamilyLocal
:
/* hostname/unix:0 */
/* handle unix:0 and :0 specially */
if
(
prefix
==
0
&&
(
strncmp
(
fulldpyname
,
"unix:"
,
5
)
==
0
||
fulldpyname
[
0
]
==
':'
))
{
if
(
!
get_local_hostname
(
buf
,
sizeof
buf
))
{
len
=
0
;
}
else
{
src
=
buf
;
len
=
strlen
(
buf
);
}
}
else
{
src
=
fulldpyname
;
len
=
prefix
;
}
break
;
case
FamilyInternet
:
/* host:0 */
#ifdef TCPCONN
if
(
!
get_inet_address
(
host
,
&
hostinetaddr
))
return
NULL
;
src
=
(
char
*
)
&
hostinetaddr
;
len
=
4
;
/* sizeof inaddr.sin_addr, would fail on Cray */
break
;
#else
return
NULL
;
#endif
case
FamilyDECnet
:
/* host::0 */
#ifdef DNETCONN
if
(
!
get_dnet_address
(
host
,
&
dnaddr
))
return
NULL
;
src
=
(
char
*
)
&
dnaddr
;
len
=
(
sizeof
dnaddr
);
break
;
#else
/* fall through since we don't have code for it */
#endif
default
:
src
=
NULL
;
len
=
0
;
}
/*
* if source was provided, allocate space and copy it
*/
if
(
len
==
0
||
!
src
)
return
NULL
;
retval
=
malloc
(
len
);
if
(
retval
)
{
memmove
(
retval
,
src
,
len
);
*
lenp
=
len
;
}
return
retval
;
}
nx-X11/programs/nxauth/nxauth.man
deleted
100644 → 0
View file @
a3a29528
.\" $Xorg: xauth.man,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
.\" Copyright 1993, 1998 The Open Group
.\"
.\" Permission to use, copy, modify, distribute, and sell this software and its
.\" documentation for any purpose is hereby granted without fee, provided that
.\" the above copyright notice appear in all copies and that both that
.\" copyright notice and this permission notice appear in supporting
.\" documentation.
.\"
.\" The above copyright notice and this permission notice shall be included
.\" in all copies or substantial portions of the Software.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
.\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
.\" OTHER DEALINGS IN THE SOFTWARE.
.\"
.\" Except as contained in this notice, the name of The Open Group shall
.\" not be used in advertising or otherwise to promote the sale, use or
.\" other dealings in this Software without prior written authorization
.\" from The Open Group.
.\"
.\" $XFree86: xc/programs/xauth/xauth.man,v 1.7 2001/12/14 20:01:15 dawes Exp $
.\"
.TH XAUTH 1 __xorgversion__
.SH NAME
nxauth \- NoMachine X authority file utility
.SH SYNOPSIS
.B nxauth
[ \fB\-f\fP \fIauthfile\fP ] [ \fB\-vqib\fP ] [ \fIcommand arg ...\fP ]
.SH DESCRIPTION
.PP
The \fInxauth\fP program is used to edit and display the authorization
information used in connecting to the X server. This program is usually
used to extract authorization records from one machine and merge them in on
another (as is the case when using remote logins or granting access to
other users). Commands (described below) may be entered interactively,
on the \fInxauth\fP command line, or in scripts. Note that this program
does \fBnot\fP contact the X server except when the generate command is used.
Normally \fInxauth\fP is not used to create the authority file entry in
the first place; \fIxdm\fP does that.
.SH OPTIONS
The following options may be used with \fInxauth\fP. They may be given
individually (e.g., \fI\-q \-i\|\fP) or may combined (e.g., \fI\-qi\|\fP).
.TP 8
.B "\-f \fIauthfile\fP"
This option specifies the name of the authority file to use. By default,
\fInxauth\fP will use the file specified by the nxauthORITY environment variable
or \fI\.Xauthority\fP in the user's home directory.
.TP 8
.B \-q
This option indicates that \fInxauth\fP should operate quietly and not print
unsolicited status messages. This is the default if an \fInxauth\fP command is
is given on the command line or if the standard output is not directed to a
terminal.
.TP 8
.B \-v
This option indicates that \fInxauth\fP should operate verbosely and print
status messages indicating the results of various operations (e.g., how many
records have been read in or written out). This is the default if \fInxauth\fP
is reading commands from its standard input and its standard output is
directed to a terminal.
.TP 8
.B \-i
This option indicates that \fInxauth\fP should ignore any authority file
locks. Normally, \fInxauth\fP will refuse to read or edit any authority files
that have been locked by other programs (usually \fIxdm\fP or another
\fInxauth\fP).
.TP 8
.B \-b
This option indicates that \fInxauth\fP should attempt to break any authority
file locks before proceeding. Use this option only to clean up stale locks.
.SH COMMANDS
The following commands may be used to manipulate authority files:
.TP 8
.B "add \fIdisplayname protocolname hexkey"
An authorization entry for the indicated display using the given protocol
and key data is added to the authorization file. The data is specified as
an even-lengthed string of hexadecimal digits, each pair representing
one octet. The first digit of each pair gives the most significant 4 bits
of the octet, and the second digit of the pair gives the least significant 4
bits. For example, a 32 character hexkey would represent a 128-bit value.
A protocol name consisting of just a
single period is treated as an abbreviation for \fIMIT-MAGIC-COOKIE-1\fP.
.TP 8
.B "generate \fIdisplayname protocolname\fP \fR[\fPtrusted|untrusted\fR]\fP"
.B \fR[\fPtimeout \fIseconds\fP\fR]\fP \fR[\fPgroup \fIgroup-id\fP\fR]\fP \fR[\fBdata \fIhexdata\fR]
This command is similar to add. The main difference is that instead
of requiring the user to supply the key data, it connects to the
server specified in \fIdisplayname\fP and uses the SECURITY extension
in order to get the key data to store in the authorization file. If
the server cannot be contacted or if it does not support the SECURITY
extension, the command fails. Otherwise, an authorization entry for
the indicated display using the given protocol is added to the
authorization file. A protocol name consisting of just a single
period is treated as an abbreviation for \fIMIT-MAGIC-COOKIE-1\fP.
If the \fBtrusted\fP option is used, clients that connect using this
authorization will have full run of the display, as usual. If
\fBuntrusted\fP is used, clients that connect using this authorization
will be considered untrusted and prevented from stealing or tampering
with data belonging to trusted clients. See the SECURITY extension
specification for full details on the restrictions imposed on
untrusted clients. The default is \fBuntrusted\fP.
The \fBtimeout\fP option specifies how long in seconds this
authorization will be valid. If the authorization remains unused (no
clients are connected with it) for longer than this time period, the
server purges the authorization, and future attempts to connect using
it will fail. Note that the purging done by the server does \fBnot\fP
delete the authorization entry from the authorization file. The
default timeout is 60 seconds.
The \fBgroup\fP option specifies the application group that clients
connecting with this authorization should belong to. See the
application group extension specification for more details. The
default is to not belong to an application group.
The \fBdata\fP option specifies data that the server should use to
generate the authorization. Note that this is \fBnot\fP the same data
that gets written to the authorization file. The interpretation of
this data depends on the authorization protocol. The \fIhexdata\fP is
in the same format as the \fIhexkey\fP described in the add command.
The default is to send no data.
.TP 8
.B "[n]extract \fIfilename displayname..."
Authorization entries for each of the specified displays are written to the
indicated file. If the \fInextract\fP command is used, the entries are written
in a numeric format suitable for non-binary transmission (such as secure
electronic mail). The extracted entries can be read back in using the
\fImerge\fP and \fInmerge\fP commands. If the filename consists of
just a single dash, the entries will be written to the standard output.
.TP 8
.B "[n]list \fR[\fIdisplayname\fP...]"
Authorization entries for each of the specified displays (or all if no
displays are named) are printed on the standard output. If the \fInlist\fP
command is used, entries will be shown in the numeric format used by
the \fInextract\fP command; otherwise, they are shown in a textual format.
Key data is always displayed in the hexadecimal format given in the
description of the \fIadd\fP command.
.TP 8
.B "[n]merge \fR[\fIfilename\fP...]"
Authorization entries are read from the specified files and are merged into
the authorization database, superceding any matching existing entries. If
the \fInmerge\fP command is used, the numeric format given in the description
of the \fIextract\fP command is used. If a filename consists of just a single
dash, the standard input will be read if it hasn't been read before.
.TP 8
.B "remove \fIdisplayname\fR..."
Authorization entries matching the specified displays are removed from the
authority file.
.TP 8
.B "source \fIfilename"
The specified file is treated as a script containing \fInxauth\fP commands
to execute. Blank lines and lines beginning with a sharp sign (#) are
ignored. A single dash may be used to indicate the standard input, if it
hasn't already been read.
.TP 8
.B "info"
Information describing the authorization file, whether or not any changes
have been made, and from where \fInxauth\fP commands are being read
is printed on the standard output.
.TP 8
.B "exit"
If any modifications have been made, the authority file is written out (if
allowed), and the program exits. An end of file is treated as an implicit
\fIexit\fP command.
.TP 8
.B "quit"
The program exits, ignoring any modifications. This may also be accomplished
by pressing the interrupt character.
.TP 8
.B "help [\fIstring\fP]"
A description of all commands that begin with the given string (or all
commands if no string is given) is printed on the standard output.
.TP 8
.B "?"
A short list of the valid commands is printed on the standard output.
.SH "DISPLAY NAMES"
Display names for the \fIadd\fP, \fI[n]extract\fP, \fI[n]list\fP,
\fI[n]merge\fP, and \fIremove\fP commands use the same format as the
DISPLAY environment variable and the common \fI\-display\fP command line
argument. Display-specific information (such as the screen number)
is unnecessary and will be ignored.
Same-machine connections (such as local-host sockets,
shared memory, and the Internet Protocol hostname \fIlocalhost\fP) are
referred to as \fIhostname\fP/unix:\fIdisplaynumber\fP so that
local entries for different machines may be stored in one authority file.
.SH EXAMPLE
.PP
The most common use for \fInxauth\fP is to extract the entry for the
current display, copy it to another machine, and merge it into the
user's authority file on the remote machine:
.sp
.nf
% nxauth extract \- $DISPLAY | rsh otherhost nxauth merge \-
.fi
.PP
.sp
The following command contacts the server :0 to create an
authorization using the MIT-MAGIC-COOKIE-1 protocol. Clients that
connect with this authorization will be untrusted.
.nf
% nxauth generate :0 .
.fi
.SH ENVIRONMENT
This \fInxauth\fP program uses the following environment variables:
.TP 8
.B XAUTHORITY
to get the name of the authority file to use if the \fI\-f\fP option isn't
used.
.TP 8
.B HOME
to get the user's home directory if XAUTHORITY isn't defined.
.SH FILES
.TP 8
.I $HOME/.Xauthority
default authority file if XAUTHORITY isn't defined.
.SH BUGS
.PP
Users that have unsecure networks should take care to use encrypted
file transfer mechanisms to copy authorization entries between machines.
Similarly, the \fIMIT-MAGIC-COOKIE-1\fP protocol is not very useful in
unsecure environments. Sites that are interested in additional security
may need to use encrypted authorization mechanisms such as Kerberos.
.PP
Spaces are currently not allowed in the protocol name. Quoting could be
added for the truly perverse.
.SH AUTHOR
Jim Fulton, MIT X Consortium
nx-X11/programs/nxauth/parsedpy.c
deleted
100644 → 0
View file @
a3a29528
/*
* $Xorg: parsedpy.c,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
*
* parse_displayname - utility routine for splitting up display name strings
*
*
Copyright 1989, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
* *
* Author: Jim Fulton, MIT X Consortium
*/
/* $XFree86: xc/programs/xauth/parsedpy.c,v 3.6 2001/12/14 20:01:15 dawes Exp $ */
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2010 NoMachine, http://www.nomachine.com/. */
/* */
/* NXAUTH, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include <stdio.h>
/* for NULL */
#include <ctype.h>
/* for isascii() and isdigit() */
#include <nx-X11/Xos.h>
/* for strchr() and string routines */
#include <nx-X11/Xlib.h>
/* for Family contants */
#ifdef hpux
#include <sys/utsname.h>
/* for struct utsname */
#endif
#include <nx-X11/Xauth.h>
/* for FamilyLocal */
#if defined(UNIXCONN) || defined(LOCALCONN)
#define UNIX_CONNECTION "unix"
#define UNIX_CONNECTION_LENGTH 4
#endif
#include <stdlib.h>
#include "xauth.h"
#define PANIC
#define WARNING
#undef TEST
#undef DEBUG
/*
* private utility routines
*/
char
*
copystring
(
char
*
src
,
int
len
)
{
char
*
cp
;
if
(
!
src
&&
len
!=
0
)
return
NULL
;
cp
=
malloc
(
len
+
1
);
if
(
cp
)
{
if
(
src
)
strncpy
(
cp
,
src
,
len
);
cp
[
len
]
=
'\0'
;
}
return
cp
;
}
char
*
get_local_hostname
(
char
*
buf
,
int
maxlen
)
{
buf
[
0
]
=
'\0'
;
/*
(void) XmuGetHostname (buf, maxlen);
*/
/*FIXME*/
(
void
)
gethostname
(
buf
,
maxlen
);
buf
[
maxlen
-
1
]
=
'\0'
;
#ifdef TEST
printf
(
"get_local_hostname: Host name is %s"
,
buf
);
#endif
return
(
buf
[
0
]
?
buf
:
NULL
);
}
#ifndef UNIXCONN
static
char
*
copyhostname
(
void
)
{
char
buf
[
256
];
return
(
get_local_hostname
(
buf
,
sizeof
buf
)
?
copystring
(
buf
,
strlen
(
buf
))
:
NULL
);
}
#endif
/*
* parse_displayname - display a display string up into its component parts
*/
Bool
parse_displayname
(
char
*
displayname
,
int
*
familyp
,
/* return */
char
**
hostp
,
/* return */
int
*
dpynump
,
/* return */
int
*
scrnump
,
/* return */
char
**
restp
)
/* return */
{
char
*
ptr
;
/* work variables */
int
len
;
/* work variable */
int
family
=
-
1
;
/* value to be returned */
char
*
host
=
NULL
;
/* must free if set and error return */
int
dpynum
=
-
1
;
/* value to be returned */
int
scrnum
=
0
;
/* value to be returned */
char
*
rest
=
NULL
;
/* must free if set and error return */
Bool
dnet
=
False
;
/* if true then using DECnet */
/* check the name */
if
(
!
displayname
||
!
displayname
[
0
])
return
False
;
/* must have at least :number */
ptr
=
strchr
(
displayname
,
':'
);
if
(
!
ptr
||
!
ptr
[
1
])
return
False
;
if
(
ptr
[
1
]
==
':'
)
{
if
(
ptr
[
2
]
==
'\0'
)
return
False
;
dnet
=
True
;
}
/*
* get the host string; if none is given, use the most effiecient path
*/
len
=
(
ptr
-
displayname
);
/* length of host name */
if
(
len
==
0
)
{
/* choose most efficient path */
#if defined(UNIXCONN) || defined(LOCALCONN)
host
=
copystring
(
UNIX_CONNECTION
,
UNIX_CONNECTION_LENGTH
);
family
=
FamilyLocal
;
#else
if
(
dnet
)
{
host
=
copystring
(
"0"
,
1
);
family
=
FamilyDECnet
;
}
else
{
host
=
copyhostname
();
family
=
FamilyInternet
;
}
#endif
}
else
{
host
=
copystring
(
displayname
,
len
);
if
(
dnet
)
{
family
=
dnet
;
}
else
{
#if defined(UNIXCONN) || defined(LOCALCONN)
if
(
host
&&
strcmp
(
host
,
UNIX_CONNECTION
)
==
0
)
family
=
FamilyLocal
;
else
#endif
family
=
FamilyInternet
;
}
}
if
(
!
host
)
return
False
;
/*
* get the display number; we know that there is something after the
* colon (or colons) from above. note that host is now set and must
* be freed if there is an error.
*/
if
(
dnet
)
ptr
++
;
/* skip the extra DECnet colon */
ptr
++
;
/* move to start of display num */
{
register
char
*
cp
;
for
(
cp
=
ptr
;
*
cp
&&
isascii
(
*
cp
)
&&
isdigit
(
*
cp
);
cp
++
)
;
len
=
(
cp
-
ptr
);
/* check present and valid follow */
if
(
len
==
0
||
(
*
cp
&&
*
cp
!=
'.'
))
{
free
(
host
);
return
False
;
}
dpynum
=
atoi
(
ptr
);
/* it will handle num. as well */
ptr
=
cp
;
}
/*
* now get screen number if given; ptr may point to nul at this point
*/
if
(
ptr
[
0
]
==
'.'
)
{
register
char
*
cp
;
ptr
++
;
for
(
cp
=
ptr
;
*
cp
&&
isascii
(
*
cp
)
&&
isdigit
(
*
cp
);
cp
++
)
;
len
=
(
cp
-
ptr
);
if
(
len
==
0
||
(
*
cp
&&
*
cp
!=
'.'
))
{
/* all prop name */
free
(
host
);
return
False
;
}
scrnum
=
atoi
(
ptr
);
/* it will handle num. as well */
ptr
=
cp
;
}
/*
* and finally, get any additional stuff that might be following the
* the screen number; ptr must point to a period if there is anything
*/
if
(
ptr
[
0
]
==
'.'
)
{
ptr
++
;
len
=
strlen
(
ptr
);
if
(
len
>
0
)
{
rest
=
copystring
(
ptr
,
len
);
if
(
!
rest
)
{
free
(
host
);
return
False
;
}
}
}
/*
* and we are done!
*/
*
familyp
=
family
;
*
hostp
=
host
;
*
dpynump
=
dpynum
;
*
scrnump
=
scrnum
;
*
restp
=
rest
;
return
True
;
}
nx-X11/programs/nxauth/process.c
deleted
100644 → 0
View file @
a3a29528
/* $Xorg: process.c,v 1.6 2001/02/09 02:05:38 xorgcvs Exp $ */
/*
Copyright 1989, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from The Open Group.
*/
/* $XFree86: xc/programs/xauth/process.c,v 3.18 2003/02/13 02:50:22 dawes Exp $ */
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2010 NoMachine, http://www.nomachine.com/. */
/* */
/* NXAUTH, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
/*
* Author: Jim Fulton, MIT X Consortium
*/
#include "xauth.h"
#include <ctype.h>
#include <errno.h>
#include <sys/stat.h>
#include <signal.h>
/*#include <nx-X11/X.h>*/
/* for Family constants */
/*
#include <nx-X11/Xlib.h>
#include <nx-X11/extensions/security.h>
*/
/*FIXME*/
#define FamilyInternet 0
#define FamilyDECnet 1
extern
Bool
naneserver_timedout
;
#ifndef DEFAULT_PROTOCOL_ABBREV
/* to make add command easier */
#define DEFAULT_PROTOCOL_ABBREV "."
#endif
#ifndef DEFAULT_PROTOCOL
/* for protocol abbreviation */
#define DEFAULT_PROTOCOL "MIT-MAGIC-COOKIE-1"
#endif
#define SECURERPC "SUN-DES-1"
#define K5AUTH "MIT-KERBEROS-5"
#define XAUTH_DEFAULT_RETRIES 10
/* number of competitors we expect */
#define XAUTH_DEFAULT_TIMEOUT 2
/* in seconds, be quick */
#define XAUTH_DEFAULT_DEADTIME 600L
/* 10 minutes in seconds */
typedef
struct
_AuthList
{
/* linked list of entries */
struct
_AuthList
*
next
;
Xauth
*
auth
;
}
AuthList
;
typedef
int
(
*
ProcessFunc
)(
char
*
,
int
,
int
,
char
**
);
#define add_to_list(h,t,e) {if (t) (t)->next = (e); else (h) = (e); (t) = (e);}
typedef
struct
_CommandTable
{
/* commands that are understood */
char
*
name
;
/* full name */
int
minlen
;
/* unique prefix */
int
maxlen
;
/* strlen(name) */
ProcessFunc
processfunc
;
/* handler */
char
*
helptext
;
/* what to print for help */
}
CommandTable
;
struct
_extract_data
{
/* for iterating */
FILE
*
fp
;
/* input source */
char
*
filename
;
/* name of input */
Bool
used_stdout
;
/* whether or not need to close */
Bool
numeric
;
/* format in which to write */
int
nwritten
;
/* number of entries written */
char
*
cmd
;
/* for error messages */
};
struct
_list_data
{
/* for iterating */
FILE
*
fp
;
/* output file */
Bool
numeric
;
/* format in which to write */
};
/*
* private data
*/
static
char
*
stdin_filename
=
"(stdin)"
;
/* for messages */
static
char
*
stdout_filename
=
"(stdout)"
;
/* for messages */
static
char
*
Yes
=
"yes"
;
/* for messages */
static
char
*
No
=
"no"
;
/* for messages */
static
int
do_help
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_questionmark
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_list
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_merge
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_extract
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_add
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_remove
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_info
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_exit
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_quit
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
static
int
do_source
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
/*
static int do_generate ( char *inputfilename, int lineno, int argc, char **argv );
*/
static
CommandTable
command_table
[]
=
{
/* table of known commands */
{
"add"
,
2
,
3
,
do_add
,
"add dpyname protoname hexkey add entry"
},
{
"exit"
,
3
,
4
,
do_exit
,
"exit save changes and exit program"
},
{
"extract"
,
3
,
7
,
do_extract
,
"extract filename dpyname... extract entries into file"
},
{
"help"
,
1
,
4
,
do_help
,
"help [topic] print help"
},
{
"info"
,
1
,
4
,
do_info
,
"info print information about entries"
},
{
"list"
,
1
,
4
,
do_list
,
"list [dpyname...] list entries"
},
{
"merge"
,
1
,
5
,
do_merge
,
"merge filename... merge entries from files"
},
{
"nextract"
,
2
,
8
,
do_extract
,
"nextract filename dpyname... numerically extract entries"
},
{
"nlist"
,
2
,
5
,
do_list
,
"nlist [dpyname...] numerically list entries"
},
{
"nmerge"
,
2
,
6
,
do_merge
,
"nmerge filename... numerically merge entries"
},
{
"quit"
,
1
,
4
,
do_quit
,
"quit abort changes and exit program"
},
{
"remove"
,
1
,
6
,
do_remove
,
"remove dpyname... remove entries"
},
{
"source"
,
1
,
6
,
do_source
,
"source filename read commands from file"
},
{
"?"
,
1
,
1
,
do_questionmark
,
"? list available commands"
},
/* { "generate", 1, 8, do_generate,
"generate dpyname protoname [options] use server to generate entry\n"
" options are:\n"
" timeout n authorization expiration time in seconds\n"
" trusted clients using this entry are trusted\n"
" untrusted clients using this entry are untrusted\n"
" group n clients using this entry belong to application group n\n"
" data hexkey auth protocol specific data needed to generate the entry\n"
}, */
{
NULL
,
0
,
0
,
NULL
,
NULL
},
};
#define COMMAND_NAMES_PADDED_WIDTH 10
/* wider than anything above */
static
Bool
okay_to_use_stdin
=
True
;
/* set to false after using */
static
char
*
hex_table
[]
=
{
/* for printing hex digits */
"00"
,
"01"
,
"02"
,
"03"
,
"04"
,
"05"
,
"06"
,
"07"
,
"08"
,
"09"
,
"0a"
,
"0b"
,
"0c"
,
"0d"
,
"0e"
,
"0f"
,
"10"
,
"11"
,
"12"
,
"13"
,
"14"
,
"15"
,
"16"
,
"17"
,
"18"
,
"19"
,
"1a"
,
"1b"
,
"1c"
,
"1d"
,
"1e"
,
"1f"
,
"20"
,
"21"
,
"22"
,
"23"
,
"24"
,
"25"
,
"26"
,
"27"
,
"28"
,
"29"
,
"2a"
,
"2b"
,
"2c"
,
"2d"
,
"2e"
,
"2f"
,
"30"
,
"31"
,
"32"
,
"33"
,
"34"
,
"35"
,
"36"
,
"37"
,
"38"
,
"39"
,
"3a"
,
"3b"
,
"3c"
,
"3d"
,
"3e"
,
"3f"
,
"40"
,
"41"
,
"42"
,
"43"
,
"44"
,
"45"
,
"46"
,
"47"
,
"48"
,
"49"
,
"4a"
,
"4b"
,
"4c"
,
"4d"
,
"4e"
,
"4f"
,
"50"
,
"51"
,
"52"
,
"53"
,
"54"
,
"55"
,
"56"
,
"57"
,
"58"
,
"59"
,
"5a"
,
"5b"
,
"5c"
,
"5d"
,
"5e"
,
"5f"
,
"60"
,
"61"
,
"62"
,
"63"
,
"64"
,
"65"
,
"66"
,
"67"
,
"68"
,
"69"
,
"6a"
,
"6b"
,
"6c"
,
"6d"
,
"6e"
,
"6f"
,
"70"
,
"71"
,
"72"
,
"73"
,
"74"
,
"75"
,
"76"
,
"77"
,
"78"
,
"79"
,
"7a"
,
"7b"
,
"7c"
,
"7d"
,
"7e"
,
"7f"
,
"80"
,
"81"
,
"82"
,
"83"
,
"84"
,
"85"
,
"86"
,
"87"
,
"88"
,
"89"
,
"8a"
,
"8b"
,
"8c"
,
"8d"
,
"8e"
,
"8f"
,
"90"
,
"91"
,
"92"
,
"93"
,
"94"
,
"95"
,
"96"
,
"97"
,
"98"
,
"99"
,
"9a"
,
"9b"
,
"9c"
,
"9d"
,
"9e"
,
"9f"
,
"a0"
,
"a1"
,
"a2"
,
"a3"
,
"a4"
,
"a5"
,
"a6"
,
"a7"
,
"a8"
,
"a9"
,
"aa"
,
"ab"
,
"ac"
,
"ad"
,
"ae"
,
"af"
,
"b0"
,
"b1"
,
"b2"
,
"b3"
,
"b4"
,
"b5"
,
"b6"
,
"b7"
,
"b8"
,
"b9"
,
"ba"
,
"bb"
,
"bc"
,
"bd"
,
"be"
,
"bf"
,
"c0"
,
"c1"
,
"c2"
,
"c3"
,
"c4"
,
"c5"
,
"c6"
,
"c7"
,
"c8"
,
"c9"
,
"ca"
,
"cb"
,
"cc"
,
"cd"
,
"ce"
,
"cf"
,
"d0"
,
"d1"
,
"d2"
,
"d3"
,
"d4"
,
"d5"
,
"d6"
,
"d7"
,
"d8"
,
"d9"
,
"da"
,
"db"
,
"dc"
,
"dd"
,
"de"
,
"df"
,
"e0"
,
"e1"
,
"e2"
,
"e3"
,
"e4"
,
"e5"
,
"e6"
,
"e7"
,
"e8"
,
"e9"
,
"ea"
,
"eb"
,
"ec"
,
"ed"
,
"ee"
,
"ef"
,
"f0"
,
"f1"
,
"f2"
,
"f3"
,
"f4"
,
"f5"
,
"f6"
,
"f7"
,
"f8"
,
"f9"
,
"fa"
,
"fb"
,
"fc"
,
"fd"
,
"fe"
,
"ff"
,
};
static
unsigned
int
hexvalues
[
256
];
/* for parsing hex input */
static
int
original_umask
=
0
;
/* for restoring */
/*
* private utility procedures
*/
static
void
prefix
(
char
*
fn
,
int
n
)
{
fprintf
(
stderr
,
"%s: %s:%d: "
,
ProgramName
,
fn
,
n
);
}
static
void
baddisplayname
(
char
*
dpy
,
char
*
cmd
)
{
fprintf
(
stderr
,
"bad display name
\"
%s
\"
in
\"
%s
\"
command
\n
"
,
dpy
,
cmd
);
}
static
void
badcommandline
(
char
*
cmd
)
{
fprintf
(
stderr
,
"bad
\"
%s
\"
command line
\n
"
,
cmd
);
}
static
char
*
skip_space
(
register
char
*
s
)
{
if
(
!
s
)
return
NULL
;
for
(
;
*
s
&&
isascii
(
*
s
)
&&
isspace
(
*
s
);
s
++
)
;
return
s
;
}
static
char
*
skip_nonspace
(
register
char
*
s
)
{
if
(
!
s
)
return
NULL
;
/* put quoting into loop if need be */
for
(
;
*
s
&&
isascii
(
*
s
)
&&
!
isspace
(
*
s
);
s
++
)
;
return
s
;
}
static
char
**
split_into_words
(
char
*
src
,
int
*
argcp
)
/* argvify string */
{
char
*
jword
;
char
savec
;
char
**
argv
;
int
cur
,
total
;
*
argcp
=
0
;
#define WORDSTOALLOC 4
/* most lines are short */
argv
=
(
char
**
)
malloc
(
WORDSTOALLOC
*
sizeof
(
char
*
));
if
(
!
argv
)
return
NULL
;
cur
=
0
;
total
=
WORDSTOALLOC
;
/*
* split the line up into separate, nul-terminated tokens; the last
* "token" will point to the empty string so that it can be bashed into
* a null pointer.
*/
do
{
jword
=
skip_space
(
src
);
src
=
skip_nonspace
(
jword
);
savec
=
*
src
;
*
src
=
'\0'
;
if
(
cur
==
total
)
{
total
+=
WORDSTOALLOC
;
argv
=
(
char
**
)
realloc
(
argv
,
total
*
sizeof
(
char
*
));
if
(
!
argv
)
return
NULL
;
}
argv
[
cur
++
]
=
jword
;
if
(
savec
)
src
++
;
/* if not last on line advance */
}
while
(
jword
!=
src
);
argv
[
--
cur
]
=
NULL
;
/* smash empty token to end list */
*
argcp
=
cur
;
return
argv
;
}
static
FILE
*
open_file
(
char
**
filenamep
,
char
*
mode
,
Bool
*
usedstdp
,
char
*
srcfn
,
int
srcln
,
char
*
cmd
)
{
FILE
*
fp
;
if
(
strcmp
(
*
filenamep
,
"-"
)
==
0
)
{
*
usedstdp
=
True
;
/* select std descriptor to use */
if
(
mode
[
0
]
==
'r'
)
{
if
(
okay_to_use_stdin
)
{
okay_to_use_stdin
=
False
;
*
filenamep
=
stdin_filename
;
return
stdin
;
}
else
{
prefix
(
srcfn
,
srcln
);
fprintf
(
stderr
,
"%s: stdin already in use
\n
"
,
cmd
);
return
NULL
;
}
}
else
{
*
filenamep
=
stdout_filename
;
return
stdout
;
/* always okay to use stdout */
}
}
fp
=
fopen
(
*
filenamep
,
mode
);
if
(
!
fp
)
{
prefix
(
srcfn
,
srcln
);
fprintf
(
stderr
,
"%s: unable to open file %s
\n
"
,
cmd
,
*
filenamep
);
}
return
fp
;
}
static
int
getinput
(
FILE
*
fp
)
{
register
int
c
;
while
((
c
=
getc
(
fp
))
!=
EOF
&&
isascii
(
c
)
&&
c
!=
'\n'
&&
isspace
(
c
))
;
return
c
;
}
static
int
get_short
(
FILE
*
fp
,
unsigned
short
*
sp
)
/* for reading numeric input */
{
int
c
;
int
i
;
unsigned
short
us
=
0
;
/*
* read family: written with %04x
*/
for
(
i
=
0
;
i
<
4
;
i
++
)
{
switch
(
c
=
getinput
(
fp
))
{
case
EOF
:
case
'\n'
:
return
0
;
}
if
(
c
<
0
||
c
>
255
)
return
0
;
us
=
(
us
*
16
)
+
hexvalues
[
c
];
/* since msb */
}
*
sp
=
us
;
return
1
;
}
static
int
get_bytes
(
FILE
*
fp
,
unsigned
int
n
,
char
**
ptr
)
/* for reading numeric input */
{
char
*
s
;
register
char
*
cp
;
int
c1
,
c2
;
cp
=
s
=
malloc
(
n
);
if
(
!
cp
)
return
0
;
while
(
n
>
0
)
{
if
((
c1
=
getinput
(
fp
))
==
EOF
||
c1
==
'\n'
||
(
c2
=
getinput
(
fp
))
==
EOF
||
c2
==
'\n'
)
{
free
(
s
);
return
0
;
}
*
cp
=
(
char
)
((
hexvalues
[
c1
]
*
16
)
+
hexvalues
[
c2
]);
cp
++
;
n
--
;
}
*
ptr
=
s
;
return
1
;
}
static
Xauth
*
read_numeric
(
FILE
*
fp
)
{
Xauth
*
auth
;
auth
=
(
Xauth
*
)
malloc
(
sizeof
(
Xauth
));
if
(
!
auth
)
goto
bad
;
auth
->
family
=
0
;
auth
->
address
=
NULL
;
auth
->
address_length
=
0
;
auth
->
number
=
NULL
;
auth
->
number_length
=
0
;
auth
->
name
=
NULL
;
auth
->
name_length
=
0
;
auth
->
data
=
NULL
;
auth
->
data_length
=
0
;
if
(
!
get_short
(
fp
,
(
unsigned
short
*
)
&
auth
->
family
))
goto
bad
;
if
(
!
get_short
(
fp
,
(
unsigned
short
*
)
&
auth
->
address_length
))
goto
bad
;
if
(
!
get_bytes
(
fp
,
(
unsigned
int
)
auth
->
address_length
,
&
auth
->
address
))
goto
bad
;
if
(
!
get_short
(
fp
,
(
unsigned
short
*
)
&
auth
->
number_length
))
goto
bad
;
if
(
!
get_bytes
(
fp
,
(
unsigned
int
)
auth
->
number_length
,
&
auth
->
number
))
goto
bad
;
if
(
!
get_short
(
fp
,
(
unsigned
short
*
)
&
auth
->
name_length
))
goto
bad
;
if
(
!
get_bytes
(
fp
,
(
unsigned
int
)
auth
->
name_length
,
&
auth
->
name
))
goto
bad
;
if
(
!
get_short
(
fp
,
(
unsigned
short
*
)
&
auth
->
data_length
))
goto
bad
;
if
(
!
get_bytes
(
fp
,
(
unsigned
int
)
auth
->
data_length
,
&
auth
->
data
))
goto
bad
;
switch
(
getinput
(
fp
))
{
/* get end of line */
case
EOF
:
case
'\n'
:
return
auth
;
}
bad:
if
(
auth
)
XauDisposeAuth
(
auth
);
/* won't free null pointers */
return
NULL
;
}
typedef
Xauth
*
(
*
ReadFunc
)(
FILE
*
);
static
int
read_auth_entries
(
FILE
*
fp
,
Bool
numeric
,
AuthList
**
headp
,
AuthList
**
tailp
)
{
ReadFunc
readfunc
=
(
numeric
?
read_numeric
:
XauReadAuth
);
Xauth
*
auth
;
AuthList
*
head
,
*
tail
;
int
n
;
head
=
tail
=
NULL
;
n
=
0
;
/* put all records into linked list */
while
((
auth
=
((
*
readfunc
)
(
fp
)))
!=
NULL
)
{
AuthList
*
l
=
(
AuthList
*
)
malloc
(
sizeof
(
AuthList
));
if
(
!
l
)
{
fprintf
(
stderr
,
"%s: unable to alloc entry reading auth file
\n
"
,
ProgramName
);
exit
(
1
);
}
l
->
next
=
NULL
;
l
->
auth
=
auth
;
if
(
tail
)
/* if not first time through append */
tail
->
next
=
l
;
else
head
=
l
;
/* first time through, so assign */
tail
=
l
;
n
++
;
}
*
headp
=
head
;
*
tailp
=
tail
;
return
n
;
}
static
Bool
get_displayname_auth
(
char
*
displayname
,
Xauth
*
auth
)
{
int
family
;
char
*
host
=
NULL
,
*
rest
=
NULL
;
int
dpynum
,
scrnum
;
char
*
cp
;
int
len
;
Xauth
proto
;
int
prelen
=
0
;
/*
* check to see if the display name is of the form "host/unix:"
* which is how the list routine prints out local connections
*/
cp
=
strchr
(
displayname
,
'/'
);
if
(
cp
&&
strncmp
(
cp
,
"/unix:"
,
6
)
==
0
)
prelen
=
(
cp
-
displayname
);
#ifdef __APPLE__
/*
* FIXME: This is an attempt to get the right
* cookie, because no one can grant that the
* X server is running on the display number
* reported in the launchd display name.
*/
if
(
strncmp
(
displayname
,
"/tmp/launch"
,
11
)
==
0
)
displayname
=
strrchr
(
displayname
,
':'
);
#endif
if
(
!
parse_displayname
(
displayname
+
((
prelen
>
0
)
?
prelen
+
1
:
0
),
&
family
,
&
host
,
&
dpynum
,
&
scrnum
,
&
rest
))
{
return
False
;
}
proto
.
family
=
family
;
proto
.
address
=
get_address_info
(
family
,
displayname
,
prelen
,
host
,
&
len
);
if
(
proto
.
address
)
{
char
buf
[
40
];
/* want to hold largest display num */
proto
.
address_length
=
len
;
buf
[
0
]
=
'\0'
;
sprintf
(
buf
,
"%d"
,
dpynum
);
proto
.
number_length
=
strlen
(
buf
);
if
(
proto
.
number_length
<=
0
)
{
free
(
proto
.
address
);
proto
.
address
=
NULL
;
}
else
{
proto
.
number
=
copystring
(
buf
,
proto
.
number_length
);
}
}
if
(
host
)
free
(
host
);
if
(
rest
)
free
(
rest
);
if
(
proto
.
address
)
{
auth
->
family
=
proto
.
family
;
auth
->
address
=
proto
.
address
;
auth
->
address_length
=
proto
.
address_length
;
auth
->
number
=
proto
.
number
;
auth
->
number_length
=
proto
.
number_length
;
auth
->
name
=
NULL
;
auth
->
name_length
=
0
;
auth
->
data
=
NULL
;
auth
->
data_length
=
0
;
return
True
;
}
else
{
return
False
;
}
}
static
int
cvthexkey
(
char
*
hexstr
,
char
**
ptrp
)
/* turn hex key string into octets */
{
int
i
;
int
len
=
0
;
char
*
retval
,
*
s
;
unsigned
char
*
us
;
char
c
;
char
savec
=
'\0'
;
/* count */
for
(
s
=
hexstr
;
*
s
;
s
++
)
{
if
(
!
isascii
(
*
s
))
return
-
1
;
if
(
isspace
(
*
s
))
continue
;
if
(
!
isxdigit
(
*
s
))
return
-
1
;
len
++
;
}
/* if odd then there was an error */
if
((
len
&
1
)
==
1
)
return
-
1
;
/* now we know that the input is good */
len
>>=
1
;
retval
=
malloc
(
len
);
if
(
!
retval
)
{
fprintf
(
stderr
,
"%s: unable to allocate %d bytes for hexkey
\n
"
,
ProgramName
,
len
);
return
-
1
;
}
for
(
us
=
(
unsigned
char
*
)
retval
,
i
=
len
;
i
>
0
;
hexstr
++
)
{
c
=
*
hexstr
;
if
(
isspace
(
c
))
continue
;
/* already know it is ascii */
if
(
isupper
(
c
))
c
=
tolower
(
c
);
if
(
savec
)
{
#define atoh(c) ((c) - (((c) >= '0' && (c) <= '9') ? '0' : ('a'-10)))
*
us
=
(
unsigned
char
)((
atoh
(
savec
)
<<
4
)
+
atoh
(
c
));
#undef atoh
savec
=
0
;
/* ready for next character */
us
++
;
i
--
;
}
else
{
savec
=
c
;
}
}
*
ptrp
=
retval
;
return
len
;
}
static
int
dispatch_command
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
,
CommandTable
*
tab
,
int
*
statusp
)
{
CommandTable
*
ct
;
char
*
cmd
;
int
n
;
/* scan table for command */
cmd
=
argv
[
0
];
n
=
strlen
(
cmd
);
for
(
ct
=
tab
;
ct
->
name
;
ct
++
)
{
/* look for unique prefix */
if
(
n
>=
ct
->
minlen
&&
n
<=
ct
->
maxlen
&&
strncmp
(
cmd
,
ct
->
name
,
n
)
==
0
)
{
*
statusp
=
(
*
(
ct
->
processfunc
))(
inputfilename
,
lineno
,
argc
,
argv
);
return
1
;
}
}
*
statusp
=
1
;
return
0
;
}
static
AuthList
*
xauth_head
=
NULL
;
/* list of auth entries */
static
Bool
xauth_existed
=
False
;
/* if was present at initialize */
static
Bool
xauth_modified
=
False
;
/* if added, removed, or merged */
static
Bool
xauth_allowed
=
True
;
/* if allowed to write auth file */
static
Bool
xauth_locked
=
False
;
/* if has been locked */
static
char
*
xauth_filename
=
NULL
;
static
Bool
dieing
=
False
;
#ifdef SIGNALRETURNSINT
#define _signal_t int
#else
#define _signal_t void
#endif
/* poor man's puts(), for under signal handlers */
#define WRITES(fd, S) (void)write((fd), (S), strlen((S)))
/* ARGSUSED */
static
_signal_t
die
(
int
sig
)
{
dieing
=
True
;
_exit
(
auth_finalize
());
/* NOTREACHED */
#ifdef SIGNALRETURNSINT
return
-
1
;
/* for picky compilers */
#endif
}
static
_signal_t
catchsig
(
int
sig
)
{
#ifdef SYSV
if
(
sig
>
0
)
signal
(
sig
,
die
);
/* re-establish signal handler */
#endif
/*
* fileno() might not be reentrant, avoid it if possible, and use
* stderr instead of stdout
*/
#ifdef STDERR_FILENO
if
(
verbose
&&
xauth_modified
)
WRITES
(
STDERR_FILENO
,
"
\r\n
"
);
#else
if
(
verbose
&&
xauth_modified
)
WRITES
(
fileno
(
stderr
),
"
\r\n
"
);
#endif
die
(
sig
);
/* NOTREACHED */
#ifdef SIGNALRETURNSINT
return
-
1
;
/* for picky compilers */
#endif
}
static
void
register_signals
(
void
)
{
signal
(
SIGINT
,
catchsig
);
signal
(
SIGTERM
,
catchsig
);
#ifdef SIGHUP
signal
(
SIGHUP
,
catchsig
);
#endif
return
;
}
/*
* public procedures for parsing lines of input
*/
int
auth_initialize
(
char
*
authfilename
)
{
int
n
;
AuthList
*
head
,
*
tail
;
FILE
*
authfp
;
Bool
exists
;
xauth_filename
=
authfilename
;
/* used in cleanup, prevent race with
signals */
register_signals
();
bzero
((
char
*
)
hexvalues
,
sizeof
hexvalues
);
hexvalues
[
'0'
]
=
0
;
hexvalues
[
'1'
]
=
1
;
hexvalues
[
'2'
]
=
2
;
hexvalues
[
'3'
]
=
3
;
hexvalues
[
'4'
]
=
4
;
hexvalues
[
'5'
]
=
5
;
hexvalues
[
'6'
]
=
6
;
hexvalues
[
'7'
]
=
7
;
hexvalues
[
'8'
]
=
8
;
hexvalues
[
'9'
]
=
9
;
hexvalues
[
'a'
]
=
hexvalues
[
'A'
]
=
0xa
;
hexvalues
[
'b'
]
=
hexvalues
[
'B'
]
=
0xb
;
hexvalues
[
'c'
]
=
hexvalues
[
'C'
]
=
0xc
;
hexvalues
[
'd'
]
=
hexvalues
[
'D'
]
=
0xd
;
hexvalues
[
'e'
]
=
hexvalues
[
'E'
]
=
0xe
;
hexvalues
[
'f'
]
=
hexvalues
[
'F'
]
=
0xf
;
if
(
break_locks
&&
verbose
)
{
printf
(
"Attempting to break locks on authority file %s
\n
"
,
authfilename
);
}
if
(
ignore_locks
)
{
if
(
break_locks
)
XauUnlockAuth
(
authfilename
);
}
else
{
n
=
XauLockAuth
(
authfilename
,
XAUTH_DEFAULT_RETRIES
,
XAUTH_DEFAULT_TIMEOUT
,
(
break_locks
?
0L
:
XAUTH_DEFAULT_DEADTIME
));
if
(
n
!=
LOCK_SUCCESS
)
{
char
*
reason
=
"unknown error"
;
switch
(
n
)
{
case
LOCK_ERROR
:
reason
=
"error"
;
break
;
case
LOCK_TIMEOUT
:
reason
=
"timeout"
;
break
;
}
fprintf
(
stderr
,
"%s: %s in locking authority file %s
\n
"
,
ProgramName
,
reason
,
authfilename
);
return
-
1
;
}
else
xauth_locked
=
True
;
}
/* these checks can only be done reliably after the file is locked */
exists
=
(
access
(
authfilename
,
F_OK
)
==
0
);
if
(
exists
&&
access
(
authfilename
,
W_OK
)
!=
0
)
{
fprintf
(
stderr
,
"%s: %s not writable, changes will be ignored
\n
"
,
ProgramName
,
authfilename
);
xauth_allowed
=
False
;
}
original_umask
=
umask
(
0077
);
/* disallow non-owner access */
authfp
=
fopen
(
authfilename
,
"rb"
);
if
(
!
authfp
)
{
int
olderrno
=
errno
;
/* if file there then error */
if
(
access
(
authfilename
,
F_OK
)
==
0
)
{
/* then file does exist! */
errno
=
olderrno
;
return
-
1
;
}
/* else ignore it */
fprintf
(
stderr
,
"%s: creating new authority file %s
\n
"
,
ProgramName
,
authfilename
);
}
else
{
xauth_existed
=
True
;
n
=
read_auth_entries
(
authfp
,
False
,
&
head
,
&
tail
);
(
void
)
fclose
(
authfp
);
if
(
n
<
0
)
{
fprintf
(
stderr
,
"%s: unable to read auth entries from file
\"
%s
\"\n
"
,
ProgramName
,
authfilename
);
return
-
1
;
}
xauth_head
=
head
;
}
n
=
strlen
(
authfilename
);
xauth_filename
=
malloc
(
n
+
1
);
if
(
xauth_filename
)
strcpy
(
xauth_filename
,
authfilename
);
else
{
fprintf
(
stderr
,
"cannot allocate memory
\n
"
);
return
-
1
;
}
xauth_modified
=
False
;
if
(
verbose
)
{
printf
(
"%s authority file %s
\n
"
,
ignore_locks
?
"Ignoring locks on"
:
"Using"
,
authfilename
);
}
return
0
;
}
static
int
write_auth_file
(
char
*
tmp_nam
)
{
FILE
*
fp
=
NULL
;
int
fd
;
AuthList
*
list
;
/*
* xdm and auth spec assumes auth file is 12 or fewer characters
*/
strcpy
(
tmp_nam
,
xauth_filename
);
strcat
(
tmp_nam
,
"-n"
);
/* for new */
(
void
)
unlink
(
tmp_nam
);
/* CPhipps 2000/02/12 - fix file unlink/fopen race */
fd
=
open
(
tmp_nam
,
O_WRONLY
|
O_CREAT
|
O_EXCL
,
0600
);
if
(
fd
!=
-
1
)
fp
=
fdopen
(
fd
,
"wb"
);
if
(
!
fp
)
{
if
(
fd
!=
-
1
)
close
(
fd
);
fprintf
(
stderr
,
"%s: unable to open tmp file
\"
%s
\"\n
"
,
ProgramName
,
tmp_nam
);
return
-
1
;
}
/*
* Write MIT-MAGIC-COOKIE-1 first, because R4 Xlib knows
* only that and uses the first authorization it finds.
*/
for
(
list
=
xauth_head
;
list
;
list
=
list
->
next
)
{
if
(
list
->
auth
->
name_length
==
18
&&
strncmp
(
list
->
auth
->
name
,
"MIT-MAGIC-COOKIE-1"
,
18
)
==
0
)
{
if
(
!
XauWriteAuth
(
fp
,
list
->
auth
))
{
(
void
)
fclose
(
fp
);
return
-
1
;
}
}
}
for
(
list
=
xauth_head
;
list
;
list
=
list
->
next
)
{
if
(
list
->
auth
->
name_length
!=
18
||
strncmp
(
list
->
auth
->
name
,
"MIT-MAGIC-COOKIE-1"
,
18
)
!=
0
)
{
if
(
!
XauWriteAuth
(
fp
,
list
->
auth
))
{
(
void
)
fclose
(
fp
);
return
-
1
;
}
}
}
(
void
)
fclose
(
fp
);
return
0
;
}
int
auth_finalize
(
void
)
{
char
temp_name
[
1024
];
/* large filename size */
if
(
xauth_modified
)
{
if
(
dieing
)
{
if
(
verbose
)
{
/*
* called from a signal handler -- printf is *not* reentrant; also
* fileno() might not be reentrant, avoid it if possible, and use
* stderr instead of stdout
*/
#ifdef STDERR_FILENO
WRITES
(
STDERR_FILENO
,
"
\n
Aborting changes to authority file "
);
WRITES
(
STDERR_FILENO
,
xauth_filename
);
WRITES
(
STDERR_FILENO
,
"
\n
"
);
#else
WRITES
(
fileno
(
stderr
),
"
\n
Aborting changes to authority file "
);
WRITES
(
fileno
(
stderr
),
xauth_filename
);
WRITES
(
fileno
(
stderr
),
"
\n
"
);
#endif
}
}
else
if
(
!
xauth_allowed
)
{
fprintf
(
stderr
,
"%s: %s not writable, changes ignored
\n
"
,
ProgramName
,
xauth_filename
);
}
else
{
if
(
verbose
)
{
printf
(
"%s authority file %s
\n
"
,
ignore_locks
?
"Ignoring locks and writing"
:
"Writing"
,
xauth_filename
);
}
temp_name
[
0
]
=
'\0'
;
if
(
write_auth_file
(
temp_name
)
==
-
1
)
{
fprintf
(
stderr
,
"%s: unable to write authority file %s
\n
"
,
ProgramName
,
temp_name
);
}
else
{
(
void
)
unlink
(
xauth_filename
);
#if defined(WIN32) || defined(__UNIXOS2__)|| defined(__CYGWIN__)
if
(
rename
(
temp_name
,
xauth_filename
)
==
-
1
)
#else
if
(
link
(
temp_name
,
xauth_filename
)
==
-
1
)
#endif
{
fprintf
(
stderr
,
"%s: unable to link authority file %s, use %s
\n
"
,
ProgramName
,
xauth_filename
,
temp_name
);
}
else
{
(
void
)
unlink
(
temp_name
);
}
}
}
}
if
(
xauth_locked
)
{
XauUnlockAuth
(
xauth_filename
);
}
(
void
)
umask
(
original_umask
);
return
0
;
}
int
process_command
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
int
status
;
if
(
argc
<
1
||
!
argv
||
!
argv
[
0
])
return
1
;
if
(
dispatch_command
(
inputfilename
,
lineno
,
argc
,
argv
,
command_table
,
&
status
))
return
status
;
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unknown command
\"
%s
\"\n
"
,
argv
[
0
]);
return
1
;
}
/*
* utility routines
*/
static
char
*
bintohex
(
unsigned
int
len
,
char
*
bindata
)
{
char
*
hexdata
,
*
starthex
;
/* two chars per byte, plus null termination */
starthex
=
hexdata
=
(
char
*
)
malloc
(
2
*
len
+
1
);
if
(
!
hexdata
)
return
NULL
;
for
(;
len
>
0
;
len
--
,
bindata
++
)
{
register
char
*
s
=
hex_table
[(
unsigned
char
)
*
bindata
];
*
hexdata
++
=
s
[
0
];
*
hexdata
++
=
s
[
1
];
}
*
hexdata
=
'\0'
;
return
starthex
;
}
static
void
fprintfhex
(
register
FILE
*
fp
,
int
len
,
char
*
cp
)
{
char
*
hex
;
hex
=
bintohex
(
len
,
cp
);
fprintf
(
fp
,
"%s"
,
hex
);
free
(
hex
);
}
int
dump_numeric
(
register
FILE
*
fp
,
register
Xauth
*
auth
)
{
fprintf
(
fp
,
"%04x"
,
auth
->
family
);
/* unsigned short */
fprintf
(
fp
,
" %04x "
,
auth
->
address_length
);
/* short */
fprintfhex
(
fp
,
auth
->
address_length
,
auth
->
address
);
fprintf
(
fp
,
" %04x "
,
auth
->
number_length
);
/* short */
fprintfhex
(
fp
,
auth
->
number_length
,
auth
->
number
);
fprintf
(
fp
,
" %04x "
,
auth
->
name_length
);
/* short */
fprintfhex
(
fp
,
auth
->
name_length
,
auth
->
name
);
fprintf
(
fp
,
" %04x "
,
auth
->
data_length
);
/* short */
fprintfhex
(
fp
,
auth
->
data_length
,
auth
->
data
);
putc
(
'\n'
,
fp
);
return
1
;
}
/* ARGSUSED */
static
int
dump_entry
(
char
*
inputfilename
,
int
lineno
,
Xauth
*
auth
,
char
*
data
)
{
struct
_list_data
*
ld
=
(
struct
_list_data
*
)
data
;
FILE
*
fp
=
ld
->
fp
;
if
(
ld
->
numeric
)
{
dump_numeric
(
fp
,
auth
);
}
else
{
char
*
dpyname
=
NULL
;
switch
(
auth
->
family
)
{
case
FamilyLocal
:
fwrite
(
auth
->
address
,
sizeof
(
char
),
auth
->
address_length
,
fp
);
fprintf
(
fp
,
"/unix"
);
break
;
case
FamilyInternet
:
case
FamilyDECnet
:
dpyname
=
get_hostname
(
auth
);
if
(
dpyname
)
{
fprintf
(
fp
,
"%s"
,
dpyname
);
break
;
}
/* else fall through to default */
default:
fprintf
(
fp
,
"#%04x#"
,
auth
->
family
);
fprintfhex
(
fp
,
auth
->
address_length
,
auth
->
address
);
putc
(
'#'
,
fp
);
}
putc
(
':'
,
fp
);
fwrite
(
auth
->
number
,
sizeof
(
char
),
auth
->
number_length
,
fp
);
putc
(
' '
,
fp
);
putc
(
' '
,
fp
);
fwrite
(
auth
->
name
,
sizeof
(
char
),
auth
->
name_length
,
fp
);
putc
(
' '
,
fp
);
putc
(
' '
,
fp
);
if
(
!
strncmp
(
auth
->
name
,
SECURERPC
,
auth
->
name_length
)
||
!
strncmp
(
auth
->
name
,
K5AUTH
,
auth
->
name_length
))
fwrite
(
auth
->
data
,
sizeof
(
char
),
auth
->
data_length
,
fp
);
else
fprintfhex
(
fp
,
auth
->
data_length
,
auth
->
data
);
putc
(
'\n'
,
fp
);
}
return
0
;
}
static
int
extract_entry
(
char
*
inputfilename
,
int
lineno
,
Xauth
*
auth
,
char
*
data
)
{
struct
_extract_data
*
ed
=
(
struct
_extract_data
*
)
data
;
if
(
!
ed
->
fp
)
{
ed
->
fp
=
open_file
(
&
ed
->
filename
,
ed
->
numeric
?
"w"
:
"wb"
,
&
ed
->
used_stdout
,
inputfilename
,
lineno
,
ed
->
cmd
);
if
(
!
ed
->
fp
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unable to open extraction file
\"
%s
\"\n
"
,
ed
->
filename
);
return
-
1
;
}
}
(
*
(
ed
->
numeric
?
dump_numeric
:
XauWriteAuth
))
(
ed
->
fp
,
auth
);
ed
->
nwritten
++
;
return
0
;
}
static
int
match_auth_dpy
(
register
Xauth
*
a
,
register
Xauth
*
b
)
{
return
((
a
->
family
==
b
->
family
&&
a
->
address_length
==
b
->
address_length
&&
a
->
number_length
==
b
->
number_length
&&
memcmp
(
a
->
address
,
b
->
address
,
a
->
address_length
)
==
0
&&
memcmp
(
a
->
number
,
b
->
number
,
a
->
number_length
)
==
0
)
?
1
:
0
);
}
/* return non-zero iff display and authorization type are the same */
static
int
match_auth
(
register
Xauth
*
a
,
register
Xauth
*
b
)
{
return
((
match_auth_dpy
(
a
,
b
)
&&
a
->
name_length
==
b
->
name_length
&&
memcmp
(
a
->
name
,
b
->
name
,
a
->
name_length
)
==
0
)
?
1
:
0
);
}
static
int
merge_entries
(
AuthList
**
firstp
,
AuthList
*
second
,
int
*
nnewp
,
int
*
nreplp
)
{
AuthList
*
a
,
*
b
,
*
first
,
*
tail
;
int
n
=
0
,
nnew
=
0
,
nrepl
=
0
;
if
(
!
second
)
return
0
;
if
(
!*
firstp
)
{
/* if nothing to merge into */
*
firstp
=
second
;
for
(
tail
=
*
firstp
,
n
=
1
;
tail
->
next
;
n
++
,
tail
=
tail
->
next
)
;
*
nnewp
=
n
;
*
nreplp
=
0
;
return
n
;
}
first
=
*
firstp
;
/*
* find end of first list and stick second list on it
*/
for
(
tail
=
first
;
tail
->
next
;
tail
=
tail
->
next
)
;
tail
->
next
=
second
;
/*
* run down list freeing duplicate entries; if an entry is okay, then
* bump the tail up to include it, otherwise, cut the entry out of
* the chain.
*/
for
(
b
=
second
;
b
;
)
{
AuthList
*
next
=
b
->
next
;
/* in case we free it */
a
=
first
;
for
(;;)
{
if
(
match_auth
(
a
->
auth
,
b
->
auth
))
{
/* found a duplicate */
AuthList
tmp
;
/* swap it in for old one */
tmp
=
*
a
;
*
a
=
*
b
;
*
b
=
tmp
;
a
->
next
=
b
->
next
;
XauDisposeAuth
(
b
->
auth
);
free
((
char
*
)
b
);
b
=
NULL
;
tail
->
next
=
next
;
nrepl
++
;
nnew
--
;
break
;
}
if
(
a
==
tail
)
break
;
/* if have looked at left side */
a
=
a
->
next
;
}
if
(
b
)
{
/* if we didn't remove it */
tail
=
b
;
/* bump end of first list */
}
b
=
next
;
n
++
;
nnew
++
;
}
*
nnewp
=
nnew
;
*
nreplp
=
nrepl
;
return
n
;
}
typedef
int
(
*
YesNoFunc
)(
char
*
,
int
,
Xauth
*
,
char
*
);
static
int
iterdpy
(
char
*
inputfilename
,
int
lineno
,
int
start
,
int
argc
,
char
*
argv
[],
YesNoFunc
yfunc
,
YesNoFunc
nfunc
,
char
*
data
)
{
int
i
;
int
status
;
int
errors
=
0
;
Xauth
proto
;
AuthList
*
l
,
*
next
;
/*
* iterate
*/
for
(
i
=
start
;
i
<
argc
;
i
++
)
{
char
*
displayname
=
argv
[
i
];
proto
.
address
=
proto
.
number
=
NULL
;
if
(
!
get_displayname_auth
(
displayname
,
&
proto
))
{
prefix
(
inputfilename
,
lineno
);
baddisplayname
(
displayname
,
argv
[
0
]);
errors
++
;
continue
;
}
status
=
0
;
for
(
l
=
xauth_head
;
l
;
l
=
next
)
{
next
=
l
->
next
;
if
(
match_auth_dpy
(
&
proto
,
l
->
auth
))
{
if
(
yfunc
)
{
status
=
(
*
yfunc
)
(
inputfilename
,
lineno
,
l
->
auth
,
data
);
if
(
status
<
0
)
break
;
}
}
else
{
if
(
nfunc
)
{
status
=
(
*
nfunc
)
(
inputfilename
,
lineno
,
l
->
auth
,
data
);
if
(
status
<
0
)
break
;
}
}
}
if
(
proto
.
address
)
free
(
proto
.
address
);
if
(
proto
.
number
)
free
(
proto
.
number
);
if
(
status
<
0
)
{
errors
-=
status
;
/* since status is negative */
break
;
}
}
return
errors
;
}
/* ARGSUSED */
static
int
remove_entry
(
char
*
inputfilename
,
int
lineno
,
Xauth
*
auth
,
char
*
data
)
{
int
*
nremovedp
=
(
int
*
)
data
;
AuthList
**
listp
=
&
xauth_head
;
AuthList
*
list
;
/*
* unlink the auth we were asked to
*/
while
((
list
=
*
listp
)
->
auth
!=
auth
)
listp
=
&
list
->
next
;
*
listp
=
list
->
next
;
XauDisposeAuth
(
list
->
auth
);
/* free the auth */
free
(
list
);
/* free the link */
xauth_modified
=
True
;
(
*
nremovedp
)
++
;
return
1
;
}
/*
* action routines
*/
/*
* help
*/
int
print_help
(
FILE
*
fp
,
char
*
cmd
,
char
*
prefix
)
{
CommandTable
*
ct
;
int
n
=
0
;
if
(
!
prefix
)
prefix
=
""
;
if
(
!
cmd
)
{
/* if no cmd, print all help */
for
(
ct
=
command_table
;
ct
->
name
;
ct
++
)
{
fprintf
(
fp
,
"%s%s
\n
"
,
prefix
,
ct
->
helptext
);
n
++
;
}
}
else
{
int
len
=
strlen
(
cmd
);
for
(
ct
=
command_table
;
ct
->
name
;
ct
++
)
{
if
(
strncmp
(
cmd
,
ct
->
name
,
len
)
==
0
)
{
fprintf
(
fp
,
"%s%s
\n
"
,
prefix
,
ct
->
helptext
);
n
++
;
}
}
}
return
n
;
}
static
int
do_help
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
char
*
cmd
=
(
argc
>
1
?
argv
[
1
]
:
NULL
);
int
n
;
n
=
print_help
(
stdout
,
cmd
,
" "
);
/* a nice amount */
if
(
n
<
0
||
(
n
==
0
&&
!
cmd
))
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"internal error with help"
);
if
(
cmd
)
{
fprintf
(
stderr
,
" on command
\"
%s
\"
"
,
cmd
);
}
fprintf
(
stderr
,
"
\n
"
);
return
1
;
}
if
(
n
==
0
)
{
prefix
(
inputfilename
,
lineno
);
/* already know that cmd is set in this case */
fprintf
(
stderr
,
"no help for noexistent command
\"
%s
\"\n
"
,
cmd
);
}
return
0
;
}
/*
* questionmark
*/
/* ARGSUSED */
static
int
do_questionmark
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
CommandTable
*
ct
;
int
i
;
#define WIDEST_COLUMN 72
int
col
=
WIDEST_COLUMN
;
printf
(
"Commands:
\n
"
);
for
(
ct
=
command_table
;
ct
->
name
;
ct
++
)
{
if
((
col
+
ct
->
maxlen
)
>
WIDEST_COLUMN
)
{
if
(
ct
!=
command_table
)
{
putc
(
'\n'
,
stdout
);
}
fputs
(
" "
,
stdout
);
col
=
8
;
/* length of string above */
}
fputs
(
ct
->
name
,
stdout
);
col
+=
ct
->
maxlen
;
for
(
i
=
ct
->
maxlen
;
i
<
COMMAND_NAMES_PADDED_WIDTH
;
i
++
)
{
putc
(
' '
,
stdout
);
col
++
;
}
}
if
(
col
!=
0
)
{
putc
(
'\n'
,
stdout
);
}
/* allow bad lines since this is help */
return
0
;
}
/*
* list [displayname ...]
*/
static
int
do_list
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
struct
_list_data
ld
;
ld
.
fp
=
stdout
;
ld
.
numeric
=
(
argv
[
0
][
0
]
==
'n'
);
if
(
argc
==
1
)
{
register
AuthList
*
l
;
if
(
xauth_head
)
{
for
(
l
=
xauth_head
;
l
;
l
=
l
->
next
)
{
dump_entry
(
inputfilename
,
lineno
,
l
->
auth
,
(
char
*
)
&
ld
);
}
}
return
0
;
}
return
iterdpy
(
inputfilename
,
lineno
,
1
,
argc
,
argv
,
dump_entry
,
NULL
,
(
char
*
)
&
ld
);
return
0
;
}
/*
* merge filename [filename ...]
*/
static
int
do_merge
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
int
i
;
int
errors
=
0
;
AuthList
*
head
,
*
tail
,
*
listhead
,
*
listtail
;
int
nentries
,
nnew
,
nrepl
;
Bool
numeric
=
False
;
if
(
argc
<
2
)
{
prefix
(
inputfilename
,
lineno
);
badcommandline
(
argv
[
0
]);
return
1
;
}
if
(
argv
[
0
][
0
]
==
'n'
)
numeric
=
True
;
listhead
=
listtail
=
NULL
;
for
(
i
=
1
;
i
<
argc
;
i
++
)
{
char
*
filename
=
argv
[
i
];
FILE
*
fp
;
Bool
used_stdin
=
False
;
fp
=
open_file
(
&
filename
,
numeric
?
"r"
:
"rb"
,
&
used_stdin
,
inputfilename
,
lineno
,
argv
[
0
]);
if
(
!
fp
)
{
errors
++
;
continue
;
}
head
=
tail
=
NULL
;
nentries
=
read_auth_entries
(
fp
,
numeric
,
&
head
,
&
tail
);
if
(
nentries
==
0
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unable to read any entries from file
\"
%s
\"\n
"
,
filename
);
errors
++
;
}
else
{
/* link it in */
add_to_list
(
listhead
,
listtail
,
head
);
}
if
(
!
used_stdin
)
(
void
)
fclose
(
fp
);
}
/*
* if we have new entries, merge them in (freeing any duplicates)
*/
if
(
listhead
)
{
nentries
=
merge_entries
(
&
xauth_head
,
listhead
,
&
nnew
,
&
nrepl
);
if
(
verbose
)
printf
(
"%d entries read in: %d new, %d replacement%s
\n
"
,
nentries
,
nnew
,
nrepl
,
nrepl
!=
1
?
"s"
:
""
);
if
(
nentries
>
0
)
xauth_modified
=
True
;
}
return
0
;
}
/*
* extract filename displayname [displayname ...]
*/
static
int
do_extract
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
int
errors
;
struct
_extract_data
ed
;
if
(
argc
<
3
)
{
prefix
(
inputfilename
,
lineno
);
badcommandline
(
argv
[
0
]);
return
1
;
}
ed
.
fp
=
NULL
;
ed
.
filename
=
argv
[
1
];
ed
.
numeric
=
(
argv
[
0
][
0
]
==
'n'
);
ed
.
nwritten
=
0
;
ed
.
cmd
=
argv
[
0
];
errors
=
iterdpy
(
inputfilename
,
lineno
,
2
,
argc
,
argv
,
extract_entry
,
NULL
,
(
char
*
)
&
ed
);
if
(
!
ed
.
fp
)
{
fprintf
(
stderr
,
"No matches found, authority file
\"
%s
\"
not written
\n
"
,
ed
.
filename
);
}
else
{
if
(
verbose
)
{
printf
(
"%d entries written to
\"
%s
\"\n
"
,
ed
.
nwritten
,
ed
.
filename
);
}
if
(
!
ed
.
used_stdout
)
{
(
void
)
fclose
(
ed
.
fp
);
}
}
return
errors
;
}
/*
* add displayname protocolname hexkey
*/
static
int
do_add
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
int
n
,
nnew
,
nrepl
;
int
len
;
char
*
dpyname
;
char
*
protoname
;
char
*
hexkey
;
char
*
key
;
Xauth
*
auth
;
AuthList
*
list
;
if
(
argc
!=
4
||
!
argv
[
1
]
||
!
argv
[
2
]
||
!
argv
[
3
])
{
prefix
(
inputfilename
,
lineno
);
badcommandline
(
argv
[
0
]);
return
1
;
}
dpyname
=
argv
[
1
];
protoname
=
argv
[
2
];
hexkey
=
argv
[
3
];
len
=
strlen
(
hexkey
);
if
(
hexkey
[
0
]
==
'"'
&&
hexkey
[
len
-
1
]
==
'"'
)
{
key
=
malloc
(
len
-
1
);
strncpy
(
key
,
hexkey
+
1
,
len
-
2
);
len
-=
2
;
}
else
if
(
!
strcmp
(
protoname
,
SECURERPC
)
||
!
strcmp
(
protoname
,
K5AUTH
))
{
key
=
malloc
(
len
+
1
);
strcpy
(
key
,
hexkey
);
}
else
{
len
=
cvthexkey
(
hexkey
,
&
key
);
if
(
len
<
0
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"key contains odd number of or non-hex characters
\n
"
);
return
1
;
}
}
auth
=
(
Xauth
*
)
malloc
(
sizeof
(
Xauth
));
if
(
!
auth
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unable to allocate %ld bytes for Xauth structure
\n
"
,
(
unsigned
long
)
sizeof
(
Xauth
));
free
(
key
);
return
1
;
}
if
(
!
get_displayname_auth
(
dpyname
,
auth
))
{
prefix
(
inputfilename
,
lineno
);
baddisplayname
(
dpyname
,
argv
[
0
]);
free
(
auth
);
free
(
key
);
return
1
;
}
/*
* allow an abbreviation for common protocol names
*/
if
(
strcmp
(
protoname
,
DEFAULT_PROTOCOL_ABBREV
)
==
0
)
{
protoname
=
DEFAULT_PROTOCOL
;
}
auth
->
name_length
=
strlen
(
protoname
);
auth
->
name
=
copystring
(
protoname
,
auth
->
name_length
);
if
(
!
auth
->
name
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unable to allocate %d character protocol name
\n
"
,
auth
->
name_length
);
free
(
auth
);
free
(
key
);
return
1
;
}
auth
->
data_length
=
len
;
auth
->
data
=
key
;
list
=
(
AuthList
*
)
malloc
(
sizeof
(
AuthList
));
if
(
!
list
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unable to allocate %ld bytes for auth list
\n
"
,
(
unsigned
long
)
sizeof
(
AuthList
));
free
(
auth
);
free
(
key
);
free
(
auth
->
name
);
return
1
;
}
list
->
next
=
NULL
;
list
->
auth
=
auth
;
/*
* merge it in; note that merge will deal with allocation
*/
n
=
merge_entries
(
&
xauth_head
,
list
,
&
nnew
,
&
nrepl
);
if
(
n
<=
0
)
{
prefix
(
inputfilename
,
lineno
);
fprintf
(
stderr
,
"unable to merge in added record
\n
"
);
return
1
;
}
xauth_modified
=
True
;
return
0
;
}
/*
* remove displayname
*/
static
int
do_remove
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
int
nremoved
=
0
;
int
errors
;
if
(
argc
<
2
)
{
prefix
(
inputfilename
,
lineno
);
badcommandline
(
argv
[
0
]);
return
1
;
}
errors
=
iterdpy
(
inputfilename
,
lineno
,
1
,
argc
,
argv
,
remove_entry
,
NULL
,
(
char
*
)
&
nremoved
);
if
(
verbose
)
printf
(
"%d entries removed
\n
"
,
nremoved
);
return
errors
;
}
/*
* info
*/
static
int
do_info
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
int
n
;
AuthList
*
l
;
if
(
argc
!=
1
)
{
prefix
(
inputfilename
,
lineno
);
badcommandline
(
argv
[
0
]);
return
1
;
}
for
(
l
=
xauth_head
,
n
=
0
;
l
;
l
=
l
->
next
,
n
++
)
;
printf
(
"Authority file: %s
\n
"
,
xauth_filename
?
xauth_filename
:
"(none)"
);
printf
(
"File new: %s
\n
"
,
xauth_existed
?
No
:
Yes
);
printf
(
"File locked: %s
\n
"
,
xauth_locked
?
No
:
Yes
);
printf
(
"Number of entries: %d
\n
"
,
n
);
printf
(
"Changes honored: %s
\n
"
,
xauth_allowed
?
Yes
:
No
);
printf
(
"Changes made: %s
\n
"
,
xauth_modified
?
Yes
:
No
);
printf
(
"Current input: %s:%d
\n
"
,
inputfilename
,
lineno
);
return
0
;
}
/*
* exit
*/
static
Bool
alldone
=
False
;
/* ARGSUSED */
static
int
do_exit
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
/* allow bogus stuff */
alldone
=
True
;
return
0
;
}
/*
* quit
*/
/* ARGSUSED */
static
int
do_quit
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
/* allow bogus stuff */
die
(
0
);
/* NOTREACHED */
return
-
1
;
/* for picky compilers */
}
/*
* source filename
*/
static
int
do_source
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
)
{
char
*
script
;
char
buf
[
BUFSIZ
];
FILE
*
fp
;
Bool
used_stdin
=
False
;
int
len
;
int
errors
=
0
,
status
;
int
sublineno
=
0
;
char
**
subargv
;
int
subargc
;
Bool
prompt
=
False
;
/* only true if reading from tty */
if
(
argc
!=
2
||
!
argv
[
1
])
{
prefix
(
inputfilename
,
lineno
);
badcommandline
(
argv
[
0
]);
return
1
;
}
script
=
argv
[
1
];
fp
=
open_file
(
&
script
,
"r"
,
&
used_stdin
,
inputfilename
,
lineno
,
argv
[
0
]);
if
(
!
fp
)
{
return
1
;
}
if
(
verbose
&&
used_stdin
&&
isatty
(
fileno
(
fp
)))
prompt
=
True
;
while
(
!
alldone
)
{
buf
[
0
]
=
'\0'
;
if
(
prompt
)
{
printf
(
"xauth> "
);
fflush
(
stdout
);
}
if
(
fgets
(
buf
,
sizeof
buf
,
fp
)
==
NULL
)
break
;
sublineno
++
;
len
=
strlen
(
buf
);
if
(
len
==
0
||
buf
[
0
]
==
'#'
)
continue
;
if
(
buf
[
len
-
1
]
!=
'\n'
)
{
prefix
(
script
,
sublineno
);
fprintf
(
stderr
,
"line too long
\n
"
);
errors
++
;
break
;
}
buf
[
--
len
]
=
'\0'
;
/* remove new line */
subargv
=
split_into_words
(
buf
,
&
subargc
);
if
(
subargv
)
{
status
=
process_command
(
script
,
sublineno
,
subargc
,
subargv
);
free
((
char
*
)
subargv
);
errors
+=
status
;
}
else
{
prefix
(
script
,
sublineno
);
fprintf
(
stderr
,
"unable to break line into words
\n
"
);
errors
++
;
}
}
if
(
!
used_stdin
)
{
(
void
)
fclose
(
fp
);
}
return
errors
;
}
/*static int
static int x_protocol_error;
catch_x_protocol_error(Display *dpy, XErrorEvent *errevent)
{
char buf[80];
XGetErrorText(dpy, errevent->error_code, buf, sizeof (buf));
fprintf(stderr, "%s\n", buf);
x_protocol_error = errevent->error_code;
return 1;
}
*/
/*
* generate
*/
/*static int
do_generate(char *inputfilename, int lineno, int argc, char **argv)
{
char *displayname;
int major_version, minor_version;
XSecurityAuthorization id_return;
Xauth *auth_in, *auth_return;
XSecurityAuthorizationAttributes attributes;
unsigned long attrmask = 0;
Display *dpy;
int status;
char *args[4];
char *protoname = ".";
int i;
int authdatalen = 0;
char *hexdata;
char *authdata = NULL;
if (argc < 2 || !argv[1]) {
prefix (inputfilename, lineno);
badcommandline (argv[0]);
return 1;
}
displayname = argv[1];
if (argc > 2) {
protoname = argv[2];
}
for (i = 3; i < argc; i++) {
if (0 == strcmp(argv[i], "timeout")) {
if (++i == argc) {
prefix (inputfilename, lineno);
badcommandline (argv[i-1]);
return 1;
}
attributes.timeout = atoi(argv[i]);
attrmask |= XSecurityTimeout;
} else if (0 == strcmp(argv[i], "trusted")) {
attributes.trust_level = XSecurityClientTrusted;
attrmask |= XSecurityTrustLevel;
} else if (0 == strcmp(argv[i], "untrusted")) {
attributes.trust_level = XSecurityClientUntrusted;
attrmask |= XSecurityTrustLevel;
} else if (0 == strcmp(argv[i], "group")) {
if (++i == argc) {
prefix (inputfilename, lineno);
badcommandline (argv[i-1]);
return 1;
}
attributes.group = atoi(argv[i]);
attrmask |= XSecurityGroup;
} else if (0 == strcmp(argv[i], "data")) {
if (++i == argc) {
prefix (inputfilename, lineno);
badcommandline (argv[i-1]);
return 1;
}
hexdata = argv[i];
authdatalen = strlen(hexdata);
if (hexdata[0] == '"' && hexdata[authdatalen-1] == '"') {
authdata = malloc(authdatalen-1);
strncpy(authdata, hexdata+1, authdatalen-2);
authdatalen -= 2;
} else {
authdatalen = cvthexkey (hexdata, &authdata);
if (authdatalen < 0) {
prefix (inputfilename, lineno);
fprintf (stderr,
"data contains odd number of or non-hex characters\n");
return 1;
}
}
} else {
prefix (inputfilename, lineno);
badcommandline (argv[i]);
return 1;
}
}
// generate authorization using the Security extension /
dpy = XOpenDisplay (displayname);
if (!dpy) {
prefix (inputfilename, lineno);
fprintf (stderr, "unable to open display \"%s\".\n", displayname);
return 1;
}
status = XSecurityQueryExtension(dpy, &major_version, &minor_version);
if (!status)
{
prefix (inputfilename, lineno);
fprintf (stderr, "couldn't query Security extension on display \"%s\"\n",
displayname);
return 1;
}
// fill in input Xauth struct /
auth_in = XSecurityAllocXauth();
if (strcmp (protoname, DEFAULT_PROTOCOL_ABBREV) == 0) {
auth_in->name = DEFAULT_PROTOCOL;
}
else
auth_in->name = protoname;
auth_in->name_length = strlen(auth_in->name);
auth_in->data = authdata;
auth_in->data_length = authdatalen;
x_protocol_error = 0;
XSetErrorHandler(catch_x_protocol_error);
auth_return = XSecurityGenerateAuthorization(dpy, auth_in, attrmask,
&attributes, &id_return);
XSync(dpy, False);
if (!auth_return || x_protocol_error)
{
prefix (inputfilename, lineno);
fprintf (stderr, "couldn't generate authorization\n");
return 1;
}
if (verbose)
printf("authorization id is %ld\n", id_return);
// create a fake input line to give to do_add /
args[0] = "add";
args[1] = displayname;
args[2] = auth_in->name;
args[3] = bintohex(auth_return->data_length, auth_return->data);
status = do_add(inputfilename, lineno, 4, args);
if (authdata) free(authdata);
XSecurityFreeXauth(auth_in);
XSecurityFreeXauth(auth_return);
free(args[3]); // hex data /
XCloseDisplay(dpy);
return status;
}
*/
nx-X11/programs/nxauth/xauth.c
deleted
100644 → 0
View file @
a3a29528
/*
* $Xorg: xauth.c,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
*
* xauth - manipulate authorization file
*
*
Copyright 1989,1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
* *
* Author: Jim Fulton, MIT X Consortium
*/
/* $XFree86: xc/programs/xauth/xauth.c,v 1.5 2001/12/14 20:01:15 dawes Exp $ */
/**************************************************************************/
/* */
/* Copyright (c) 2001, 2010 NoMachine, http://www.nomachine.com/. */
/* */
/* NXAUTH, NX protocol compression and NX extensions to this software */
/* are copyright of NoMachine. Redistribution and use of the present */
/* software is allowed according to terms specified in the file LICENSE */
/* which comes in the source distribution. */
/* */
/* Check http://www.nomachine.com/licensing.html for applicability. */
/* */
/* NX and NoMachine are trademarks of Medialogic S.p.A. */
/* */
/* All rights reserved. */
/* */
/**************************************************************************/
#include "xauth.h"
/*
* global data
*/
char
*
ProgramName
;
/* argv[0], set at top of main() */
int
verbose
=
-
1
;
/* print certain messages */
Bool
ignore_locks
=
True
;
/* for error recovery */
Bool
break_locks
=
False
;
/* for error recovery */
/*
* local data
*/
static
char
*
authfilename
=
NULL
;
/* filename of cookie file */
static
char
*
defcmds
[]
=
{
"source"
,
"-"
,
NULL
};
/* default command */
static
int
ndefcmds
=
2
;
static
char
*
defsource
=
"(stdin)"
;
/*
* utility routines
*/
static
void
usage
(
void
)
{
static
char
*
prefixmsg
[]
=
{
""
,
"where options include:"
,
" -f authfilename name of authority file to use"
,
" -v turn on extra messages"
,
" -q turn off extra messages"
,
" -i ignore locks on authority file"
,
" -b break locks on authority file"
,
""
,
"and commands have the following syntax:"
,
""
,
NULL
};
static
char
*
suffixmsg
[]
=
{
"A dash may be used with the
\"
merge
\"
and
\"
source
\"
to read from the"
,
"standard input. Commands beginning with
\"
n
\"
use numeric format."
,
""
,
NULL
};
char
**
msg
;
fprintf
(
stderr
,
"usage: %s [-options ...] [command arg ...]
\n
"
,
ProgramName
);
for
(
msg
=
prefixmsg
;
*
msg
;
msg
++
)
{
fprintf
(
stderr
,
"%s
\n
"
,
*
msg
);
}
print_help
(
stderr
,
NULL
,
" "
);
/* match prefix indentation */
fprintf
(
stderr
,
"
\n
"
);
for
(
msg
=
suffixmsg
;
*
msg
;
msg
++
)
{
fprintf
(
stderr
,
"%s
\n
"
,
*
msg
);
}
exit
(
1
);
}
/*
* The main routine - parses command line and calls action procedures
*/
int
main
(
int
argc
,
char
*
argv
[])
{
int
i
;
char
*
sourcename
=
defsource
;
char
**
arglist
=
defcmds
;
int
nargs
=
ndefcmds
;
int
status
;
ProgramName
=
argv
[
0
];
for
(
i
=
1
;
i
<
argc
;
i
++
)
{
char
*
arg
=
argv
[
i
];
if
(
arg
[
0
]
==
'-'
)
{
char
*
flag
;
for
(
flag
=
(
arg
+
1
);
*
flag
;
flag
++
)
{
switch
(
*
flag
)
{
case
'f'
:
/* -f authfilename */
if
(
++
i
>=
argc
)
usage
();
authfilename
=
argv
[
i
];
continue
;
case
'v'
:
/* -v */
verbose
=
1
;
continue
;
case
'q'
:
/* -q */
verbose
=
0
;
continue
;
case
'b'
:
/* -b */
break_locks
=
True
;
continue
;
case
'i'
:
/* -i */
ignore_locks
=
True
;
continue
;
default:
usage
();
}
}
}
else
{
sourcename
=
"(argv)"
;
nargs
=
argc
-
i
;
arglist
=
argv
+
i
;
if
(
verbose
==
-
1
)
verbose
=
0
;
break
;
}
}
if
(
verbose
==
-
1
)
{
/* set default, don't junk stdout */
verbose
=
(
isatty
(
fileno
(
stdout
))
!=
0
);
}
if
(
!
authfilename
)
{
authfilename
=
XauFileName
();
/* static name, do not free */
if
(
!
authfilename
)
{
fprintf
(
stderr
,
"%s: unable to generate an authority file name
\n
"
,
ProgramName
);
exit
(
1
);
}
}
if
(
auth_initialize
(
authfilename
)
!=
0
)
{
/* error message printed in auth_initialize */
exit
(
1
);
}
status
=
process_command
(
sourcename
,
1
,
nargs
,
arglist
);
(
void
)
auth_finalize
();
exit
((
status
!=
0
)
?
1
:
0
);
}
nx-X11/programs/nxauth/xauth.h
deleted
100644 → 0
View file @
a3a29528
/*
* $Xorg: xauth.h,v 1.4 2001/02/09 02:05:38 xorgcvs Exp $
*
*
Copyright 1989, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
* *
* Author: Jim Fulton, MIT X Consortium
*/
/* $XFree86: xc/programs/xauth/xauth.h,v 1.6 2001/12/14 20:01:15 dawes Exp $ */
#include <stdio.h>
#include <nx-X11/Xos.h>
#include <nx-X11/Xauth.h>
#include <nx-X11/Xfuncs.h>
#ifndef True
typedef
int
Bool
;
#define False 0
#define True 1
#endif
extern
char
*
ProgramName
;
#include <stdlib.h>
extern
char
*
get_hostname
(
Xauth
*
auth
);
extern
char
*
get_address_info
(
int
family
,
char
*
fulldpyname
,
int
prefix
,
char
*
host
,
int
*
lenp
);
extern
char
*
copystring
(
char
*
src
,
int
len
);
extern
char
*
get_local_hostname
(
char
*
buf
,
int
maxlen
);
extern
Bool
parse_displayname
(
char
*
displayname
,
int
*
familyp
,
char
**
hostp
,
int
*
dpynump
,
int
*
scrnump
,
char
**
restp
);
extern
int
auth_initialize
(
char
*
authfilename
);
extern
int
auth_finalize
(
void
);
extern
int
process_command
(
char
*
inputfilename
,
int
lineno
,
int
argc
,
char
**
argv
);
extern
int
dump_numeric
(
FILE
*
fp
,
Xauth
*
auth
);
extern
int
print_help
(
FILE
*
fp
,
char
*
cmd
,
char
*
prefix
);
extern
int
verbose
;
extern
Bool
ignore_locks
;
extern
Bool
break_locks
;
nx-libs.spec
View file @
b214c73b
...
...
@@ -391,18 +391,6 @@ related requests locally, ensuring that the most common source of
round-trips are nearly reduced to zero.
%package -n nxauth
Group: Applications/System
Summary: NX Auth
%description -n nxauth
NX is a software suite which implements very efficient compression of
the X11 protocol. This increases performance when using X
applications over a network, especially a slow one.
This package provides the NX xauth binary.
%package -n nxproxy
Group: Applications/System
Summary: NX Proxy
...
...
@@ -669,13 +657,6 @@ rm -r %{buildroot}%{_includedir}/nx-X11/Xtrans
%{_datadir}/nx/rgb
%{_datadir}/man/man1/nxagent.1*
%files -n nxauth
%defattr(-,root,root)
%{_bindir}/nxauth
%dir %{_libdir}/nx/bin
%{_libdir}/nx/bin/nxauth
%{_datadir}/man/man1/nxauth.1*
%files -n nxproxy
%defattr(-,root,root)
%{_bindir}/nxproxy
...
...
roll-tarballs.sh
View file @
b214c73b
...
...
@@ -100,7 +100,7 @@ if [ "x$MODE" = "xfull" ]; then
echo
"
${
file
##*/
}
"
>>
"doc/applied-patches/series"
done
else
rm
-f
"bin/
"
{
nxagent,nxauth
}
rm
-f
"bin/
nxagent"
rm
-Rf
"nxcompshad"
*
rm
-Rf
"nxcompext"
*
rm
-Rf
"nx-X11"
*
...
...
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