o moved from GNU General Public License to Apache License, Version 2.0
o applied new coding standards to all .c files o moved some files around
This commit is contained in:
@@ -1,372 +1,176 @@
|
||||
Apache License, Version 2.0
|
||||
|
||||
special clause for libxrdp and librdp, both based on rdesktop
|
||||
these libraries link to openssl
|
||||
Version 2.0, January 2004
|
||||
|
||||
This software is released under the GNU General Public License
|
||||
(reproduced below) with the additional exemption that compiling,
|
||||
linking, and/or using OpenSSL together with this software is
|
||||
allowed.
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
---
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
special clause for xrdp, that main executable
|
||||
for linking with proprietary modules
|
||||
1. Definitions.
|
||||
|
||||
Linking this library statically or dynamically with other modules
|
||||
is making a combined work based on this library. Thus, the terms
|
||||
and conditions of the GNU General Public License cover the whole
|
||||
combination.
|
||||
"License" shall mean the terms and conditions for use, reproduction, and
|
||||
distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
As a special exception, the copyright holders of this library
|
||||
give you permission to link this library with independent modules
|
||||
to produce an executable, regardless of the license terms of
|
||||
these independent modules, and to copy and distribute the resulting
|
||||
executable under terms of your choice, provided that you also meet,
|
||||
for each linked independent module, the terms and conditions of the
|
||||
license of that module. An independent module is a module which is
|
||||
not derived from or based on this library. If you modify this
|
||||
library, you may extend this exception to your version of the
|
||||
library, but you are not obliged to do so. If you do not wish
|
||||
to do so, delete this exception statement from your version.
|
||||
"Licensor" shall mean the copyright owner or entity authorized by the
|
||||
copyright owner that is granting the License.
|
||||
|
||||
---
|
||||
"Legal Entity" shall mean the union of the acting entity and all other
|
||||
entities that control, are controlled by, or are under common control
|
||||
with that entity. For the purposes of this definition, "control" means
|
||||
(i) the power, direct or indirect, to cause the direction or management
|
||||
of such entity, whether by contract or otherwise, or (ii) ownership of
|
||||
fifty percent (50%) or more of the outstanding shares, or
|
||||
(iii) beneficial ownership of such entity.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
"You" (or "Your") shall mean an individual or Legal Entity exercising
|
||||
permissions granted by this License.
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation source,
|
||||
and configuration files.
|
||||
|
||||
Preamble
|
||||
"Object" form shall mean any form resulting from mechanical transformation
|
||||
or translation of a Source form, including but not limited to compiled
|
||||
object code, generated documentation, and conversions to other media types.
|
||||
|
||||
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 Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
"Work" shall mean the work of authorship, whether in Source or Object form,
|
||||
made available under the License, as indicated by a copyright notice that is
|
||||
included in or attached to the work (an example is provided in the Appendix below).
|
||||
|
||||
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.
|
||||
"Derivative Works" shall mean any work, whether in Source or Object form,
|
||||
that is based on (or derived from) the Work and for which the editorial
|
||||
revisions, annotations, elaborations, or other modifications represent, as a
|
||||
whole, an original work of authorship. For the purposes of this License,
|
||||
Derivative Works shall not include works that remain separable from, or
|
||||
merely link (or bind by name) to the interfaces of, the Work and
|
||||
Derivative Works thereof.
|
||||
|
||||
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.
|
||||
"Contribution" shall mean any work of authorship, including the original
|
||||
version of the Work and any modifications or additions to that Work or Derivative
|
||||
Works thereof, that is intentionally submitted to Licensor for inclusion in the
|
||||
Work by the copyright owner or by an individual or Legal Entity authorized to
|
||||
submit on behalf of the copyright owner. For the purposes of this definition,
|
||||
"submitted" means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems, and
|
||||
issue tracking systems that are managed by, or on behalf of, the Licensor for
|
||||
the purpose of discussing and improving the Work, but excluding communication
|
||||
that is conspicuously marked or otherwise designated in writing by the copyright
|
||||
owner as "Not a Contribution."
|
||||
|
||||
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.
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
|
||||
of whom a Contribution has been received by Licensor and subsequently incorporated
|
||||
within the Work.
|
||||
|
||||
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.
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of this License,
|
||||
each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
||||
no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
|
||||
Derivative Works of, publicly display, publicly perform, sublicense, and distribute
|
||||
the Work and such Derivative Works in Source or Object form.
|
||||
|
||||
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.
|
||||
3. Grant of Patent License. Subject to the terms and conditions of this License,
|
||||
each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
||||
no-charge, royalty-free, irrevocable (except as stated in this section) patent
|
||||
license to make, have made, use, offer to sell, sell, import, and otherwise transfer
|
||||
the Work, where such license applies only to those patent claims licensable by such
|
||||
Contributor that are necessarily infringed by their Contribution(s) alone or by
|
||||
combination of their Contribution(s) with the Work to which such Contribution(s) was
|
||||
submitted. If You institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution
|
||||
incorporated within the Work constitutes direct or contributory patent infringement,
|
||||
then any patent licenses granted to You under this License for that Work shall
|
||||
terminate as of the date such litigation is filed.
|
||||
|
||||
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.
|
||||
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative
|
||||
Works thereof in any medium, with or without modifications, and in Source or Object
|
||||
form, provided that You meet the following conditions:
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
You must give any other recipients of the Work or Derivative Works a copy of this
|
||||
License; and
|
||||
|
||||
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".
|
||||
You must cause any modified files to carry prominent notices stating that You changed
|
||||
the files; and
|
||||
|
||||
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.
|
||||
You must retain, in the Source form of any Derivative Works that You distribute,
|
||||
all copyright, patent, trademark, and attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of the Derivative Works; and
|
||||
|
||||
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.
|
||||
If the Work includes a "NOTICE" text file as part of its distribution, then any
|
||||
Derivative Works that You distribute must include a readable copy of the attribution
|
||||
notices contained within such NOTICE file, excluding those notices that do not pertain
|
||||
to any part of the Derivative Works, in at least one of the following places: within a
|
||||
NOTICE text file distributed as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or, within a display
|
||||
generated by the Derivative Works, if and wherever such third-party notices normally
|
||||
appear. The contents of the NOTICE file are for informational purposes only and do not
|
||||
modify the License. You may add Your own attribution notices within Derivative Works
|
||||
that You distribute, alongside or as an addendum to the NOTICE text from the Work,
|
||||
provided that such additional attribution notices cannot be construed as modifying
|
||||
the License. You may add Your own copyright statement to Your modifications and may
|
||||
provide additional or different license terms and conditions for use, reproduction,
|
||||
or distribution of Your modifications, or for any such Derivative Works as a whole,
|
||||
provided Your use, reproduction, and distribution of the Work otherwise complies
|
||||
with the conditions stated in this License.
|
||||
|
||||
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.
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution
|
||||
intentionally submitted for inclusion in the Work by You to the Licensor shall be under
|
||||
the terms and conditions of this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify the terms of any
|
||||
separate license agreement you may have executed with Licensor regarding such Contributions.
|
||||
|
||||
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:
|
||||
6. Trademarks. This License does not grant permission to use the trade names, trademarks,
|
||||
service marks, or product names of the Licensor, except as required for reasonable and
|
||||
customary use in describing the origin of the Work and reproducing the content of
|
||||
the NOTICE file.
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing,
|
||||
Licensor provides the Work (and each Contributor provides its Contributions) on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
|
||||
including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
|
||||
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
|
||||
determining the appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
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.
|
||||
8. Limitation of Liability. In no event and under no legal theory, whether in tort
|
||||
(including negligence), contract, or otherwise, unless required by applicable law
|
||||
(such as deliberate and grossly negligent acts) or agreed to in writing, shall any
|
||||
Contributor be liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a result of this
|
||||
License or out of the use or inability to use the Work (including but not limited to
|
||||
damages for loss of goodwill, work stoppage, computer failure or malfunction, or any
|
||||
and all other commercial damages or losses), even if such Contributor has been advised
|
||||
of the possibility of such damages.
|
||||
|
||||
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.
|
||||
9. Accepting Warranty or Additional Liability. While redistributing the Work or
|
||||
Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance
|
||||
of support, warranty, indemnity, or other liability obligations and/or rights consistent
|
||||
with this License. However, in accepting such obligations, You may act only on Your
|
||||
own behalf and on Your sole responsibility, not on behalf of any other Contributor,
|
||||
and only if You agree to indemnify, defend, and hold each Contributor harmless for any
|
||||
liability incurred by, or claims asserted against, such Contributor by reason of your
|
||||
accepting any such warranty or additional liability.
|
||||
|
||||
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.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
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.
|
||||
APPENDIX: How to apply the Apache License to your work
|
||||
To apply the Apache License to your work, attach the following boilerplate notice,
|
||||
with the fields enclosed by brackets "[]" replaced with your own identifying
|
||||
information. (Don't include the brackets!) The text should be enclosed in the
|
||||
appropriate comment syntax for the file format. We also recommend that a file or class
|
||||
name and description of purpose be included on the same "printed page" as the
|
||||
copyright notice for easier identification within third-party archives.
|
||||
|
||||
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:
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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,
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
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,
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
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.)
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
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
|
||||
|
||||
Appendix: 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) 19yy <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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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 Library General
|
||||
Public License instead of this License.
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,59 @@
|
||||
|
||||
# detached brackets
|
||||
--style=allman
|
||||
|
||||
# 4 spaces, no tabs
|
||||
--indent=spaces=4
|
||||
|
||||
# for C++ files only
|
||||
--indent-classes
|
||||
|
||||
# Indent 'switch' blocks so that the 'case X:' statements are indented in the switch block.
|
||||
# The entire case block is indented.
|
||||
--indent-switches
|
||||
|
||||
# Add extra indentation to namespace blocks. This option has no effect on Java files.
|
||||
--indent-namespaces
|
||||
|
||||
# Converts tabs into spaces in the non-indentation part of the line.
|
||||
--convert-tabs
|
||||
|
||||
# requires --convert-tabs to work properly
|
||||
--indent-preprocessor
|
||||
|
||||
--indent-col1-comments
|
||||
|
||||
--min-conditional-indent=2
|
||||
|
||||
--max-instatement-indent=40
|
||||
|
||||
# Pad empty lines around header blocks (e.g. 'if', 'for', 'while'...).
|
||||
--break-blocks
|
||||
|
||||
# Insert space padding around operators.
|
||||
--pad-oper
|
||||
|
||||
# Insert space padding after paren headers only (e.g. 'if', 'for', 'while'...).
|
||||
--pad-header
|
||||
|
||||
|
||||
# Add brackets to unbracketed one line conditional statements (e.g. 'if', 'for', 'while'...).
|
||||
--add-brackets
|
||||
|
||||
--align-pointer=name
|
||||
|
||||
# Do not retain a backup of the original file. The original file is purged after it is formatted.
|
||||
--suffix=none
|
||||
|
||||
# For each directory in the command line, process all subdirectories recursively.
|
||||
--recursive
|
||||
|
||||
# Preserve the original file's date and time modified.
|
||||
--preserve-date
|
||||
|
||||
# Formatted files display mode. Display only the files that have been formatted.
|
||||
# Do not display files that are unchanged.
|
||||
--formatted
|
||||
|
||||
--lineend=linux
|
||||
|
||||
+17
-22
@@ -1,25 +1,20 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if !defined(ARCH_H)
|
||||
#define ARCH_H
|
||||
|
||||
+405
-327
@@ -38,393 +38,471 @@ static unsigned long KnL[32] = { 0L };
|
||||
static unsigned long KnR[32] = { 0L };
|
||||
static unsigned long Kn3[32] = { 0L };
|
||||
static unsigned char Df_Key[24] = {
|
||||
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
|
||||
0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
|
||||
0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 };
|
||||
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
|
||||
0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
|
||||
0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 };
|
||||
*/
|
||||
|
||||
static unsigned short bytebit[8] = {
|
||||
01, 02, 04, 010, 020, 040, 0100, 0200 };
|
||||
static unsigned short bytebit[8] =
|
||||
{
|
||||
01, 02, 04, 010, 020, 040, 0100, 0200
|
||||
};
|
||||
|
||||
static unsigned long bigbyte[24] = {
|
||||
0x800000L, 0x400000L, 0x200000L, 0x100000L,
|
||||
0x80000L, 0x40000L, 0x20000L, 0x10000L,
|
||||
0x8000L, 0x4000L, 0x2000L, 0x1000L,
|
||||
0x800L, 0x400L, 0x200L, 0x100L,
|
||||
0x80L, 0x40L, 0x20L, 0x10L,
|
||||
0x8L, 0x4L, 0x2L, 0x1L };
|
||||
static unsigned long bigbyte[24] =
|
||||
{
|
||||
0x800000L, 0x400000L, 0x200000L, 0x100000L,
|
||||
0x80000L, 0x40000L, 0x20000L, 0x10000L,
|
||||
0x8000L, 0x4000L, 0x2000L, 0x1000L,
|
||||
0x800L, 0x400L, 0x200L, 0x100L,
|
||||
0x80L, 0x40L, 0x20L, 0x10L,
|
||||
0x8L, 0x4L, 0x2L, 0x1L
|
||||
};
|
||||
|
||||
/* Use the key schedule specified in the Standard (ANSI X3.92-1981). */
|
||||
|
||||
static unsigned char pc1[56] = {
|
||||
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
|
||||
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
|
||||
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
|
||||
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 };
|
||||
static unsigned char pc1[56] =
|
||||
{
|
||||
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
|
||||
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
|
||||
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
|
||||
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3
|
||||
};
|
||||
|
||||
static unsigned char totrot[16] = {
|
||||
1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };
|
||||
static unsigned char totrot[16] =
|
||||
{
|
||||
1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28
|
||||
};
|
||||
|
||||
static unsigned char pc2[48] = {
|
||||
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
|
||||
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
|
||||
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
|
||||
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
|
||||
static unsigned char pc2[48] =
|
||||
{
|
||||
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
|
||||
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
|
||||
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
|
||||
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31
|
||||
};
|
||||
|
||||
/* Thanks to James Gillogly & Phil Karn! */
|
||||
void rfbDesKey(unsigned char *key, int edf)
|
||||
{
|
||||
register int i, j, l, m, n;
|
||||
unsigned char pc1m[56], pcr[56];
|
||||
unsigned long kn[32];
|
||||
register int i, j, l, m, n;
|
||||
unsigned char pc1m[56], pcr[56];
|
||||
unsigned long kn[32];
|
||||
|
||||
for ( j = 0; j < 56; j++ ) {
|
||||
l = pc1[j];
|
||||
m = l & 07;
|
||||
pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
|
||||
}
|
||||
for( i = 0; i < 16; i++ ) {
|
||||
if( edf == DE1 ) m = (15 - i) << 1;
|
||||
else m = i << 1;
|
||||
n = m + 1;
|
||||
kn[m] = kn[n] = 0L;
|
||||
for( j = 0; j < 28; j++ ) {
|
||||
l = j + totrot[i];
|
||||
if( l < 28 ) pcr[j] = pc1m[l];
|
||||
else pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
for( j = 28; j < 56; j++ ) {
|
||||
l = j + totrot[i];
|
||||
if( l < 56 ) pcr[j] = pc1m[l];
|
||||
else pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
for( j = 0; j < 24; j++ ) {
|
||||
if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
|
||||
if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
|
||||
}
|
||||
}
|
||||
cookey(kn);
|
||||
return;
|
||||
}
|
||||
for ( j = 0; j < 56; j++ )
|
||||
{
|
||||
l = pc1[j];
|
||||
m = l & 07;
|
||||
pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
|
||||
}
|
||||
|
||||
for ( i = 0; i < 16; i++ )
|
||||
{
|
||||
if ( edf == DE1 )
|
||||
{
|
||||
m = (15 - i) << 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m = i << 1;
|
||||
}
|
||||
|
||||
n = m + 1;
|
||||
kn[m] = kn[n] = 0L;
|
||||
|
||||
for ( j = 0; j < 28; j++ )
|
||||
{
|
||||
l = j + totrot[i];
|
||||
|
||||
if ( l < 28 )
|
||||
{
|
||||
pcr[j] = pc1m[l];
|
||||
}
|
||||
else
|
||||
{
|
||||
pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
}
|
||||
|
||||
for ( j = 28; j < 56; j++ )
|
||||
{
|
||||
l = j + totrot[i];
|
||||
|
||||
if ( l < 56 )
|
||||
{
|
||||
pcr[j] = pc1m[l];
|
||||
}
|
||||
else
|
||||
{
|
||||
pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
}
|
||||
|
||||
for ( j = 0; j < 24; j++ )
|
||||
{
|
||||
if ( pcr[pc2[j]] )
|
||||
{
|
||||
kn[m] |= bigbyte[j];
|
||||
}
|
||||
|
||||
if ( pcr[pc2[j + 24]] )
|
||||
{
|
||||
kn[n] |= bigbyte[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cookey(kn);
|
||||
return;
|
||||
}
|
||||
|
||||
static void cookey(register unsigned long *raw1)
|
||||
{
|
||||
register unsigned long *cook, *raw0;
|
||||
unsigned long dough[32];
|
||||
register int i;
|
||||
register unsigned long *cook, *raw0;
|
||||
unsigned long dough[32];
|
||||
register int i;
|
||||
|
||||
cook = dough;
|
||||
for( i = 0; i < 16; i++, raw1++ ) {
|
||||
raw0 = raw1++;
|
||||
*cook = (*raw0 & 0x00fc0000L) << 6;
|
||||
*cook |= (*raw0 & 0x00000fc0L) << 10;
|
||||
*cook |= (*raw1 & 0x00fc0000L) >> 10;
|
||||
*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
|
||||
*cook = (*raw0 & 0x0003f000L) << 12;
|
||||
*cook |= (*raw0 & 0x0000003fL) << 16;
|
||||
*cook |= (*raw1 & 0x0003f000L) >> 4;
|
||||
*cook++ |= (*raw1 & 0x0000003fL);
|
||||
}
|
||||
rfbUseKey(dough);
|
||||
return;
|
||||
}
|
||||
cook = dough;
|
||||
|
||||
for ( i = 0; i < 16; i++, raw1++ )
|
||||
{
|
||||
raw0 = raw1++;
|
||||
*cook = (*raw0 & 0x00fc0000L) << 6;
|
||||
*cook |= (*raw0 & 0x00000fc0L) << 10;
|
||||
*cook |= (*raw1 & 0x00fc0000L) >> 10;
|
||||
*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
|
||||
*cook = (*raw0 & 0x0003f000L) << 12;
|
||||
*cook |= (*raw0 & 0x0000003fL) << 16;
|
||||
*cook |= (*raw1 & 0x0003f000L) >> 4;
|
||||
*cook++ |= (*raw1 & 0x0000003fL);
|
||||
}
|
||||
|
||||
rfbUseKey(dough);
|
||||
return;
|
||||
}
|
||||
|
||||
void rfbCPKey(register unsigned long *into)
|
||||
{
|
||||
register unsigned long *from, *endp;
|
||||
register unsigned long *from, *endp;
|
||||
|
||||
from = KnL, endp = &KnL[32];
|
||||
while( from < endp ) *into++ = *from++;
|
||||
return;
|
||||
}
|
||||
from = KnL, endp = &KnL[32];
|
||||
|
||||
while ( from < endp )
|
||||
{
|
||||
*into++ = *from++;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void rfbUseKey(register unsigned long *from)
|
||||
{
|
||||
register unsigned long *to, *endp;
|
||||
register unsigned long *to, *endp;
|
||||
|
||||
to = KnL, endp = &KnL[32];
|
||||
while( to < endp ) *to++ = *from++;
|
||||
return;
|
||||
}
|
||||
to = KnL, endp = &KnL[32];
|
||||
|
||||
while ( to < endp )
|
||||
{
|
||||
*to++ = *from++;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void rfbDes(unsigned char *inblock, unsigned char *outblock)
|
||||
{
|
||||
unsigned long work[2];
|
||||
unsigned long work[2];
|
||||
|
||||
scrunch(inblock, work);
|
||||
desfunc(work, KnL);
|
||||
unscrun(work, outblock);
|
||||
return;
|
||||
}
|
||||
scrunch(inblock, work);
|
||||
desfunc(work, KnL);
|
||||
unscrun(work, outblock);
|
||||
return;
|
||||
}
|
||||
|
||||
static void scrunch(register unsigned char *outof, register unsigned long *into)
|
||||
{
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into++ |= (*outof++ & 0xffL);
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into |= (*outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into++ |= (*outof++ & 0xffL);
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into |= (*outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
|
||||
static void unscrun(register unsigned long *outof, register unsigned char *into)
|
||||
{
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into++ = (unsigned char)( *outof++ & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into = (unsigned char)( *outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into++ = (unsigned char)( *outof++ & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into = (unsigned char)( *outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
|
||||
static unsigned long SP1[64] = {
|
||||
0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
|
||||
0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
|
||||
0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
|
||||
0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
|
||||
0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
|
||||
0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
|
||||
0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
|
||||
0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
|
||||
0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
|
||||
0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
|
||||
0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
|
||||
0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
|
||||
0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
|
||||
0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L };
|
||||
|
||||
static unsigned long SP2[64] = {
|
||||
0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
|
||||
0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
|
||||
0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
|
||||
0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
|
||||
0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
|
||||
0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
|
||||
0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
|
||||
0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
|
||||
0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
|
||||
0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
|
||||
0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
|
||||
0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
|
||||
0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
|
||||
0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
|
||||
0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
|
||||
0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L };
|
||||
|
||||
static unsigned long SP3[64] = {
|
||||
0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
|
||||
0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
|
||||
0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
|
||||
0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
|
||||
0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
|
||||
0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
|
||||
0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
|
||||
0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
|
||||
0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
|
||||
0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
|
||||
0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
|
||||
0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
|
||||
0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
|
||||
0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
|
||||
0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
|
||||
0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L };
|
||||
|
||||
static unsigned long SP4[64] = {
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
|
||||
0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
|
||||
0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
|
||||
0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
|
||||
0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
|
||||
0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
|
||||
0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
|
||||
0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
|
||||
0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L };
|
||||
|
||||
static unsigned long SP5[64] = {
|
||||
0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
|
||||
0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
|
||||
0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
|
||||
0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
|
||||
0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
|
||||
0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
|
||||
0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
|
||||
0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
|
||||
0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
|
||||
0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
|
||||
0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
|
||||
0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
|
||||
0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
|
||||
0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
|
||||
0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
|
||||
0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L };
|
||||
|
||||
static unsigned long SP6[64] = {
|
||||
0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
|
||||
0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
|
||||
0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
|
||||
0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
|
||||
0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
|
||||
0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
|
||||
0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
|
||||
0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
|
||||
0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
|
||||
0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
|
||||
0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
|
||||
0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
|
||||
0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
|
||||
0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L };
|
||||
|
||||
static unsigned long SP7[64] = {
|
||||
0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
|
||||
0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
|
||||
0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
|
||||
0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
|
||||
0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
|
||||
0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
|
||||
0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
|
||||
0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
|
||||
0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
|
||||
0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
|
||||
0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
|
||||
0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
|
||||
0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
|
||||
0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
|
||||
0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
|
||||
0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L };
|
||||
|
||||
static unsigned long SP8[64] = {
|
||||
0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
|
||||
0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
|
||||
0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
|
||||
0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
|
||||
0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
|
||||
0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
|
||||
0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
|
||||
0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
|
||||
0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
|
||||
0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
|
||||
0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
|
||||
0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
|
||||
0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
|
||||
0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
|
||||
0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
|
||||
0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L };
|
||||
|
||||
static void desfunc(register unsigned long* block, register unsigned long *keys)
|
||||
static unsigned long SP1[64] =
|
||||
{
|
||||
register unsigned long fval, work, right, leftt;
|
||||
register int round;
|
||||
0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
|
||||
0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
|
||||
0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
|
||||
0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
|
||||
0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
|
||||
0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
|
||||
0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
|
||||
0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
|
||||
0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
|
||||
0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
|
||||
0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
|
||||
0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
|
||||
0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
|
||||
0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L
|
||||
};
|
||||
|
||||
leftt = block[0];
|
||||
right = block[1];
|
||||
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 4);
|
||||
work = ((leftt >> 16) ^ right) & 0x0000ffffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 16);
|
||||
work = ((right >> 2) ^ leftt) & 0x33333333L;
|
||||
leftt ^= work;
|
||||
right ^= (work << 2);
|
||||
work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 8);
|
||||
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
|
||||
static unsigned long SP2[64] =
|
||||
{
|
||||
0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
|
||||
0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
|
||||
0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
|
||||
0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
|
||||
0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
|
||||
0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
|
||||
0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
|
||||
0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
|
||||
0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
|
||||
0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
|
||||
0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
|
||||
0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
|
||||
0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
|
||||
0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
|
||||
0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
|
||||
0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L
|
||||
};
|
||||
|
||||
for( round = 0; round < 8; round++ ) {
|
||||
work = (right << 28) | (right >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = right ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
leftt ^= fval;
|
||||
work = (leftt << 28) | (leftt >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = leftt ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
right ^= fval;
|
||||
}
|
||||
static unsigned long SP3[64] =
|
||||
{
|
||||
0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
|
||||
0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
|
||||
0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
|
||||
0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
|
||||
0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
|
||||
0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
|
||||
0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
|
||||
0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
|
||||
0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
|
||||
0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
|
||||
0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
|
||||
0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
|
||||
0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
|
||||
0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
|
||||
0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
|
||||
0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L
|
||||
};
|
||||
|
||||
right = (right << 31) | (right >> 1);
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = (leftt << 31) | (leftt >> 1);
|
||||
work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 8);
|
||||
work = ((leftt >> 2) ^ right) & 0x33333333L;
|
||||
right ^= work;
|
||||
leftt ^= (work << 2);
|
||||
work = ((right >> 16) ^ leftt) & 0x0000ffffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 16);
|
||||
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 4);
|
||||
*block++ = right;
|
||||
*block = leftt;
|
||||
return;
|
||||
}
|
||||
static unsigned long SP4[64] =
|
||||
{
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
|
||||
0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
|
||||
0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
|
||||
0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
|
||||
0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
|
||||
0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
|
||||
0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
|
||||
0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
|
||||
0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L
|
||||
};
|
||||
|
||||
static unsigned long SP5[64] =
|
||||
{
|
||||
0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
|
||||
0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
|
||||
0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
|
||||
0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
|
||||
0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
|
||||
0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
|
||||
0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
|
||||
0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
|
||||
0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
|
||||
0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
|
||||
0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
|
||||
0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
|
||||
0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
|
||||
0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
|
||||
0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
|
||||
0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L
|
||||
};
|
||||
|
||||
static unsigned long SP6[64] =
|
||||
{
|
||||
0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
|
||||
0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
|
||||
0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
|
||||
0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
|
||||
0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
|
||||
0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
|
||||
0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
|
||||
0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
|
||||
0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
|
||||
0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
|
||||
0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
|
||||
0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
|
||||
0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
|
||||
0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L
|
||||
};
|
||||
|
||||
static unsigned long SP7[64] =
|
||||
{
|
||||
0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
|
||||
0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
|
||||
0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
|
||||
0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
|
||||
0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
|
||||
0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
|
||||
0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
|
||||
0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
|
||||
0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
|
||||
0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
|
||||
0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
|
||||
0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
|
||||
0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
|
||||
0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
|
||||
0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
|
||||
0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L
|
||||
};
|
||||
|
||||
static unsigned long SP8[64] =
|
||||
{
|
||||
0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
|
||||
0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
|
||||
0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
|
||||
0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
|
||||
0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
|
||||
0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
|
||||
0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
|
||||
0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
|
||||
0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
|
||||
0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
|
||||
0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
|
||||
0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
|
||||
0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
|
||||
0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
|
||||
0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
|
||||
0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L
|
||||
};
|
||||
|
||||
static void desfunc(register unsigned long *block, register unsigned long *keys)
|
||||
{
|
||||
register unsigned long fval, work, right, leftt;
|
||||
register int round;
|
||||
|
||||
leftt = block[0];
|
||||
right = block[1];
|
||||
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 4);
|
||||
work = ((leftt >> 16) ^ right) & 0x0000ffffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 16);
|
||||
work = ((right >> 2) ^ leftt) & 0x33333333L;
|
||||
leftt ^= work;
|
||||
right ^= (work << 2);
|
||||
work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 8);
|
||||
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
|
||||
|
||||
for ( round = 0; round < 8; round++ )
|
||||
{
|
||||
work = (right << 28) | (right >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = right ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
leftt ^= fval;
|
||||
work = (leftt << 28) | (leftt >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = leftt ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
right ^= fval;
|
||||
}
|
||||
|
||||
right = (right << 31) | (right >> 1);
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = (leftt << 31) | (leftt >> 1);
|
||||
work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 8);
|
||||
work = ((leftt >> 2) ^ right) & 0x33333333L;
|
||||
right ^= work;
|
||||
leftt ^= (work << 2);
|
||||
work = ((right >> 16) ^ leftt) & 0x0000ffffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 16);
|
||||
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 4);
|
||||
*block++ = right;
|
||||
*block = leftt;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Validation sets:
|
||||
*
|
||||
* Single-length key, single-length plaintext -
|
||||
* Key : 0123 4567 89ab cdef
|
||||
* Key : 0123 4567 89ab cdef
|
||||
* Plain : 0123 4567 89ab cde7
|
||||
* Cipher : c957 4425 6a5e d31d
|
||||
*
|
||||
* Double-length key, single-length plaintext -
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
|
||||
* Plain : 0123 4567 89ab cde7
|
||||
* Cipher : 7f1d 0a77 826b 8aff
|
||||
*
|
||||
* Double-length key, double-length plaintext -
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
|
||||
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
|
||||
* Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
|
||||
*
|
||||
* Triple-length key, single-length plaintext -
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
|
||||
* Plain : 0123 4567 89ab cde7
|
||||
* Cipher : de0b 7c06 ae5e 0ed5
|
||||
*
|
||||
* Triple-length key, double-length plaintext -
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
|
||||
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
|
||||
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
|
||||
* Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
|
||||
*
|
||||
|
||||
+19
-21
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2009
|
||||
|
||||
main define/macro file
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* main define/macro file
|
||||
*/
|
||||
|
||||
#ifndef DEFINES_H
|
||||
#define DEFINES_H
|
||||
|
||||
+297
-267
@@ -1,26 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2004-2012 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
read a config file
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* read a config file
|
||||
*/
|
||||
|
||||
#include "arch.h"
|
||||
#include "os_calls.h"
|
||||
@@ -33,250 +29,276 @@
|
||||
returns 0 if everything is ok
|
||||
returns 1 if problem reading file */
|
||||
static int APP_CC
|
||||
l_file_read_sections(int fd, int max_file_size, struct list* names)
|
||||
l_file_read_sections(int fd, int max_file_size, struct list *names)
|
||||
{
|
||||
struct stream* s;
|
||||
char text[256];
|
||||
char c;
|
||||
int in_it;
|
||||
int in_it_index;
|
||||
int len;
|
||||
int index;
|
||||
int rv;
|
||||
struct stream *s;
|
||||
char text[256];
|
||||
char c;
|
||||
int in_it;
|
||||
int in_it_index;
|
||||
int len;
|
||||
int index;
|
||||
int rv;
|
||||
|
||||
rv = 0;
|
||||
g_file_seek(fd, 0);
|
||||
in_it_index = 0;
|
||||
in_it = 0;
|
||||
g_memset(text, 0, 256);
|
||||
list_clear(names);
|
||||
make_stream(s);
|
||||
init_stream(s, max_file_size);
|
||||
len = g_file_read(fd, s->data, max_file_size);
|
||||
if (len > 0)
|
||||
{
|
||||
s->end = s->p + len;
|
||||
for (index = 0; index < len; index++)
|
||||
rv = 0;
|
||||
g_file_seek(fd, 0);
|
||||
in_it_index = 0;
|
||||
in_it = 0;
|
||||
g_memset(text, 0, 256);
|
||||
list_clear(names);
|
||||
make_stream(s);
|
||||
init_stream(s, max_file_size);
|
||||
len = g_file_read(fd, s->data, max_file_size);
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
in_uint8(s, c);
|
||||
if (c == '[')
|
||||
{
|
||||
in_it = 1;
|
||||
}
|
||||
else if (c == ']')
|
||||
{
|
||||
list_add_item(names, (tbus)g_strdup(text));
|
||||
in_it = 0;
|
||||
in_it_index = 0;
|
||||
g_memset(text, 0, 256);
|
||||
}
|
||||
else if (in_it)
|
||||
{
|
||||
text[in_it_index] = c;
|
||||
in_it_index++;
|
||||
}
|
||||
s->end = s->p + len;
|
||||
|
||||
for (index = 0; index < len; index++)
|
||||
{
|
||||
in_uint8(s, c);
|
||||
|
||||
if (c == '[')
|
||||
{
|
||||
in_it = 1;
|
||||
}
|
||||
else if (c == ']')
|
||||
{
|
||||
list_add_item(names, (tbus)g_strdup(text));
|
||||
in_it = 0;
|
||||
in_it_index = 0;
|
||||
g_memset(text, 0, 256);
|
||||
}
|
||||
else if (in_it)
|
||||
{
|
||||
text[in_it_index] = c;
|
||||
in_it_index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (len < 0)
|
||||
{
|
||||
rv = 1;
|
||||
}
|
||||
free_stream(s);
|
||||
return rv;
|
||||
else if (len < 0)
|
||||
{
|
||||
rv = 1;
|
||||
}
|
||||
|
||||
free_stream(s);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
file_read_line(struct stream* s, char* text)
|
||||
file_read_line(struct stream *s, char *text)
|
||||
{
|
||||
int i;
|
||||
int skip_to_end;
|
||||
int at_end;
|
||||
char c;
|
||||
char* hold;
|
||||
int i;
|
||||
int skip_to_end;
|
||||
int at_end;
|
||||
char c;
|
||||
char *hold;
|
||||
|
||||
skip_to_end = 0;
|
||||
if (!s_check_rem(s, 1))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
hold = s->p;
|
||||
i = 0;
|
||||
in_uint8(s, c);
|
||||
while (c != 10 && c != 13)
|
||||
{
|
||||
if (c == '#' || c == '!' || c == ';')
|
||||
skip_to_end = 0;
|
||||
|
||||
if (!s_check_rem(s, 1))
|
||||
{
|
||||
skip_to_end = 1;
|
||||
return 1;
|
||||
}
|
||||
if (!skip_to_end)
|
||||
|
||||
hold = s->p;
|
||||
i = 0;
|
||||
in_uint8(s, c);
|
||||
|
||||
while (c != 10 && c != 13)
|
||||
{
|
||||
text[i] = c;
|
||||
i++;
|
||||
if (c == '#' || c == '!' || c == ';')
|
||||
{
|
||||
skip_to_end = 1;
|
||||
}
|
||||
|
||||
if (!skip_to_end)
|
||||
{
|
||||
text[i] = c;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (s_check_rem(s, 1))
|
||||
{
|
||||
in_uint8(s, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
c = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (s_check_rem(s, 1))
|
||||
|
||||
if (c == 10 || c == 13)
|
||||
{
|
||||
in_uint8(s, c);
|
||||
at_end = 0;
|
||||
|
||||
while (c == 10 || c == 13)
|
||||
{
|
||||
if (s_check_rem(s, 1))
|
||||
{
|
||||
in_uint8(s, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
at_end = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!at_end)
|
||||
{
|
||||
s->p--;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
text[i] = 0;
|
||||
|
||||
if (text[0] == '[')
|
||||
{
|
||||
c = 0;
|
||||
break;
|
||||
s->p = hold;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (c == 10 || c == 13)
|
||||
{
|
||||
at_end = 0;
|
||||
while (c == 10 || c == 13)
|
||||
{
|
||||
if (s_check_rem(s, 1))
|
||||
{
|
||||
in_uint8(s, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
at_end = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!at_end)
|
||||
{
|
||||
s->p--;
|
||||
}
|
||||
}
|
||||
text[i] = 0;
|
||||
if (text[0] == '[')
|
||||
{
|
||||
s->p = hold;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
static int APP_CC
|
||||
file_split_name_value(char* text, char* name, char* value)
|
||||
file_split_name_value(char *text, char *name, char *value)
|
||||
{
|
||||
int len;
|
||||
int i;
|
||||
int value_index;
|
||||
int name_index;
|
||||
int on_to;
|
||||
int len;
|
||||
int i;
|
||||
int value_index;
|
||||
int name_index;
|
||||
int on_to;
|
||||
|
||||
value_index = 0;
|
||||
name_index = 0;
|
||||
on_to = 0;
|
||||
name[0] = 0;
|
||||
value[0] = 0;
|
||||
len = g_strlen(text);
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
if (text[i] == '=')
|
||||
value_index = 0;
|
||||
name_index = 0;
|
||||
on_to = 0;
|
||||
name[0] = 0;
|
||||
value[0] = 0;
|
||||
len = g_strlen(text);
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
on_to = 1;
|
||||
if (text[i] == '=')
|
||||
{
|
||||
on_to = 1;
|
||||
}
|
||||
else if (on_to)
|
||||
{
|
||||
value[value_index] = text[i];
|
||||
value_index++;
|
||||
value[value_index] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
name[name_index] = text[i];
|
||||
name_index++;
|
||||
name[name_index] = 0;
|
||||
}
|
||||
}
|
||||
else if (on_to)
|
||||
{
|
||||
value[value_index] = text[i];
|
||||
value_index++;
|
||||
value[value_index] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
name[name_index] = text[i];
|
||||
name_index++;
|
||||
name[name_index] = 0;
|
||||
}
|
||||
}
|
||||
g_strtrim(name, 3); /* trim both right and left */
|
||||
g_strtrim(value, 3); /* trim both right and left */
|
||||
return 0;
|
||||
|
||||
g_strtrim(name, 3); /* trim both right and left */
|
||||
g_strtrim(value, 3); /* trim both right and left */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* return error */
|
||||
static int APP_CC
|
||||
l_file_read_section(int fd, int max_file_size, const char* section,
|
||||
struct list* names, struct list* values)
|
||||
l_file_read_section(int fd, int max_file_size, const char *section,
|
||||
struct list *names, struct list *values)
|
||||
{
|
||||
struct stream* s;
|
||||
char text[512];
|
||||
char name[512];
|
||||
char value[512];
|
||||
char* lvalue;
|
||||
char c;
|
||||
int in_it;
|
||||
int in_it_index;
|
||||
int len;
|
||||
int index;
|
||||
int file_size;
|
||||
struct stream *s;
|
||||
char text[512];
|
||||
char name[512];
|
||||
char value[512];
|
||||
char *lvalue;
|
||||
char c;
|
||||
int in_it;
|
||||
int in_it_index;
|
||||
int len;
|
||||
int index;
|
||||
int file_size;
|
||||
|
||||
file_size = 32 * 1024; /* 32 K file size limit */
|
||||
g_file_seek(fd, 0);
|
||||
in_it_index = 0;
|
||||
in_it = 0;
|
||||
g_memset(text, 0, 512);
|
||||
list_clear(names);
|
||||
list_clear(values);
|
||||
make_stream(s);
|
||||
init_stream(s, file_size);
|
||||
len = g_file_read(fd, s->data, file_size);
|
||||
if (len > 0)
|
||||
{
|
||||
s->end = s->p + len;
|
||||
for (index = 0; index < len; index++)
|
||||
file_size = 32 * 1024; /* 32 K file size limit */
|
||||
g_file_seek(fd, 0);
|
||||
in_it_index = 0;
|
||||
in_it = 0;
|
||||
g_memset(text, 0, 512);
|
||||
list_clear(names);
|
||||
list_clear(values);
|
||||
make_stream(s);
|
||||
init_stream(s, file_size);
|
||||
len = g_file_read(fd, s->data, file_size);
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
in_uint8(s, c);
|
||||
if (c == '[')
|
||||
{
|
||||
in_it = 1;
|
||||
}
|
||||
else if (c == ']')
|
||||
{
|
||||
if (g_strcasecmp(section, text) == 0)
|
||||
s->end = s->p + len;
|
||||
|
||||
for (index = 0; index < len; index++)
|
||||
{
|
||||
file_read_line(s, text);
|
||||
while (file_read_line(s, text) == 0)
|
||||
{
|
||||
if (g_strlen(text) > 0)
|
||||
in_uint8(s, c);
|
||||
|
||||
if (c == '[')
|
||||
{
|
||||
file_split_name_value(text, name, value);
|
||||
list_add_item(names, (tbus)g_strdup(name));
|
||||
if (value[0] == '$')
|
||||
{
|
||||
lvalue = g_getenv(value + 1);
|
||||
if (lvalue != 0)
|
||||
{
|
||||
list_add_item(values, (tbus)g_strdup(lvalue));
|
||||
}
|
||||
else
|
||||
{
|
||||
list_add_item(values, (tbus)g_strdup(""));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
list_add_item(values, (tbus)g_strdup(value));
|
||||
}
|
||||
in_it = 1;
|
||||
}
|
||||
else if (c == ']')
|
||||
{
|
||||
if (g_strcasecmp(section, text) == 0)
|
||||
{
|
||||
file_read_line(s, text);
|
||||
|
||||
while (file_read_line(s, text) == 0)
|
||||
{
|
||||
if (g_strlen(text) > 0)
|
||||
{
|
||||
file_split_name_value(text, name, value);
|
||||
list_add_item(names, (tbus)g_strdup(name));
|
||||
|
||||
if (value[0] == '$')
|
||||
{
|
||||
lvalue = g_getenv(value + 1);
|
||||
|
||||
if (lvalue != 0)
|
||||
{
|
||||
list_add_item(values, (tbus)g_strdup(lvalue));
|
||||
}
|
||||
else
|
||||
{
|
||||
list_add_item(values, (tbus)g_strdup(""));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
list_add_item(values, (tbus)g_strdup(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free_stream(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
in_it = 0;
|
||||
in_it_index = 0;
|
||||
g_memset(text, 0, 512);
|
||||
}
|
||||
else if (in_it)
|
||||
{
|
||||
text[in_it_index] = c;
|
||||
in_it_index++;
|
||||
}
|
||||
}
|
||||
free_stream(s);
|
||||
return 0;
|
||||
}
|
||||
in_it = 0;
|
||||
in_it_index = 0;
|
||||
g_memset(text, 0, 512);
|
||||
}
|
||||
else if (in_it)
|
||||
{
|
||||
text[in_it_index] = c;
|
||||
in_it_index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
free_stream(s);
|
||||
return 1;
|
||||
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -285,9 +307,9 @@ l_file_read_section(int fd, int max_file_size, const char* section,
|
||||
returns 1 if problem reading file */
|
||||
/* 32 K file size limit */
|
||||
int APP_CC
|
||||
file_read_sections(int fd, struct list* names)
|
||||
file_read_sections(int fd, struct list *names)
|
||||
{
|
||||
return l_file_read_sections(fd, 32 * 1024, names);
|
||||
return l_file_read_sections(fd, 32 * 1024, names);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -295,35 +317,39 @@ file_read_sections(int fd, struct list* names)
|
||||
/* this function should be prefered over file_read_sections because it can
|
||||
read any file size */
|
||||
int APP_CC
|
||||
file_by_name_read_sections(const char* file_name, struct list* names)
|
||||
file_by_name_read_sections(const char *file_name, struct list *names)
|
||||
{
|
||||
int fd;
|
||||
int file_size;
|
||||
int rv;
|
||||
int fd;
|
||||
int file_size;
|
||||
int rv;
|
||||
|
||||
file_size = g_file_get_size(file_name);
|
||||
if (file_size < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
fd = g_file_open(file_name);
|
||||
if (fd < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
rv = l_file_read_sections(fd, file_size, names);
|
||||
g_file_close(fd);
|
||||
return rv;
|
||||
file_size = g_file_get_size(file_name);
|
||||
|
||||
if (file_size < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
fd = g_file_open(file_name);
|
||||
|
||||
if (fd < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
rv = l_file_read_sections(fd, file_size, names);
|
||||
g_file_close(fd);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* return error */
|
||||
/* 32 K file size limit */
|
||||
int APP_CC
|
||||
file_read_section(int fd, const char* section,
|
||||
struct list* names, struct list* values)
|
||||
file_read_section(int fd, const char *section,
|
||||
struct list *names, struct list *values)
|
||||
{
|
||||
return l_file_read_section(fd, 32 * 1024, section, names, values);
|
||||
return l_file_read_section(fd, 32 * 1024, section, names, values);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -331,24 +357,28 @@ file_read_section(int fd, const char* section,
|
||||
/* this function should be prefered over file_read_section because it can
|
||||
read any file size */
|
||||
int APP_CC
|
||||
file_by_name_read_section(const char* file_name, const char* section,
|
||||
struct list* names, struct list* values)
|
||||
file_by_name_read_section(const char *file_name, const char *section,
|
||||
struct list *names, struct list *values)
|
||||
{
|
||||
int fd;
|
||||
int file_size;
|
||||
int rv;
|
||||
int fd;
|
||||
int file_size;
|
||||
int rv;
|
||||
|
||||
file_size = g_file_get_size(file_name);
|
||||
if (file_size < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
fd = g_file_open(file_name);
|
||||
if (fd < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
rv = l_file_read_section(fd, file_size, section, names, values);
|
||||
g_file_close(fd);
|
||||
return rv;
|
||||
file_size = g_file_get_size(file_name);
|
||||
|
||||
if (file_size < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
fd = g_file_open(file_name);
|
||||
|
||||
if (fd < 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
rv = l_file_read_section(fd, file_size, section, names, values);
|
||||
g_file_close(fd);
|
||||
return rv;
|
||||
}
|
||||
|
||||
+19
-23
@@ -1,26 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
read a config file
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* read a config file
|
||||
*/
|
||||
|
||||
#if !defined(FILE_H)
|
||||
#define FILE_H
|
||||
|
||||
+19
-21
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
default file locations for log, config, etc
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* default file locations for log, config, etc
|
||||
*/
|
||||
|
||||
#if !defined(FILE_LOC_H)
|
||||
#define FILE_LOC_H
|
||||
|
||||
+149
-140
@@ -1,217 +1,226 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
simple list
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* simple list
|
||||
*/
|
||||
|
||||
#include "arch.h"
|
||||
#include "os_calls.h"
|
||||
#include "list.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct list* APP_CC
|
||||
struct list *APP_CC
|
||||
list_create(void)
|
||||
{
|
||||
struct list* self;
|
||||
struct list *self;
|
||||
|
||||
self = (struct list*)g_malloc(sizeof(struct list), 1);
|
||||
self->grow_by = 10;
|
||||
self->alloc_size = 10;
|
||||
self->items = (tbus*)g_malloc(sizeof(tbus) * 10, 1);
|
||||
return self;
|
||||
self = (struct list *)g_malloc(sizeof(struct list), 1);
|
||||
self->grow_by = 10;
|
||||
self->alloc_size = 10;
|
||||
self->items = (tbus *)g_malloc(sizeof(tbus) * 10, 1);
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
list_delete(struct list* self)
|
||||
list_delete(struct list *self)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (self->auto_free)
|
||||
{
|
||||
for (i = 0; i < self->count; i++)
|
||||
if (self == 0)
|
||||
{
|
||||
g_free((void*)self->items[i]);
|
||||
self->items[i] = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
g_free(self->items);
|
||||
g_free(self);
|
||||
|
||||
if (self->auto_free)
|
||||
{
|
||||
for (i = 0; i < self->count; i++)
|
||||
{
|
||||
g_free((void *)self->items[i]);
|
||||
self->items[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(self->items);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
list_add_item(struct list* self, tbus item)
|
||||
list_add_item(struct list *self, tbus item)
|
||||
{
|
||||
tbus* p;
|
||||
int i;
|
||||
tbus *p;
|
||||
int i;
|
||||
|
||||
if (self->count >= self->alloc_size)
|
||||
{
|
||||
i = self->alloc_size;
|
||||
self->alloc_size += self->grow_by;
|
||||
p = (tbus*)g_malloc(sizeof(tbus) * self->alloc_size, 1);
|
||||
g_memcpy(p, self->items, sizeof(tbus) * i);
|
||||
g_free(self->items);
|
||||
self->items = p;
|
||||
}
|
||||
self->items[self->count] = item;
|
||||
self->count++;
|
||||
if (self->count >= self->alloc_size)
|
||||
{
|
||||
i = self->alloc_size;
|
||||
self->alloc_size += self->grow_by;
|
||||
p = (tbus *)g_malloc(sizeof(tbus) * self->alloc_size, 1);
|
||||
g_memcpy(p, self->items, sizeof(tbus) * i);
|
||||
g_free(self->items);
|
||||
self->items = p;
|
||||
}
|
||||
|
||||
self->items[self->count] = item;
|
||||
self->count++;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
tbus APP_CC
|
||||
list_get_item(struct list* self, int index)
|
||||
list_get_item(struct list *self, int index)
|
||||
{
|
||||
if (index < 0 || index >= self->count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return self->items[index];
|
||||
if (index < 0 || index >= self->count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return self->items[index];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
list_clear(struct list* self)
|
||||
list_clear(struct list *self)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
if (self->auto_free)
|
||||
{
|
||||
for (i = 0; i < self->count; i++)
|
||||
if (self->auto_free)
|
||||
{
|
||||
g_free((void*)self->items[i]);
|
||||
self->items[i] = 0;
|
||||
for (i = 0; i < self->count; i++)
|
||||
{
|
||||
g_free((void *)self->items[i]);
|
||||
self->items[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
g_free(self->items);
|
||||
self->count = 0;
|
||||
self->grow_by = 10;
|
||||
self->alloc_size = 10;
|
||||
self->items = (tbus*)g_malloc(sizeof(tbus) * 10, 1);
|
||||
|
||||
g_free(self->items);
|
||||
self->count = 0;
|
||||
self->grow_by = 10;
|
||||
self->alloc_size = 10;
|
||||
self->items = (tbus *)g_malloc(sizeof(tbus) * 10, 1);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
list_index_of(struct list* self, tbus item)
|
||||
list_index_of(struct list *self, tbus item)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < self->count; i++)
|
||||
{
|
||||
if (self->items[i] == item)
|
||||
for (i = 0; i < self->count; i++)
|
||||
{
|
||||
return i;
|
||||
if (self->items[i] == item)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
list_remove_item(struct list* self, int index)
|
||||
list_remove_item(struct list *self, int index)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
if (index >= 0 && index < self->count)
|
||||
{
|
||||
if (self->auto_free)
|
||||
if (index >= 0 && index < self->count)
|
||||
{
|
||||
g_free((void*)self->items[index]);
|
||||
self->items[index] = 0;
|
||||
if (self->auto_free)
|
||||
{
|
||||
g_free((void *)self->items[index]);
|
||||
self->items[index] = 0;
|
||||
}
|
||||
|
||||
for (i = index; i < (self->count - 1); i++)
|
||||
{
|
||||
self->items[i] = self->items[i + 1];
|
||||
}
|
||||
|
||||
self->count--;
|
||||
}
|
||||
for (i = index; i < (self->count - 1); i++)
|
||||
{
|
||||
self->items[i] = self->items[i + 1];
|
||||
}
|
||||
self->count--;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
list_insert_item(struct list* self, int index, tbus item)
|
||||
list_insert_item(struct list *self, int index, tbus item)
|
||||
{
|
||||
tbus* p;
|
||||
int i;
|
||||
tbus *p;
|
||||
int i;
|
||||
|
||||
if (index == self->count)
|
||||
{
|
||||
list_add_item(self, item);
|
||||
return;
|
||||
}
|
||||
if (index >= 0 && index < self->count)
|
||||
{
|
||||
self->count++;
|
||||
if (self->count > self->alloc_size)
|
||||
if (index == self->count)
|
||||
{
|
||||
i = self->alloc_size;
|
||||
self->alloc_size += self->grow_by;
|
||||
p = (tbus*)g_malloc(sizeof(tbus) * self->alloc_size, 1);
|
||||
g_memcpy(p, self->items, sizeof(tbus) * i);
|
||||
g_free(self->items);
|
||||
self->items = p;
|
||||
list_add_item(self, item);
|
||||
return;
|
||||
}
|
||||
for (i = (self->count - 2); i >= index; i--)
|
||||
|
||||
if (index >= 0 && index < self->count)
|
||||
{
|
||||
self->items[i + 1] = self->items[i];
|
||||
self->count++;
|
||||
|
||||
if (self->count > self->alloc_size)
|
||||
{
|
||||
i = self->alloc_size;
|
||||
self->alloc_size += self->grow_by;
|
||||
p = (tbus *)g_malloc(sizeof(tbus) * self->alloc_size, 1);
|
||||
g_memcpy(p, self->items, sizeof(tbus) * i);
|
||||
g_free(self->items);
|
||||
self->items = p;
|
||||
}
|
||||
|
||||
for (i = (self->count - 2); i >= index; i--)
|
||||
{
|
||||
self->items[i + 1] = self->items[i];
|
||||
}
|
||||
|
||||
self->items[index] = item;
|
||||
}
|
||||
self->items[index] = item;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* append one list to another using strdup for each item in the list */
|
||||
/* begins copy at start_index, a zero based index on the soure list */
|
||||
void APP_CC
|
||||
list_append_list_strdup(struct list* self, struct list* dest, int start_index)
|
||||
list_append_list_strdup(struct list *self, struct list *dest, int start_index)
|
||||
{
|
||||
int index;
|
||||
tbus item;
|
||||
char* dup;
|
||||
int index;
|
||||
tbus item;
|
||||
char *dup;
|
||||
|
||||
for (index = start_index; index < self->count; index++)
|
||||
{
|
||||
item = list_get_item(self, index);
|
||||
dup = g_strdup((char*)item);
|
||||
list_add_item(dest, (tbus)dup);
|
||||
}
|
||||
for (index = start_index; index < self->count; index++)
|
||||
{
|
||||
item = list_get_item(self, index);
|
||||
dup = g_strdup((char *)item);
|
||||
list_add_item(dest, (tbus)dup);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
list_dump_items(struct list* self)
|
||||
list_dump_items(struct list *self)
|
||||
{
|
||||
int index;
|
||||
int index;
|
||||
|
||||
if (self->count == 0)
|
||||
{
|
||||
g_writeln("List is empty");
|
||||
}
|
||||
for (index = 0; index < self->count; index++)
|
||||
{
|
||||
g_writeln("%d: %s", index, list_get_item(self, index));
|
||||
}
|
||||
if (self->count == 0)
|
||||
{
|
||||
g_writeln("List is empty");
|
||||
}
|
||||
|
||||
for (index = 0; index < self->count; index++)
|
||||
{
|
||||
g_writeln("%d: %s", index, list_get_item(self, index));
|
||||
}
|
||||
}
|
||||
|
||||
+19
-23
@@ -1,26 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
simple list
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* simple list
|
||||
*/
|
||||
|
||||
#if !defined(LIST_H)
|
||||
#define LIST_H
|
||||
|
||||
+474
-435
File diff suppressed because it is too large
Load Diff
+17
-22
@@ -1,25 +1,20 @@
|
||||
/*
|
||||
Copyright (c) 2005-2012 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef LOG_H
|
||||
#define LOG_H
|
||||
|
||||
+1563
-1369
File diff suppressed because it is too large
Load Diff
+19
-23
@@ -1,26 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2004-2012 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
generic operating system calls
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* generic operating system calls
|
||||
*/
|
||||
|
||||
#if !defined(OS_CALLS_H)
|
||||
#define OS_CALLS_H
|
||||
|
||||
+23
-27
@@ -1,30 +1,26 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
Parsing structs and macros
|
||||
|
||||
based on parse.h from rdesktop
|
||||
this is a super fast stream method, you bet
|
||||
needed functions g_malloc, g_free, g_memset, g_memcpy
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Parsing structs and macros
|
||||
*
|
||||
* based on parse.h from rdesktop
|
||||
* this is a super fast stream method, you bet
|
||||
* needed functions g_malloc, g_free, g_memset, g_memcpy
|
||||
*/
|
||||
|
||||
#if !defined(PARSE_H)
|
||||
#define PARSE_H
|
||||
|
||||
+239
-224
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
ssl calls
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* ssl calls
|
||||
*/
|
||||
|
||||
#include <stdlib.h> /* needed for openssl headers */
|
||||
#include <openssl/ssl.h>
|
||||
@@ -43,197 +41,200 @@
|
||||
int
|
||||
ssl_init(void)
|
||||
{
|
||||
SSL_load_error_strings();
|
||||
SSL_library_init();
|
||||
return 0;
|
||||
SSL_load_error_strings();
|
||||
SSL_library_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
ssl_finish(void)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* rc4 stuff */
|
||||
|
||||
/*****************************************************************************/
|
||||
void* APP_CC
|
||||
void *APP_CC
|
||||
ssl_rc4_info_create(void)
|
||||
{
|
||||
return g_malloc(sizeof(RC4_KEY), 1);
|
||||
return g_malloc(sizeof(RC4_KEY), 1);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_rc4_info_delete(void* rc4_info)
|
||||
ssl_rc4_info_delete(void *rc4_info)
|
||||
{
|
||||
g_free(rc4_info);
|
||||
g_free(rc4_info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_rc4_set_key(void* rc4_info, char* key, int len)
|
||||
ssl_rc4_set_key(void *rc4_info, char *key, int len)
|
||||
{
|
||||
RC4_set_key((RC4_KEY*)rc4_info, len, (tui8*)key);
|
||||
RC4_set_key((RC4_KEY *)rc4_info, len, (tui8 *)key);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_rc4_crypt(void* rc4_info, char* data, int len)
|
||||
ssl_rc4_crypt(void *rc4_info, char *data, int len)
|
||||
{
|
||||
RC4((RC4_KEY*)rc4_info, len, (tui8*)data, (tui8*)data);
|
||||
RC4((RC4_KEY *)rc4_info, len, (tui8 *)data, (tui8 *)data);
|
||||
}
|
||||
|
||||
/* sha1 stuff */
|
||||
|
||||
/*****************************************************************************/
|
||||
void* APP_CC
|
||||
void *APP_CC
|
||||
ssl_sha1_info_create(void)
|
||||
{
|
||||
return g_malloc(sizeof(SHA_CTX), 1);
|
||||
return g_malloc(sizeof(SHA_CTX), 1);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_sha1_info_delete(void* sha1_info)
|
||||
ssl_sha1_info_delete(void *sha1_info)
|
||||
{
|
||||
g_free(sha1_info);
|
||||
g_free(sha1_info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_sha1_clear(void* sha1_info)
|
||||
ssl_sha1_clear(void *sha1_info)
|
||||
{
|
||||
SHA1_Init((SHA_CTX*)sha1_info);
|
||||
SHA1_Init((SHA_CTX *)sha1_info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_sha1_transform(void* sha1_info, char* data, int len)
|
||||
ssl_sha1_transform(void *sha1_info, char *data, int len)
|
||||
{
|
||||
SHA1_Update((SHA_CTX*)sha1_info, data, len);
|
||||
SHA1_Update((SHA_CTX *)sha1_info, data, len);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_sha1_complete(void* sha1_info, char* data)
|
||||
ssl_sha1_complete(void *sha1_info, char *data)
|
||||
{
|
||||
SHA1_Final((tui8*)data, (SHA_CTX*)sha1_info);
|
||||
SHA1_Final((tui8 *)data, (SHA_CTX *)sha1_info);
|
||||
}
|
||||
|
||||
/* md5 stuff */
|
||||
|
||||
/*****************************************************************************/
|
||||
void* APP_CC
|
||||
void *APP_CC
|
||||
ssl_md5_info_create(void)
|
||||
{
|
||||
return g_malloc(sizeof(MD5_CTX), 1);
|
||||
return g_malloc(sizeof(MD5_CTX), 1);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_md5_info_delete(void* md5_info)
|
||||
ssl_md5_info_delete(void *md5_info)
|
||||
{
|
||||
g_free(md5_info);
|
||||
g_free(md5_info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_md5_clear(void* md5_info)
|
||||
ssl_md5_clear(void *md5_info)
|
||||
{
|
||||
MD5_Init((MD5_CTX*)md5_info);
|
||||
MD5_Init((MD5_CTX *)md5_info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_md5_transform(void* md5_info, char* data, int len)
|
||||
ssl_md5_transform(void *md5_info, char *data, int len)
|
||||
{
|
||||
MD5_Update((MD5_CTX*)md5_info, data, len);
|
||||
MD5_Update((MD5_CTX *)md5_info, data, len);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
ssl_md5_complete(void* md5_info, char* data)
|
||||
ssl_md5_complete(void *md5_info, char *data)
|
||||
{
|
||||
MD5_Final((tui8*)data, (MD5_CTX*)md5_info);
|
||||
MD5_Final((tui8 *)data, (MD5_CTX *)md5_info);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void APP_CC
|
||||
ssl_reverse_it(char* p, int len)
|
||||
ssl_reverse_it(char *p, int len)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
char temp;
|
||||
int i;
|
||||
int j;
|
||||
char temp;
|
||||
|
||||
i = 0;
|
||||
j = len - 1;
|
||||
while (i < j)
|
||||
{
|
||||
temp = p[i];
|
||||
p[i] = p[j];
|
||||
p[j] = temp;
|
||||
i++;
|
||||
j--;
|
||||
}
|
||||
i = 0;
|
||||
j = len - 1;
|
||||
|
||||
while (i < j)
|
||||
{
|
||||
temp = p[i];
|
||||
p[i] = p[j];
|
||||
p[j] = temp;
|
||||
i++;
|
||||
j--;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
ssl_mod_exp(char* out, int out_len, char* in, int in_len,
|
||||
char* mod, int mod_len, char* exp, int exp_len)
|
||||
ssl_mod_exp(char *out, int out_len, char *in, int in_len,
|
||||
char *mod, int mod_len, char *exp, int exp_len)
|
||||
{
|
||||
BN_CTX* ctx;
|
||||
BIGNUM lmod;
|
||||
BIGNUM lexp;
|
||||
BIGNUM lin;
|
||||
BIGNUM lout;
|
||||
int rv;
|
||||
char* l_out;
|
||||
char* l_in;
|
||||
char* l_mod;
|
||||
char* l_exp;
|
||||
BN_CTX *ctx;
|
||||
BIGNUM lmod;
|
||||
BIGNUM lexp;
|
||||
BIGNUM lin;
|
||||
BIGNUM lout;
|
||||
int rv;
|
||||
char *l_out;
|
||||
char *l_in;
|
||||
char *l_mod;
|
||||
char *l_exp;
|
||||
|
||||
l_out = (char*)g_malloc(out_len, 1);
|
||||
l_in = (char*)g_malloc(in_len, 1);
|
||||
l_mod = (char*)g_malloc(mod_len, 1);
|
||||
l_exp = (char*)g_malloc(exp_len, 1);
|
||||
g_memcpy(l_in, in, in_len);
|
||||
g_memcpy(l_mod, mod, mod_len);
|
||||
g_memcpy(l_exp, exp, exp_len);
|
||||
ssl_reverse_it(l_in, in_len);
|
||||
ssl_reverse_it(l_mod, mod_len);
|
||||
ssl_reverse_it(l_exp, exp_len);
|
||||
ctx = BN_CTX_new();
|
||||
BN_init(&lmod);
|
||||
BN_init(&lexp);
|
||||
BN_init(&lin);
|
||||
BN_init(&lout);
|
||||
BN_bin2bn((tui8*)l_mod, mod_len, &lmod);
|
||||
BN_bin2bn((tui8*)l_exp, exp_len, &lexp);
|
||||
BN_bin2bn((tui8*)l_in, in_len, &lin);
|
||||
BN_mod_exp(&lout, &lin, &lexp, &lmod, ctx);
|
||||
rv = BN_bn2bin(&lout, (tui8*)l_out);
|
||||
if (rv <= out_len)
|
||||
{
|
||||
ssl_reverse_it(l_out, rv);
|
||||
g_memcpy(out, l_out, out_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = 0;
|
||||
}
|
||||
BN_free(&lin);
|
||||
BN_free(&lout);
|
||||
BN_free(&lexp);
|
||||
BN_free(&lmod);
|
||||
BN_CTX_free(ctx);
|
||||
g_free(l_out);
|
||||
g_free(l_in);
|
||||
g_free(l_mod);
|
||||
g_free(l_exp);
|
||||
return rv;
|
||||
l_out = (char *)g_malloc(out_len, 1);
|
||||
l_in = (char *)g_malloc(in_len, 1);
|
||||
l_mod = (char *)g_malloc(mod_len, 1);
|
||||
l_exp = (char *)g_malloc(exp_len, 1);
|
||||
g_memcpy(l_in, in, in_len);
|
||||
g_memcpy(l_mod, mod, mod_len);
|
||||
g_memcpy(l_exp, exp, exp_len);
|
||||
ssl_reverse_it(l_in, in_len);
|
||||
ssl_reverse_it(l_mod, mod_len);
|
||||
ssl_reverse_it(l_exp, exp_len);
|
||||
ctx = BN_CTX_new();
|
||||
BN_init(&lmod);
|
||||
BN_init(&lexp);
|
||||
BN_init(&lin);
|
||||
BN_init(&lout);
|
||||
BN_bin2bn((tui8 *)l_mod, mod_len, &lmod);
|
||||
BN_bin2bn((tui8 *)l_exp, exp_len, &lexp);
|
||||
BN_bin2bn((tui8 *)l_in, in_len, &lin);
|
||||
BN_mod_exp(&lout, &lin, &lexp, &lmod, ctx);
|
||||
rv = BN_bn2bin(&lout, (tui8 *)l_out);
|
||||
|
||||
if (rv <= out_len)
|
||||
{
|
||||
ssl_reverse_it(l_out, rv);
|
||||
g_memcpy(out, l_out, out_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = 0;
|
||||
}
|
||||
|
||||
BN_free(&lin);
|
||||
BN_free(&lout);
|
||||
BN_free(&lexp);
|
||||
BN_free(&lmod);
|
||||
BN_CTX_free(ctx);
|
||||
g_free(l_out);
|
||||
g_free(l_in);
|
||||
g_free(l_mod);
|
||||
g_free(l_exp);
|
||||
return rv;
|
||||
}
|
||||
|
||||
#if defined(OLD_RSA_GEN1)
|
||||
@@ -242,61 +243,68 @@ ssl_mod_exp(char* out, int out_len, char* in, int in_len,
|
||||
generates a new rsa key
|
||||
exp is passed in and mod and pri are passed out */
|
||||
int APP_CC
|
||||
ssl_gen_key_xrdp1(int key_size_in_bits, char* exp, int exp_len,
|
||||
char* mod, int mod_len, char* pri, int pri_len)
|
||||
ssl_gen_key_xrdp1(int key_size_in_bits, char *exp, int exp_len,
|
||||
char *mod, int mod_len, char *pri, int pri_len)
|
||||
{
|
||||
int my_e;
|
||||
RSA* my_key;
|
||||
char* lmod;
|
||||
char* lpri;
|
||||
tui8* lexp;
|
||||
int error;
|
||||
int len;
|
||||
int my_e;
|
||||
RSA *my_key;
|
||||
char *lmod;
|
||||
char *lpri;
|
||||
tui8 *lexp;
|
||||
int error;
|
||||
int len;
|
||||
|
||||
if ((exp_len != 4) || (mod_len != 64) || (pri_len != 64))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
lmod = (char*)g_malloc(mod_len, 0);
|
||||
lpri = (char*)g_malloc(pri_len, 0);
|
||||
lexp = (tui8*)exp;
|
||||
my_e = lexp[0];
|
||||
my_e |= lexp[1] << 8;
|
||||
my_e |= lexp[2] << 16;
|
||||
my_e |= lexp[3] << 24;
|
||||
/* srand is in stdlib.h */
|
||||
srand(g_time1());
|
||||
my_key = RSA_generate_key(key_size_in_bits, my_e, 0, 0);
|
||||
error = my_key == 0;
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->n);
|
||||
error = len != mod_len;
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->n, (tui8*)lmod);
|
||||
ssl_reverse_it(lmod, mod_len);
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->d);
|
||||
error = len != pri_len;
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->d, (tui8*)lpri);
|
||||
ssl_reverse_it(lpri, pri_len);
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
g_memcpy(mod, lmod, mod_len);
|
||||
g_memcpy(pri, lpri, pri_len);
|
||||
}
|
||||
RSA_free(my_key);
|
||||
g_free(lmod);
|
||||
g_free(lpri);
|
||||
return error;
|
||||
if ((exp_len != 4) || (mod_len != 64) || (pri_len != 64))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
lmod = (char *)g_malloc(mod_len, 0);
|
||||
lpri = (char *)g_malloc(pri_len, 0);
|
||||
lexp = (tui8 *)exp;
|
||||
my_e = lexp[0];
|
||||
my_e |= lexp[1] << 8;
|
||||
my_e |= lexp[2] << 16;
|
||||
my_e |= lexp[3] << 24;
|
||||
/* srand is in stdlib.h */
|
||||
srand(g_time1());
|
||||
my_key = RSA_generate_key(key_size_in_bits, my_e, 0, 0);
|
||||
error = my_key == 0;
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->n);
|
||||
error = len != mod_len;
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->n, (tui8 *)lmod);
|
||||
ssl_reverse_it(lmod, mod_len);
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->d);
|
||||
error = len != pri_len;
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->d, (tui8 *)lpri);
|
||||
ssl_reverse_it(lpri, pri_len);
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
g_memcpy(mod, lmod, mod_len);
|
||||
g_memcpy(pri, lpri, pri_len);
|
||||
}
|
||||
|
||||
RSA_free(my_key);
|
||||
g_free(lmod);
|
||||
g_free(lpri);
|
||||
return error;
|
||||
}
|
||||
#else
|
||||
/*****************************************************************************/
|
||||
@@ -304,60 +312,67 @@ ssl_gen_key_xrdp1(int key_size_in_bits, char* exp, int exp_len,
|
||||
generates a new rsa key
|
||||
exp is passed in and mod and pri are passed out */
|
||||
int APP_CC
|
||||
ssl_gen_key_xrdp1(int key_size_in_bits, char* exp, int exp_len,
|
||||
char* mod, int mod_len, char* pri, int pri_len)
|
||||
ssl_gen_key_xrdp1(int key_size_in_bits, char *exp, int exp_len,
|
||||
char *mod, int mod_len, char *pri, int pri_len)
|
||||
{
|
||||
BIGNUM* my_e;
|
||||
RSA* my_key;
|
||||
char* lexp;
|
||||
char* lmod;
|
||||
char* lpri;
|
||||
int error;
|
||||
int len;
|
||||
BIGNUM *my_e;
|
||||
RSA *my_key;
|
||||
char *lexp;
|
||||
char *lmod;
|
||||
char *lpri;
|
||||
int error;
|
||||
int len;
|
||||
|
||||
if ((exp_len != 4) || (mod_len != 64) || (pri_len != 64))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
lexp = (char*)g_malloc(exp_len, 0);
|
||||
lmod = (char*)g_malloc(mod_len, 0);
|
||||
lpri = (char*)g_malloc(pri_len, 0);
|
||||
g_memcpy(lexp, exp, exp_len);
|
||||
ssl_reverse_it(lexp, exp_len);
|
||||
my_e = BN_new();
|
||||
BN_bin2bn((tui8*)lexp, exp_len, my_e);
|
||||
my_key = RSA_new();
|
||||
error = RSA_generate_key_ex(my_key, key_size_in_bits, my_e, 0) == 0;
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->n);
|
||||
error = len != mod_len;
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->n, (tui8*)lmod);
|
||||
ssl_reverse_it(lmod, mod_len);
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->d);
|
||||
error = len != pri_len;
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->d, (tui8*)lpri);
|
||||
ssl_reverse_it(lpri, pri_len);
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
g_memcpy(mod, lmod, mod_len);
|
||||
g_memcpy(pri, lpri, pri_len);
|
||||
}
|
||||
BN_free(my_e);
|
||||
RSA_free(my_key);
|
||||
g_free(lexp);
|
||||
g_free(lmod);
|
||||
g_free(lpri);
|
||||
return error;
|
||||
if ((exp_len != 4) || (mod_len != 64) || (pri_len != 64))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
lexp = (char *)g_malloc(exp_len, 0);
|
||||
lmod = (char *)g_malloc(mod_len, 0);
|
||||
lpri = (char *)g_malloc(pri_len, 0);
|
||||
g_memcpy(lexp, exp, exp_len);
|
||||
ssl_reverse_it(lexp, exp_len);
|
||||
my_e = BN_new();
|
||||
BN_bin2bn((tui8 *)lexp, exp_len, my_e);
|
||||
my_key = RSA_new();
|
||||
error = RSA_generate_key_ex(my_key, key_size_in_bits, my_e, 0) == 0;
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->n);
|
||||
error = len != mod_len;
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->n, (tui8 *)lmod);
|
||||
ssl_reverse_it(lmod, mod_len);
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
len = BN_num_bytes(my_key->d);
|
||||
error = len != pri_len;
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
BN_bn2bin(my_key->d, (tui8 *)lpri);
|
||||
ssl_reverse_it(lpri, pri_len);
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
g_memcpy(mod, lmod, mod_len);
|
||||
g_memcpy(pri, lpri, pri_len);
|
||||
}
|
||||
|
||||
BN_free(my_e);
|
||||
RSA_free(my_key);
|
||||
g_free(lexp);
|
||||
g_free(lmod);
|
||||
g_free(lpri);
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
+17
-19
@@ -1,22 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if !defined(SSL_CALLS_H)
|
||||
#define SSL_CALLS_H
|
||||
|
||||
+88
-87
@@ -1,27 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
thread calls
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* thread calls
|
||||
*/
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <windows.h>
|
||||
@@ -38,33 +33,36 @@
|
||||
/* returns error */
|
||||
#if defined(_WIN32)
|
||||
int APP_CC
|
||||
tc_thread_create(unsigned long (__stdcall * start_routine)(void*), void* arg)
|
||||
tc_thread_create(unsigned long (__stdcall *start_routine)(void *), void *arg)
|
||||
{
|
||||
int rv = 0;
|
||||
DWORD thread_id = 0;
|
||||
HANDLE thread = (HANDLE)0;
|
||||
int rv = 0;
|
||||
DWORD thread_id = 0;
|
||||
HANDLE thread = (HANDLE)0;
|
||||
|
||||
/* CreateThread returns handle or zero on error */
|
||||
thread = CreateThread(0, 0, start_routine, arg, 0, &thread_id);
|
||||
rv = !thread;
|
||||
CloseHandle(thread);
|
||||
return rv;
|
||||
/* CreateThread returns handle or zero on error */
|
||||
thread = CreateThread(0, 0, start_routine, arg, 0, &thread_id);
|
||||
rv = !thread;
|
||||
CloseHandle(thread);
|
||||
return rv;
|
||||
}
|
||||
#else
|
||||
int APP_CC
|
||||
tc_thread_create(void* (* start_routine)(void *), void* arg)
|
||||
tc_thread_create(void * (* start_routine)(void *), void *arg)
|
||||
{
|
||||
int rv = 0;
|
||||
pthread_t thread = (pthread_t)0;
|
||||
int rv = 0;
|
||||
pthread_t thread = (pthread_t)0;
|
||||
|
||||
g_memset(&thread, 0x00, sizeof(pthread_t));
|
||||
g_memset(&thread, 0x00, sizeof(pthread_t));
|
||||
|
||||
/* pthread_create returns error */
|
||||
rv = pthread_create(&thread, 0, start_routine, arg);
|
||||
if (!rv) {
|
||||
rv = pthread_detach(thread);
|
||||
}
|
||||
return rv;
|
||||
/* pthread_create returns error */
|
||||
rv = pthread_create(&thread, 0, start_routine, arg);
|
||||
|
||||
if (!rv)
|
||||
{
|
||||
rv = pthread_detach(thread);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -73,9 +71,9 @@ tbus APP_CC
|
||||
tc_get_threadid(void)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
return (tbus)GetCurrentThreadId();
|
||||
return (tbus)GetCurrentThreadId();
|
||||
#else
|
||||
return (tbus)pthread_self();
|
||||
return (tbus)pthread_self();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -85,9 +83,9 @@ int APP_CC
|
||||
tc_threadid_equal(tbus tid1, tbus tid2)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
return tid1 == tid2;
|
||||
return tid1 == tid2;
|
||||
#else
|
||||
return pthread_equal((pthread_t)tid1, (pthread_t)tid2);
|
||||
return pthread_equal((pthread_t)tid1, (pthread_t)tid2);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -96,13 +94,13 @@ tbus APP_CC
|
||||
tc_mutex_create(void)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
return (tbus)CreateMutex(0, 0, 0);
|
||||
return (tbus)CreateMutex(0, 0, 0);
|
||||
#else
|
||||
pthread_mutex_t* lmutex;
|
||||
pthread_mutex_t *lmutex;
|
||||
|
||||
lmutex = (pthread_mutex_t*)g_malloc(sizeof(pthread_mutex_t), 0);
|
||||
pthread_mutex_init(lmutex, 0);
|
||||
return (tbus)lmutex;
|
||||
lmutex = (pthread_mutex_t *)g_malloc(sizeof(pthread_mutex_t), 0);
|
||||
pthread_mutex_init(lmutex, 0);
|
||||
return (tbus)lmutex;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -111,13 +109,13 @@ void APP_CC
|
||||
tc_mutex_delete(tbus mutex)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
CloseHandle((HANDLE)mutex);
|
||||
CloseHandle((HANDLE)mutex);
|
||||
#else
|
||||
pthread_mutex_t* lmutex;
|
||||
pthread_mutex_t *lmutex;
|
||||
|
||||
lmutex = (pthread_mutex_t*)mutex;
|
||||
pthread_mutex_destroy(lmutex);
|
||||
g_free(lmutex);
|
||||
lmutex = (pthread_mutex_t *)mutex;
|
||||
pthread_mutex_destroy(lmutex);
|
||||
g_free(lmutex);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -126,11 +124,11 @@ int APP_CC
|
||||
tc_mutex_lock(tbus mutex)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
WaitForSingleObject((HANDLE)mutex, INFINITE);
|
||||
return 0;
|
||||
WaitForSingleObject((HANDLE)mutex, INFINITE);
|
||||
return 0;
|
||||
#else
|
||||
pthread_mutex_lock((pthread_mutex_t*)mutex);
|
||||
return 0;
|
||||
pthread_mutex_lock((pthread_mutex_t *)mutex);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -138,15 +136,18 @@ tc_mutex_lock(tbus mutex)
|
||||
int APP_CC
|
||||
tc_mutex_unlock(tbus mutex)
|
||||
{
|
||||
int rv = 0;
|
||||
int rv = 0;
|
||||
#if defined(_WIN32)
|
||||
ReleaseMutex((HANDLE)mutex);
|
||||
ReleaseMutex((HANDLE)mutex);
|
||||
#else
|
||||
if (mutex != 0) {
|
||||
rv = pthread_mutex_unlock((pthread_mutex_t *)mutex);
|
||||
}
|
||||
|
||||
if (mutex != 0)
|
||||
{
|
||||
rv = pthread_mutex_unlock((pthread_mutex_t *)mutex);
|
||||
}
|
||||
|
||||
#endif
|
||||
return rv;
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -154,16 +155,16 @@ tbus APP_CC
|
||||
tc_sem_create(int init_count)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
HANDLE sem;
|
||||
HANDLE sem;
|
||||
|
||||
sem = CreateSemaphore(0, init_count, init_count + 10, 0);
|
||||
return (tbus)sem;
|
||||
sem = CreateSemaphore(0, init_count, init_count + 10, 0);
|
||||
return (tbus)sem;
|
||||
#else
|
||||
sem_t * sem = (sem_t *)NULL;
|
||||
sem_t *sem = (sem_t *)NULL;
|
||||
|
||||
sem = (sem_t *)g_malloc(sizeof(sem_t), 0);
|
||||
sem_init(sem, 0, init_count);
|
||||
return (tbus)sem;
|
||||
sem = (sem_t *)g_malloc(sizeof(sem_t), 0);
|
||||
sem_init(sem, 0, init_count);
|
||||
return (tbus)sem;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -172,13 +173,13 @@ void APP_CC
|
||||
tc_sem_delete(tbus sem)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
CloseHandle((HANDLE)sem);
|
||||
CloseHandle((HANDLE)sem);
|
||||
#else
|
||||
sem_t* lsem;
|
||||
sem_t *lsem;
|
||||
|
||||
lsem = (sem_t*)sem;
|
||||
sem_destroy(lsem);
|
||||
g_free(lsem);
|
||||
lsem = (sem_t *)sem;
|
||||
sem_destroy(lsem);
|
||||
g_free(lsem);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -187,11 +188,11 @@ int APP_CC
|
||||
tc_sem_dec(tbus sem)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
WaitForSingleObject((HANDLE)sem, INFINITE);
|
||||
return 0;
|
||||
WaitForSingleObject((HANDLE)sem, INFINITE);
|
||||
return 0;
|
||||
#else
|
||||
sem_wait((sem_t*)sem);
|
||||
return 0;
|
||||
sem_wait((sem_t *)sem);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -200,10 +201,10 @@ int APP_CC
|
||||
tc_sem_inc(tbus sem)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
ReleaseSemaphore((HANDLE)sem, 1, 0);
|
||||
return 0;
|
||||
ReleaseSemaphore((HANDLE)sem, 1, 0);
|
||||
return 0;
|
||||
#else
|
||||
sem_post((sem_t*)sem);
|
||||
return 0;
|
||||
sem_post((sem_t *)sem);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
+19
-24
@@ -1,27 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
thread calls
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* thread calls
|
||||
*/
|
||||
|
||||
#if !defined(THREAD_CALLS_H)
|
||||
#define THREAD_CALLS_H
|
||||
|
||||
+384
-343
@@ -1,27 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2008-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
generic transport
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* generic transport
|
||||
*/
|
||||
|
||||
#include "os_calls.h"
|
||||
#include "trans.h"
|
||||
@@ -29,394 +24,440 @@
|
||||
#include "parse.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct trans* APP_CC
|
||||
struct trans *APP_CC
|
||||
trans_create(int mode, int in_size, int out_size)
|
||||
{
|
||||
struct trans* self = (struct trans *)NULL;
|
||||
struct trans *self = (struct trans *)NULL;
|
||||
|
||||
self = (struct trans*)g_malloc(sizeof(struct trans), 1);
|
||||
if (self != NULL) {
|
||||
make_stream(self->in_s);
|
||||
init_stream(self->in_s, in_size);
|
||||
make_stream(self->out_s);
|
||||
init_stream(self->out_s, out_size);
|
||||
self->mode = mode;
|
||||
}
|
||||
return self;
|
||||
self = (struct trans *)g_malloc(sizeof(struct trans), 1);
|
||||
|
||||
if (self != NULL)
|
||||
{
|
||||
make_stream(self->in_s);
|
||||
init_stream(self->in_s, in_size);
|
||||
make_stream(self->out_s);
|
||||
init_stream(self->out_s, out_size);
|
||||
self->mode = mode;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
trans_delete(struct trans* self)
|
||||
trans_delete(struct trans *self)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
free_stream(self->in_s);
|
||||
free_stream(self->out_s);
|
||||
if (self->sck > 0) {
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
self->sck = 0;
|
||||
if (self->listen_filename != 0)
|
||||
{
|
||||
g_file_delete(self->listen_filename);
|
||||
g_free(self->listen_filename);
|
||||
}
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_get_wait_objs(struct trans* self, tbus* objs, int* count)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
objs[*count] = self->sck;
|
||||
(*count)++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_check_wait_objs(struct trans* self)
|
||||
{
|
||||
tbus in_sck = (tbus)0;
|
||||
struct trans* in_trans = (struct trans *)NULL;
|
||||
int read_bytes = 0;
|
||||
int to_read = 0;
|
||||
int read_so_far = 0;
|
||||
int rv = 0;
|
||||
|
||||
if (self == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
rv = 0;
|
||||
if (self->type1 == TRANS_TYPE_LISTENER) /* listening */
|
||||
{
|
||||
if (g_tcp_can_recv(self->sck, 0))
|
||||
if (self == 0)
|
||||
{
|
||||
in_sck = g_tcp_accept(self->sck);
|
||||
if (in_sck == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
/* ok, but shouldn't happen */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (in_sck != -1)
|
||||
{
|
||||
if (self->trans_conn_in != 0) /* is function assigned */
|
||||
{
|
||||
in_trans = trans_create(self->mode, self->in_s->size,
|
||||
self->out_s->size);
|
||||
in_trans->sck = in_sck;
|
||||
in_trans->type1 = TRANS_TYPE_SERVER;
|
||||
in_trans->status = TRANS_STATUS_UP;
|
||||
if (self->trans_conn_in(self, in_trans) != 0)
|
||||
{
|
||||
trans_delete(in_trans);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_tcp_close(in_sck);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* connected server or client (2 or 3) */
|
||||
{
|
||||
if (g_tcp_can_recv(self->sck, 0))
|
||||
|
||||
free_stream(self->in_s);
|
||||
free_stream(self->out_s);
|
||||
|
||||
if (self->sck > 0)
|
||||
{
|
||||
read_so_far = (int)(self->in_s->end - self->in_s->data);
|
||||
to_read = self->header_size - read_so_far;
|
||||
if (to_read > 0)
|
||||
{
|
||||
read_bytes = g_tcp_recv(self->sck, self->in_s->end, to_read, 0);
|
||||
if (read_bytes == -1)
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
|
||||
self->sck = 0;
|
||||
|
||||
if (self->listen_filename != 0)
|
||||
{
|
||||
g_file_delete(self->listen_filename);
|
||||
g_free(self->listen_filename);
|
||||
}
|
||||
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_get_wait_objs(struct trans *self, tbus *objs, int *count)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
objs[*count] = self->sck;
|
||||
(*count)++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_check_wait_objs(struct trans *self)
|
||||
{
|
||||
tbus in_sck = (tbus)0;
|
||||
struct trans *in_trans = (struct trans *)NULL;
|
||||
int read_bytes = 0;
|
||||
int to_read = 0;
|
||||
int read_so_far = 0;
|
||||
int rv = 0;
|
||||
|
||||
if (self == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
|
||||
if (self->type1 == TRANS_TYPE_LISTENER) /* listening */
|
||||
{
|
||||
if (g_tcp_can_recv(self->sck, 0))
|
||||
{
|
||||
in_sck = g_tcp_accept(self->sck);
|
||||
|
||||
if (in_sck == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
/* ok, but shouldn't happen */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (in_sck != -1)
|
||||
{
|
||||
if (self->trans_conn_in != 0) /* is function assigned */
|
||||
{
|
||||
in_trans = trans_create(self->mode, self->in_s->size,
|
||||
self->out_s->size);
|
||||
in_trans->sck = in_sck;
|
||||
in_trans->type1 = TRANS_TYPE_SERVER;
|
||||
in_trans->status = TRANS_STATUS_UP;
|
||||
|
||||
if (self->trans_conn_in(self, in_trans) != 0)
|
||||
{
|
||||
trans_delete(in_trans);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_tcp_close(in_sck);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else /* connected server or client (2 or 3) */
|
||||
{
|
||||
if (g_tcp_can_recv(self->sck, 0))
|
||||
{
|
||||
read_so_far = (int)(self->in_s->end - self->in_s->data);
|
||||
to_read = self->header_size - read_so_far;
|
||||
|
||||
if (to_read > 0)
|
||||
{
|
||||
read_bytes = g_tcp_recv(self->sck, self->in_s->end, to_read, 0);
|
||||
|
||||
if (read_bytes == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
/* ok, but shouldn't happen */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (read_bytes == 0)
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self->in_s->end += read_bytes;
|
||||
}
|
||||
}
|
||||
|
||||
read_so_far = (int)(self->in_s->end - self->in_s->data);
|
||||
|
||||
if (read_so_far == self->header_size)
|
||||
{
|
||||
if (self->trans_data_in != 0)
|
||||
{
|
||||
rv = self->trans_data_in(self);
|
||||
init_stream(self->in_s, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_force_read_s(struct trans *self, struct stream *in_s, int size)
|
||||
{
|
||||
int rcvd;
|
||||
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (size > 0)
|
||||
{
|
||||
rcvd = g_tcp_recv(self->sck, in_s->end, size, 0);
|
||||
|
||||
if (rcvd == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
if (!g_tcp_can_recv(self->sck, 10))
|
||||
{
|
||||
/* check for term here */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (rcvd == 0)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
/* ok, but shouldn't happen */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (read_bytes == 0)
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
self->in_s->end += read_bytes;
|
||||
in_s->end += rcvd;
|
||||
size -= rcvd;
|
||||
}
|
||||
}
|
||||
read_so_far = (int)(self->in_s->end - self->in_s->data);
|
||||
if (read_so_far == self->header_size)
|
||||
{
|
||||
if (self->trans_data_in != 0)
|
||||
{
|
||||
rv = self->trans_data_in(self);
|
||||
init_stream(self->in_s, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_force_read_s(struct trans* self, struct stream* in_s, int size)
|
||||
trans_force_read(struct trans *self, int size)
|
||||
{
|
||||
int rcvd;
|
||||
return trans_force_read_s(self, self->in_s, size);
|
||||
}
|
||||
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
while (size > 0)
|
||||
{
|
||||
rcvd = g_tcp_recv(self->sck, in_s->end, size, 0);
|
||||
if (rcvd == -1)
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_force_write_s(struct trans *self, struct stream *out_s)
|
||||
{
|
||||
int size;
|
||||
int total;
|
||||
int sent;
|
||||
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
if (!g_tcp_can_recv(self->sck, 10))
|
||||
{
|
||||
/* check for term here */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (rcvd == 0)
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
in_s->end += rcvd;
|
||||
size -= rcvd;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_force_read(struct trans* self, int size)
|
||||
{
|
||||
return trans_force_read_s(self, self->in_s, size);
|
||||
}
|
||||
size = (int)(out_s->end - out_s->data);
|
||||
total = 0;
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_force_write_s(struct trans* self, struct stream* out_s)
|
||||
{
|
||||
int size;
|
||||
int total;
|
||||
int sent;
|
||||
|
||||
if (self->status != TRANS_STATUS_UP)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
size = (int)(out_s->end - out_s->data);
|
||||
total = 0;
|
||||
while (total < size)
|
||||
{
|
||||
sent = g_tcp_send(self->sck, out_s->data + total, size - total, 0);
|
||||
if (sent == -1)
|
||||
while (total < size)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
if (!g_tcp_can_send(self->sck, 10))
|
||||
sent = g_tcp_send(self->sck, out_s->data + total, size - total, 0);
|
||||
|
||||
if (sent == -1)
|
||||
{
|
||||
/* check for term here */
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
if (!g_tcp_can_send(self->sck, 10))
|
||||
{
|
||||
/* check for term here */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (sent == 0)
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
total = total + sent;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (sent == 0)
|
||||
{
|
||||
/* error */
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
total = total + sent;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_force_write(struct trans* self)
|
||||
trans_force_write(struct trans *self)
|
||||
{
|
||||
return trans_force_write_s(self, self->out_s);
|
||||
return trans_force_write_s(self, self->out_s);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_connect(struct trans* self, const char* server, const char* port,
|
||||
trans_connect(struct trans *self, const char *server, const char *port,
|
||||
int timeout)
|
||||
{
|
||||
int error;
|
||||
int error;
|
||||
|
||||
if (self->sck != 0)
|
||||
{
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
if (self->mode == TRANS_MODE_TCP) /* tcp */
|
||||
{
|
||||
self->sck = g_tcp_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
error = g_tcp_connect(self->sck, server, port);
|
||||
}
|
||||
else if (self->mode == TRANS_MODE_UNIX) /* unix socket */
|
||||
{
|
||||
self->sck = g_tcp_local_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
error = g_tcp_local_connect(self->sck, port);
|
||||
}
|
||||
else
|
||||
{
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
if (error == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
if (self->sck != 0)
|
||||
{
|
||||
if (g_tcp_can_send(self->sck, timeout))
|
||||
{
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_CLIENT; /* client */
|
||||
return 0;
|
||||
}
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_CLIENT; /* client */
|
||||
return 0;
|
||||
|
||||
if (self->mode == TRANS_MODE_TCP) /* tcp */
|
||||
{
|
||||
self->sck = g_tcp_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
error = g_tcp_connect(self->sck, server, port);
|
||||
}
|
||||
else if (self->mode == TRANS_MODE_UNIX) /* unix socket */
|
||||
{
|
||||
self->sck = g_tcp_local_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
error = g_tcp_local_connect(self->sck, port);
|
||||
}
|
||||
else
|
||||
{
|
||||
self->status = TRANS_STATUS_DOWN;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (error == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
if (g_tcp_can_send(self->sck, timeout))
|
||||
{
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_CLIENT; /* client */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_CLIENT; /* client */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_listen_address(struct trans* self, char* port, const char* address)
|
||||
trans_listen_address(struct trans *self, char *port, const char *address)
|
||||
{
|
||||
if (self->sck != 0)
|
||||
{
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
if (self->mode == TRANS_MODE_TCP) /* tcp */
|
||||
{
|
||||
self->sck = g_tcp_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
if (g_tcp_bind_address(self->sck, port, address) == 0)
|
||||
if (self->sck != 0)
|
||||
{
|
||||
if (g_tcp_listen(self->sck) == 0)
|
||||
{
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_LISTENER; /* listener */
|
||||
return 0;
|
||||
}
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
}
|
||||
else if (self->mode == TRANS_MODE_UNIX) /* unix socket */
|
||||
{
|
||||
g_free(self->listen_filename);
|
||||
self->listen_filename = 0;
|
||||
g_file_delete(port);
|
||||
self->sck = g_tcp_local_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
if (g_tcp_local_bind(self->sck, port) == 0)
|
||||
|
||||
if (self->mode == TRANS_MODE_TCP) /* tcp */
|
||||
{
|
||||
self->listen_filename = g_strdup(port);
|
||||
if (g_tcp_listen(self->sck) == 0)
|
||||
{
|
||||
g_chmod_hex(port, 0xffff);
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_LISTENER; /* listener */
|
||||
return 0;
|
||||
}
|
||||
self->sck = g_tcp_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
|
||||
if (g_tcp_bind_address(self->sck, port, address) == 0)
|
||||
{
|
||||
if (g_tcp_listen(self->sck) == 0)
|
||||
{
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_LISTENER; /* listener */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
else if (self->mode == TRANS_MODE_UNIX) /* unix socket */
|
||||
{
|
||||
g_free(self->listen_filename);
|
||||
self->listen_filename = 0;
|
||||
g_file_delete(port);
|
||||
self->sck = g_tcp_local_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
|
||||
if (g_tcp_local_bind(self->sck, port) == 0)
|
||||
{
|
||||
self->listen_filename = g_strdup(port);
|
||||
|
||||
if (g_tcp_listen(self->sck) == 0)
|
||||
{
|
||||
g_chmod_hex(port, 0xffff);
|
||||
self->status = TRANS_STATUS_UP; /* ok */
|
||||
self->type1 = TRANS_TYPE_LISTENER; /* listener */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_listen(struct trans* self, char* port)
|
||||
trans_listen(struct trans *self, char *port)
|
||||
{
|
||||
return trans_listen_address(self, port, "0.0.0.0");
|
||||
return trans_listen_address(self, port, "0.0.0.0");
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
struct stream* APP_CC
|
||||
trans_get_in_s(struct trans* self)
|
||||
struct stream *APP_CC
|
||||
trans_get_in_s(struct trans *self)
|
||||
{
|
||||
struct stream * rv = (struct stream *)NULL;
|
||||
if (self == NULL) {
|
||||
rv = (struct stream *)NULL;
|
||||
}
|
||||
else {
|
||||
rv = self->in_s;
|
||||
}
|
||||
return rv;
|
||||
struct stream *rv = (struct stream *)NULL;
|
||||
|
||||
if (self == NULL)
|
||||
{
|
||||
rv = (struct stream *)NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = self->in_s;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
struct stream* APP_CC
|
||||
trans_get_out_s(struct trans* self, int size)
|
||||
struct stream *APP_CC
|
||||
trans_get_out_s(struct trans *self, int size)
|
||||
{
|
||||
struct stream * rv = (struct stream *)NULL;
|
||||
if (self == NULL) {
|
||||
rv = (struct stream *)NULL;
|
||||
}
|
||||
else {
|
||||
init_stream(self->out_s, size);
|
||||
rv = self->out_s;
|
||||
}
|
||||
return rv;
|
||||
struct stream *rv = (struct stream *)NULL;
|
||||
|
||||
if (self == NULL)
|
||||
{
|
||||
rv = (struct stream *)NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
init_stream(self->out_s, size);
|
||||
rv = self->out_s;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
+19
-24
@@ -1,27 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2008-2010 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
generic transport
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* generic transport
|
||||
*/
|
||||
|
||||
#if !defined(TRANS_H)
|
||||
#define TRANS_H
|
||||
|
||||
+19
-24
@@ -1,27 +1,22 @@
|
||||
/*
|
||||
Copyright (c) 2012 Jay Sorg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
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
|
||||
AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
xrdp / xserver info / caps
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* xrdp / xserver info / caps
|
||||
*/
|
||||
|
||||
#if !defined(XRDP_CLIENT_INFO_H)
|
||||
#define XRDP_CLIENT_INFO_H
|
||||
|
||||
+436
-360
@@ -1,3 +1,20 @@
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
@@ -25,426 +42,485 @@ static int g_running = 0;
|
||||
int
|
||||
check_messages(void)
|
||||
{
|
||||
MSG msg;
|
||||
MSG msg;
|
||||
|
||||
while (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
|
||||
{
|
||||
GetMessage(&msg, NULL, 0, 0);
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
return 0;
|
||||
while (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
|
||||
{
|
||||
GetMessage(&msg, NULL, 0, 0);
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
msg(char* msg1, ...)
|
||||
msg(char *msg1, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char text1[512];
|
||||
va_list ap;
|
||||
char text1[512];
|
||||
|
||||
va_start(ap, msg1);
|
||||
vsnprintf(text1, 511, msg1, ap);
|
||||
SendMessageA(g_lb, LB_ADDSTRING, 0, (LPARAM)text1);
|
||||
va_end(ap);
|
||||
return 0;
|
||||
va_start(ap, msg1);
|
||||
vsnprintf(text1, 511, msg1, ap);
|
||||
SendMessageA(g_lb, LB_ADDSTRING, 0, (LPARAM)text1);
|
||||
va_end(ap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
show_last_error(void)
|
||||
{
|
||||
LPVOID lpMsgBuf;
|
||||
|
||||
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL, GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPSTR)&lpMsgBuf, 0, NULL);
|
||||
msg("GetLastError - %s", lpMsgBuf);
|
||||
LocalFree(lpMsgBuf);
|
||||
return 0;
|
||||
LPVOID lpMsgBuf;
|
||||
|
||||
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL, GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPSTR)&lpMsgBuf, 0, NULL);
|
||||
msg("GetLastError - %s", lpMsgBuf);
|
||||
LocalFree(lpMsgBuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
font_dump(void)
|
||||
{
|
||||
HDC dc;
|
||||
HDC dc1;
|
||||
RECT rect;
|
||||
HBRUSH brush;
|
||||
HGDIOBJ saved;
|
||||
HBITMAP bitmap;
|
||||
BITMAPINFO bi;
|
||||
char* bits;
|
||||
ABC abc;
|
||||
SIZE sz;
|
||||
char filename[256];
|
||||
TCHAR text[256];
|
||||
char zero1;
|
||||
char* bmtext;
|
||||
int bmtextindex;
|
||||
int fd;
|
||||
int x1;
|
||||
int strlen1;
|
||||
int index1;
|
||||
int index2;
|
||||
int len;
|
||||
int pixel;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int width;
|
||||
int height;
|
||||
int roller;
|
||||
int outlen;
|
||||
tui8 b1;
|
||||
short x2;
|
||||
HDC dc;
|
||||
HDC dc1;
|
||||
RECT rect;
|
||||
HBRUSH brush;
|
||||
HGDIOBJ saved;
|
||||
HBITMAP bitmap;
|
||||
BITMAPINFO bi;
|
||||
char *bits;
|
||||
ABC abc;
|
||||
SIZE sz;
|
||||
char filename[256];
|
||||
TCHAR text[256];
|
||||
char zero1;
|
||||
char *bmtext;
|
||||
int bmtextindex;
|
||||
int fd;
|
||||
int x1;
|
||||
int strlen1;
|
||||
int index1;
|
||||
int index2;
|
||||
int len;
|
||||
int pixel;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int width;
|
||||
int height;
|
||||
int roller;
|
||||
int outlen;
|
||||
tui8 b1;
|
||||
short x2;
|
||||
|
||||
if (g_running)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
g_running = 1;
|
||||
msg("starting");
|
||||
g_font_name[0] = 0;
|
||||
SendMessageA(g_font_list, WM_GETTEXT, 255, (LPARAM)g_font_name);
|
||||
if (g_strlen(g_font_name) == 0)
|
||||
{
|
||||
msg("error font not set");
|
||||
g_running = 0;
|
||||
return 1;
|
||||
}
|
||||
dc = GetDC(g_wnd);
|
||||
height = -MulDiv(g_font_size, GetDeviceCaps(dc, LOGPIXELSY), 72);
|
||||
g_font = CreateFontA(height, 0, 0, 0, FW_DONTCARE, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, g_font_name);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
if (g_font == 0)
|
||||
{
|
||||
msg("error - Font creation failed");
|
||||
}
|
||||
zero1 = 0;
|
||||
g_snprintf(filename, 255, "%s-%d.fv1", g_font_name, g_font_size);
|
||||
msg("creating file %s", filename);
|
||||
g_file_delete(filename);
|
||||
fd = g_file_open(filename);
|
||||
g_file_write(fd, "FNT1", 4);
|
||||
strlen1 = g_strlen(g_font_name);
|
||||
g_file_write(fd, g_font_name, strlen1);
|
||||
x1 = strlen1;
|
||||
while (x1 < 32)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
x1++;
|
||||
}
|
||||
x2 = g_font_size; /* font size */
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
x2 = 1; /* style */
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* pad */
|
||||
index1 = 0;
|
||||
while (index1 < 8)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
for (x1 = 32; x1 < 0x4e00; x1++)
|
||||
{
|
||||
check_messages();
|
||||
dc = GetWindowDC(g_wnd);
|
||||
saved = SelectObject(dc, g_font);
|
||||
if (!GetCharABCWidths(dc, x1, x1, &abc))
|
||||
if (g_running)
|
||||
{
|
||||
show_last_error();
|
||||
return 0;
|
||||
}
|
||||
text[0] = (TCHAR)x1;
|
||||
text[1] = 0;
|
||||
if (!GetTextExtentPoint32(dc, text, 1, &sz))
|
||||
|
||||
g_running = 1;
|
||||
msg("starting");
|
||||
g_font_name[0] = 0;
|
||||
SendMessageA(g_font_list, WM_GETTEXT, 255, (LPARAM)g_font_name);
|
||||
|
||||
if (g_strlen(g_font_name) == 0)
|
||||
{
|
||||
show_last_error();
|
||||
msg("error font not set");
|
||||
g_running = 0;
|
||||
return 1;
|
||||
}
|
||||
SelectObject(dc, saved);
|
||||
|
||||
dc = GetDC(g_wnd);
|
||||
height = -MulDiv(g_font_size, GetDeviceCaps(dc, LOGPIXELSY), 72);
|
||||
g_font = CreateFontA(height, 0, 0, 0, FW_DONTCARE, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, g_font_name);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
if ((sz.cx > 0) && (sz.cy > 0))
|
||||
|
||||
if (g_font == 0)
|
||||
{
|
||||
msg("error - Font creation failed");
|
||||
}
|
||||
|
||||
zero1 = 0;
|
||||
g_snprintf(filename, 255, "%s-%d.fv1", g_font_name, g_font_size);
|
||||
msg("creating file %s", filename);
|
||||
g_file_delete(filename);
|
||||
fd = g_file_open(filename);
|
||||
g_file_write(fd, "FNT1", 4);
|
||||
strlen1 = g_strlen(g_font_name);
|
||||
g_file_write(fd, g_font_name, strlen1);
|
||||
x1 = strlen1;
|
||||
|
||||
while (x1 < 32)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
x1++;
|
||||
}
|
||||
|
||||
x2 = g_font_size; /* font size */
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
x2 = 1; /* style */
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* pad */
|
||||
index1 = 0;
|
||||
|
||||
while (index1 < 8)
|
||||
{
|
||||
dc = GetWindowDC(g_wnd);
|
||||
saved = SelectObject(dc, g_font);
|
||||
SetBkColor(dc, RGB(255, 255, 255));
|
||||
if (!ExtTextOut(dc, 50, 50, ETO_OPAQUE, 0, text, 1, 0))
|
||||
{
|
||||
show_last_error();
|
||||
}
|
||||
SelectObject(dc, saved);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
Sleep(10);
|
||||
/* width */
|
||||
x2 = abc.abcB;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* height */
|
||||
x2 = sz.cy;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* baseline */
|
||||
x2 = -sz.cy;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* offset */
|
||||
x2 = abc.abcA;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* incby */
|
||||
x2 = sz.cx;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* pad */
|
||||
index1 = 0;
|
||||
while (index1 < 6)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
dc = GetWindowDC(g_wnd);
|
||||
rect.left = 50 + abc.abcA;
|
||||
rect.top = 50;
|
||||
rect.right = rect.left + abc.abcB;
|
||||
rect.bottom = rect.top + sz.cy;
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
width = (abc.abcB + 7) & (~7);
|
||||
height = sz.cy;
|
||||
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
||||
bi.bmiHeader.biWidth = width;
|
||||
bi.bmiHeader.biHeight = height;
|
||||
bi.bmiHeader.biPlanes = 1;
|
||||
bi.bmiHeader.biBitCount = 32;
|
||||
bitmap = CreateDIBSection(dc, &bi, DIB_RGB_COLORS, (void*)&bits, 0, 0);
|
||||
if (bitmap == 0)
|
||||
{
|
||||
msg("error - CreateDIBSection failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(bits, 0, width * height * 4);
|
||||
dc1 = CreateCompatibleDC(dc);
|
||||
SelectObject(dc1, bitmap);
|
||||
if (!BitBlt(dc1, 0, 0, width, height, dc, rect.left, rect.top, SRCCOPY))
|
||||
}
|
||||
|
||||
for (x1 = 32; x1 < 0x4e00; x1++)
|
||||
{
|
||||
check_messages();
|
||||
dc = GetWindowDC(g_wnd);
|
||||
saved = SelectObject(dc, g_font);
|
||||
|
||||
if (!GetCharABCWidths(dc, x1, x1, &abc))
|
||||
{
|
||||
show_last_error();
|
||||
show_last_error();
|
||||
}
|
||||
bmtext = (char*)g_malloc(width * height + 16, 1);
|
||||
bmtextindex = 0;
|
||||
for (index1 = (height - 1); index1 >= 0; index1--)
|
||||
|
||||
text[0] = (TCHAR)x1;
|
||||
text[1] = 0;
|
||||
|
||||
if (!GetTextExtentPoint32(dc, text, 1, &sz))
|
||||
{
|
||||
for (index2 = 0; index2 < width; index2++)
|
||||
{
|
||||
pixel = ((int*)bits)[index1 * width + index2];
|
||||
red = (pixel >> 16) & 0xff;
|
||||
green = (pixel >> 8) & 0xff;
|
||||
blue = (pixel >> 0) & 0xff;
|
||||
if (red == 0 && green == 0 && blue == 0)
|
||||
show_last_error();
|
||||
}
|
||||
|
||||
SelectObject(dc, saved);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
|
||||
if ((sz.cx > 0) && (sz.cy > 0))
|
||||
{
|
||||
dc = GetWindowDC(g_wnd);
|
||||
saved = SelectObject(dc, g_font);
|
||||
SetBkColor(dc, RGB(255, 255, 255));
|
||||
|
||||
if (!ExtTextOut(dc, 50, 50, ETO_OPAQUE, 0, text, 1, 0))
|
||||
{
|
||||
bmtext[bmtextindex] = '1';
|
||||
bmtextindex++;
|
||||
show_last_error();
|
||||
}
|
||||
|
||||
SelectObject(dc, saved);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
Sleep(10);
|
||||
/* width */
|
||||
x2 = abc.abcB;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* height */
|
||||
x2 = sz.cy;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* baseline */
|
||||
x2 = -sz.cy;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* offset */
|
||||
x2 = abc.abcA;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* incby */
|
||||
x2 = sz.cx;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* pad */
|
||||
index1 = 0;
|
||||
|
||||
while (index1 < 6)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
|
||||
dc = GetWindowDC(g_wnd);
|
||||
rect.left = 50 + abc.abcA;
|
||||
rect.top = 50;
|
||||
rect.right = rect.left + abc.abcB;
|
||||
rect.bottom = rect.top + sz.cy;
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
width = (abc.abcB + 7) & (~7);
|
||||
height = sz.cy;
|
||||
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
|
||||
bi.bmiHeader.biWidth = width;
|
||||
bi.bmiHeader.biHeight = height;
|
||||
bi.bmiHeader.biPlanes = 1;
|
||||
bi.bmiHeader.biBitCount = 32;
|
||||
bitmap = CreateDIBSection(dc, &bi, DIB_RGB_COLORS, (void *)&bits, 0, 0);
|
||||
|
||||
if (bitmap == 0)
|
||||
{
|
||||
msg("error - CreateDIBSection failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
bmtext[bmtextindex] = '0';
|
||||
bmtextindex++;
|
||||
memset(bits, 0, width * height * 4);
|
||||
dc1 = CreateCompatibleDC(dc);
|
||||
SelectObject(dc1, bitmap);
|
||||
|
||||
if (!BitBlt(dc1, 0, 0, width, height, dc, rect.left, rect.top, SRCCOPY))
|
||||
{
|
||||
show_last_error();
|
||||
}
|
||||
|
||||
bmtext = (char *)g_malloc(width * height + 16, 1);
|
||||
bmtextindex = 0;
|
||||
|
||||
for (index1 = (height - 1); index1 >= 0; index1--)
|
||||
{
|
||||
for (index2 = 0; index2 < width; index2++)
|
||||
{
|
||||
pixel = ((int *)bits)[index1 * width + index2];
|
||||
red = (pixel >> 16) & 0xff;
|
||||
green = (pixel >> 8) & 0xff;
|
||||
blue = (pixel >> 0) & 0xff;
|
||||
|
||||
if (red == 0 && green == 0 && blue == 0)
|
||||
{
|
||||
bmtext[bmtextindex] = '1';
|
||||
bmtextindex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
bmtext[bmtextindex] = '0';
|
||||
bmtextindex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
outlen = 0;
|
||||
b1 = 0;
|
||||
roller = 0;
|
||||
len = g_strlen(bmtext);
|
||||
|
||||
for (index2 = 0; index2 < len; index2++)
|
||||
{
|
||||
if (bmtext[index2] == '1')
|
||||
{
|
||||
switch (roller)
|
||||
{
|
||||
case 0:
|
||||
b1 = b1 | 0x80;
|
||||
break;
|
||||
case 1:
|
||||
b1 = b1 | 0x40;
|
||||
break;
|
||||
case 2:
|
||||
b1 = b1 | 0x20;
|
||||
break;
|
||||
case 3:
|
||||
b1 = b1 | 0x10;
|
||||
break;
|
||||
case 4:
|
||||
b1 = b1 | 0x08;
|
||||
break;
|
||||
case 5:
|
||||
b1 = b1 | 0x04;
|
||||
break;
|
||||
case 6:
|
||||
b1 = b1 | 0x02;
|
||||
break;
|
||||
case 7:
|
||||
b1 = b1 | 0x01;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
roller++;
|
||||
|
||||
if (roller == 8)
|
||||
{
|
||||
roller = 0;
|
||||
g_file_write(fd, &b1, 1);
|
||||
outlen++;
|
||||
b1 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
while ((outlen % 4) != 0)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
outlen++;
|
||||
}
|
||||
|
||||
free(bmtext);
|
||||
DeleteDC(dc1);
|
||||
DeleteObject(bitmap);
|
||||
}
|
||||
}
|
||||
}
|
||||
outlen = 0;
|
||||
b1 = 0;
|
||||
roller = 0;
|
||||
len = g_strlen(bmtext);
|
||||
for (index2 = 0; index2 < len; index2++)
|
||||
{
|
||||
if (bmtext[index2] == '1')
|
||||
{
|
||||
switch (roller)
|
||||
|
||||
if (sz.cx != (long)(abc.abcA + abc.abcB + abc.abcC))
|
||||
{
|
||||
case 0: b1 = b1 | 0x80; break;
|
||||
case 1: b1 = b1 | 0x40; break;
|
||||
case 2: b1 = b1 | 0x20; break;
|
||||
case 3: b1 = b1 | 0x10; break;
|
||||
case 4: b1 = b1 | 0x08; break;
|
||||
case 5: b1 = b1 | 0x04; break;
|
||||
case 6: b1 = b1 | 0x02; break;
|
||||
case 7: b1 = b1 | 0x01; break;
|
||||
msg("error - width not right 1");
|
||||
}
|
||||
}
|
||||
roller++;
|
||||
if (roller == 8)
|
||||
{
|
||||
roller = 0;
|
||||
g_file_write(fd, &b1, 1);
|
||||
outlen++;
|
||||
b1 = 0;
|
||||
}
|
||||
|
||||
brush = CreateSolidBrush(RGB(255, 255, 255));
|
||||
FillRect(dc, &rect, brush);
|
||||
DeleteObject(brush);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
}
|
||||
while ((outlen % 4) != 0)
|
||||
else
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
outlen++;
|
||||
/* write out a blank glyph here */
|
||||
/* width */
|
||||
x2 = 1;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* height */
|
||||
x2 = 1;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* baseline */
|
||||
x2 = 0;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* offset */
|
||||
x2 = 0;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* incby */
|
||||
x2 = 1;
|
||||
g_file_write(fd, (char *)&x2, 2);
|
||||
/* pad */
|
||||
index1 = 0;
|
||||
|
||||
while (index1 < 6)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
|
||||
/* blank bitmap */
|
||||
index1 = 0;
|
||||
|
||||
while (index1 < 4)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
}
|
||||
free(bmtext);
|
||||
DeleteDC(dc1);
|
||||
DeleteObject(bitmap);
|
||||
}
|
||||
if (sz.cx != (long)(abc.abcA + abc.abcB + abc.abcC))
|
||||
{
|
||||
msg("error - width not right 1");
|
||||
}
|
||||
brush = CreateSolidBrush(RGB(255, 255, 255));
|
||||
FillRect(dc, &rect, brush);
|
||||
DeleteObject(brush);
|
||||
ReleaseDC(g_wnd, dc);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* write out a blank glyph here */
|
||||
/* width */
|
||||
x2 = 1;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* height */
|
||||
x2 = 1;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* baseline */
|
||||
x2 = 0;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* offset */
|
||||
x2 = 0;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* incby */
|
||||
x2 = 1;
|
||||
g_file_write(fd, (char*)&x2, 2);
|
||||
/* pad */
|
||||
index1 = 0;
|
||||
while (index1 < 6)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
/* blank bitmap */
|
||||
index1 = 0;
|
||||
while (index1 < 4)
|
||||
{
|
||||
g_file_write(fd, &zero1, 1);
|
||||
index1++;
|
||||
}
|
||||
}
|
||||
}
|
||||
g_file_close(fd);
|
||||
msg("done");
|
||||
g_running = 0;
|
||||
return 0;
|
||||
|
||||
g_file_close(fd);
|
||||
msg("done");
|
||||
g_running = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static LRESULT CALLBACK
|
||||
wnd_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HBRUSH brush;
|
||||
RECT rect;
|
||||
PAINTSTRUCT ps;
|
||||
HBRUSH brush;
|
||||
RECT rect;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_PAINT:
|
||||
BeginPaint(hWnd, &ps);
|
||||
brush = CreateSolidBrush(RGB(255, 255, 255));
|
||||
rect = ps.rcPaint;
|
||||
FillRect(ps.hdc, &rect, brush);
|
||||
DeleteObject(brush);
|
||||
EndPaint(hWnd, &ps);
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(g_wnd);
|
||||
g_wnd = 0;
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
case WM_TIMER:
|
||||
KillTimer(g_wnd, 1);
|
||||
font_dump();
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
if ((HWND)lParam == g_exit_button)
|
||||
{
|
||||
PostMessage(g_wnd, WM_CLOSE, 0, 0);
|
||||
}
|
||||
else if ((HWND)lParam == g_go_button)
|
||||
{
|
||||
while (SendMessage(g_lb, LB_GETCOUNT, 0, 0) > 0)
|
||||
{
|
||||
SendMessage(g_lb, LB_DELETESTRING, 0, 0);
|
||||
}
|
||||
SetTimer(g_wnd, 1, 1000, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
switch (message)
|
||||
{
|
||||
case WM_PAINT:
|
||||
BeginPaint(hWnd, &ps);
|
||||
brush = CreateSolidBrush(RGB(255, 255, 255));
|
||||
rect = ps.rcPaint;
|
||||
FillRect(ps.hdc, &rect, brush);
|
||||
DeleteObject(brush);
|
||||
EndPaint(hWnd, &ps);
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(g_wnd);
|
||||
g_wnd = 0;
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
case WM_TIMER:
|
||||
KillTimer(g_wnd, 1);
|
||||
font_dump();
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
|
||||
if ((HWND)lParam == g_exit_button)
|
||||
{
|
||||
PostMessage(g_wnd, WM_CLOSE, 0, 0);
|
||||
}
|
||||
else if ((HWND)lParam == g_go_button)
|
||||
{
|
||||
while (SendMessage(g_lb, LB_GETCOUNT, 0, 0) > 0)
|
||||
{
|
||||
SendMessage(g_lb, LB_DELETESTRING, 0, 0);
|
||||
}
|
||||
|
||||
SetTimer(g_wnd, 1, 1000, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
create_window(void)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
DWORD style;
|
||||
HDC dc;
|
||||
int height;
|
||||
int left;
|
||||
int top;
|
||||
WNDCLASS wc;
|
||||
DWORD style;
|
||||
HDC dc;
|
||||
int height;
|
||||
int left;
|
||||
int top;
|
||||
|
||||
ZeroMemory(&wc, sizeof(wc));
|
||||
wc.lpfnWndProc = wnd_proc; /* points to window procedure */
|
||||
/* name of window class */
|
||||
wc.lpszClassName = _T("fontdump");
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
/* Register the window class. */
|
||||
if (!RegisterClass(&wc))
|
||||
{
|
||||
return 0; /* Failed to register window class */
|
||||
}
|
||||
style = WS_OVERLAPPED | WS_CAPTION | WS_POPUP | WS_MINIMIZEBOX |
|
||||
WS_SYSMENU | WS_SIZEBOX | WS_MAXIMIZEBOX;
|
||||
left = GetSystemMetrics(SM_CXSCREEN) / 2 - 640 / 2;
|
||||
top = GetSystemMetrics(SM_CYSCREEN) / 2 - 480 / 2;
|
||||
g_wnd = CreateWindow(wc.lpszClassName, _T("fontdump"),
|
||||
style, left, top, 640, 480,
|
||||
(HWND) NULL, (HMENU) NULL, g_instance,
|
||||
(LPVOID) NULL);
|
||||
style = WS_CHILD | WS_VISIBLE | WS_BORDER;
|
||||
g_lb = CreateWindow(_T("LISTBOX"), _T("LISTBOX1"), style,
|
||||
200, 10, 400, 400, g_wnd, 0, g_instance, 0);
|
||||
style = WS_CHILD | WS_VISIBLE;
|
||||
g_exit_button = CreateWindow(_T("BUTTON"), _T("Exit"), style,
|
||||
540, 410, 75, 25, g_wnd, 0, g_instance, 0);
|
||||
g_go_button = CreateWindow(_T("BUTTON"), _T("Go"), style,
|
||||
440, 410, 75, 25, g_wnd, 0, g_instance, 0);
|
||||
style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWN;
|
||||
g_font_list = CreateWindow(_T("COMBOBOX"), _T("COMBOBOX1"), style,
|
||||
50, 250, 125, 125, g_wnd, 0, g_instance, 0);
|
||||
ShowWindow(g_wnd, SW_SHOWNORMAL);
|
||||
PostMessage(g_wnd, WM_SETFONT, (WPARAM)g_font, 0);
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Tahoma");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"DejaVu Serif");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"DejaVu Sans");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Arial");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Comic Sans MS");
|
||||
return 0;
|
||||
ZeroMemory(&wc, sizeof(wc));
|
||||
wc.lpfnWndProc = wnd_proc; /* points to window procedure */
|
||||
/* name of window class */
|
||||
wc.lpszClassName = _T("fontdump");
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
|
||||
/* Register the window class. */
|
||||
if (!RegisterClass(&wc))
|
||||
{
|
||||
return 0; /* Failed to register window class */
|
||||
}
|
||||
|
||||
style = WS_OVERLAPPED | WS_CAPTION | WS_POPUP | WS_MINIMIZEBOX |
|
||||
WS_SYSMENU | WS_SIZEBOX | WS_MAXIMIZEBOX;
|
||||
left = GetSystemMetrics(SM_CXSCREEN) / 2 - 640 / 2;
|
||||
top = GetSystemMetrics(SM_CYSCREEN) / 2 - 480 / 2;
|
||||
g_wnd = CreateWindow(wc.lpszClassName, _T("fontdump"),
|
||||
style, left, top, 640, 480,
|
||||
(HWND) NULL, (HMENU) NULL, g_instance,
|
||||
(LPVOID) NULL);
|
||||
style = WS_CHILD | WS_VISIBLE | WS_BORDER;
|
||||
g_lb = CreateWindow(_T("LISTBOX"), _T("LISTBOX1"), style,
|
||||
200, 10, 400, 400, g_wnd, 0, g_instance, 0);
|
||||
style = WS_CHILD | WS_VISIBLE;
|
||||
g_exit_button = CreateWindow(_T("BUTTON"), _T("Exit"), style,
|
||||
540, 410, 75, 25, g_wnd, 0, g_instance, 0);
|
||||
g_go_button = CreateWindow(_T("BUTTON"), _T("Go"), style,
|
||||
440, 410, 75, 25, g_wnd, 0, g_instance, 0);
|
||||
style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWN;
|
||||
g_font_list = CreateWindow(_T("COMBOBOX"), _T("COMBOBOX1"), style,
|
||||
50, 250, 125, 125, g_wnd, 0, g_instance, 0);
|
||||
ShowWindow(g_wnd, SW_SHOWNORMAL);
|
||||
PostMessage(g_wnd, WM_SETFONT, (WPARAM)g_font, 0);
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Tahoma");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"DejaVu Serif");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"DejaVu Sans");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Arial");
|
||||
SendMessageA(g_font_list, CB_ADDSTRING, 0, (LPARAM)"Comic Sans MS");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
main_loop(void)
|
||||
{
|
||||
MSG msg;
|
||||
MSG msg;
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
return (int)(msg.wParam);
|
||||
while (GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return (int)(msg.wParam);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -452,7 +528,7 @@ int WINAPI
|
||||
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
g_instance = hInstance;
|
||||
create_window();
|
||||
return main_loop();
|
||||
g_instance = hInstance;
|
||||
create_window();
|
||||
return main_loop();
|
||||
}
|
||||
|
||||
+287
-252
@@ -1,279 +1,314 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2010
|
||||
|
||||
freerdp wrapper
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* freerdp wrapper
|
||||
*/
|
||||
|
||||
#include "xrdp-freerdp.h"
|
||||
|
||||
char* APP_CC
|
||||
convert_bitmap(int in_bpp, int out_bpp, char* bmpdata,
|
||||
int width, int height, int* palette)
|
||||
char *APP_CC
|
||||
convert_bitmap(int in_bpp, int out_bpp, char *bmpdata,
|
||||
int width, int height, int *palette)
|
||||
{
|
||||
char* out;
|
||||
char* src;
|
||||
char* dst;
|
||||
int i;
|
||||
int j;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int pixel;
|
||||
char *out;
|
||||
char *src;
|
||||
char *dst;
|
||||
int i;
|
||||
int j;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int pixel;
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
out = (char*)g_malloc(width * height, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8*)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
*dst = pixel;
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
out = (char *)g_malloc(width * height, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8 *)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
*dst = pixel;
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8*)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16*)dst) = pixel;
|
||||
src++;
|
||||
dst += 2;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8 *)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16 *)dst) = pixel;
|
||||
src++;
|
||||
dst += 2;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8*)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
src++;
|
||||
dst += 4;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8 *)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
src++;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16*)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16*)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 2;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16 *)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16 *)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 2;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16*)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16 *)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16*)src);
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
return bmpdata;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
blue = *((tui8*)src);
|
||||
src++;
|
||||
green = *((tui8*)src);
|
||||
src++;
|
||||
red = *((tui8*)src);
|
||||
src++;
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
dst += 4;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16 *)src);
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
g_writeln("convert_bitmap: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
blue = *((tui8 *)src);
|
||||
src++;
|
||||
green = *((tui8 *)src);
|
||||
src++;
|
||||
red = *((tui8 *)src);
|
||||
src++;
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
|
||||
g_writeln("convert_bitmap: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns color or 0 */
|
||||
int APP_CC
|
||||
convert_color(int in_bpp, int out_bpp, int in_color, int* palette)
|
||||
convert_color(int in_bpp, int out_bpp, int in_color, int *palette)
|
||||
{
|
||||
int pixel;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int pixel;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
|
||||
if ((in_bpp == 1) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color == 0 ? 0 : 0xffffff;
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
g_writeln("convert_color: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
if ((in_bpp == 1) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color == 0 ? 0 : 0xffffff;
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
g_writeln("convert_color: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+17
-19
@@ -1,22 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2010
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef __XRDP_COLOR_H
|
||||
#define __XRDP_COLOR_H
|
||||
|
||||
+672
-643
File diff suppressed because it is too large
Load Diff
+19
-21
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2010
|
||||
|
||||
freerdp wrapper
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* freerdp wrapper
|
||||
*/
|
||||
|
||||
/* include other h files */
|
||||
#include "arch.h"
|
||||
|
||||
+268
-231
@@ -19,258 +19,295 @@
|
||||
|
||||
#include "xrdp-freerdp.h"
|
||||
|
||||
char* APP_CC
|
||||
convert_bitmap(int in_bpp, int out_bpp, char* bmpdata,
|
||||
int width, int height, int* palette)
|
||||
char *APP_CC
|
||||
convert_bitmap(int in_bpp, int out_bpp, char *bmpdata,
|
||||
int width, int height, int *palette)
|
||||
{
|
||||
char* out;
|
||||
char* src;
|
||||
char* dst;
|
||||
int i;
|
||||
int j;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int pixel;
|
||||
char *out;
|
||||
char *src;
|
||||
char *dst;
|
||||
int i;
|
||||
int j;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int pixel;
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
out = (char*)g_malloc(width * height, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8*)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
*dst = pixel;
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
out = (char *)g_malloc(width * height, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8 *)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
*dst = pixel;
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8*)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16*)dst) = pixel;
|
||||
src++;
|
||||
dst += 2;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8 *)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16 *)dst) = pixel;
|
||||
src++;
|
||||
dst += 2;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8*)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
src++;
|
||||
dst += 4;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui8 *)src);
|
||||
pixel = palette[pixel];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
src++;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16*)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16*)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 2;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 2, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16 *)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
*((tui16 *)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 2;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16*)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16 *)src);
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16*)src);
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
return bmpdata;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
out = (char*)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
for (i = 0; i < height; i++)
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
blue = *((tui8*)src);
|
||||
src++;
|
||||
green = *((tui8*)src);
|
||||
src++;
|
||||
red = *((tui8*)src);
|
||||
src++;
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32*)dst) = pixel;
|
||||
dst += 4;
|
||||
}
|
||||
return bmpdata;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
g_writeln("convert_bitmap: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
pixel = *((tui16 *)src);
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
out = (char *)g_malloc(width * height * 4, 0);
|
||||
src = bmpdata;
|
||||
dst = out;
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
blue = *((tui8 *)src);
|
||||
src++;
|
||||
green = *((tui8 *)src);
|
||||
src++;
|
||||
red = *((tui8 *)src);
|
||||
src++;
|
||||
pixel = COLOR24RGB(red, green, blue);
|
||||
*((tui32 *)dst) = pixel;
|
||||
dst += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return bmpdata;
|
||||
}
|
||||
|
||||
g_writeln("convert_bitmap: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns color or 0 */
|
||||
int APP_CC
|
||||
convert_color(int in_bpp, int out_bpp, int in_color, int* palette)
|
||||
convert_color(int in_bpp, int out_bpp, int in_color, int *palette)
|
||||
{
|
||||
int pixel;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
int pixel;
|
||||
int red;
|
||||
int green;
|
||||
int blue;
|
||||
|
||||
if ((in_bpp == 1) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color == 0 ? 0 : 0xffffff;
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
g_writeln("convert_color: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
if ((in_bpp == 1) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color == 0 ? 0 : 0xffffff;
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 8))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR8(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 16))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 8) && (out_bpp == 24))
|
||||
{
|
||||
pixel = palette[in_color];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 16))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR16(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR15(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 15) && (out_bpp == 15))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 16))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 16) && (out_bpp == 24))
|
||||
{
|
||||
pixel = in_color;
|
||||
SPLITCOLOR16(red, green, blue, pixel);
|
||||
pixel = COLOR24BGR(red, green, blue);
|
||||
return pixel;
|
||||
}
|
||||
|
||||
if ((in_bpp == 24) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 24))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
if ((in_bpp == 32) && (out_bpp == 32))
|
||||
{
|
||||
return in_color;
|
||||
}
|
||||
|
||||
g_writeln("convert_color: error unknown conversion from %d to %d",
|
||||
in_bpp, out_bpp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1528
-1452
File diff suppressed because it is too large
Load Diff
+81
-69
@@ -41,75 +41,87 @@
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char* programname;
|
||||
char text[256];
|
||||
char* displayname = NULL;
|
||||
char* outfname;
|
||||
char* sections[5] = {"noshift", "shift", "altgr", "capslock", "shiftcapslock"};
|
||||
int states[5] = {0, 1, 0x80, 2, 3};
|
||||
int i;
|
||||
int idx;
|
||||
int char_count;
|
||||
int nbytes = 0;
|
||||
int unicode;
|
||||
Display* dpy;
|
||||
KeySym ks;
|
||||
FILE* outf;
|
||||
XKeyPressedEvent e;
|
||||
wchar_t wtext[256];
|
||||
const char *programname;
|
||||
char text[256];
|
||||
char *displayname = NULL;
|
||||
char *outfname;
|
||||
char *sections[5] = {"noshift", "shift", "altgr", "capslock", "shiftcapslock"};
|
||||
int states[5] = {0, 1, 0x80, 2, 3};
|
||||
int i;
|
||||
int idx;
|
||||
int char_count;
|
||||
int nbytes = 0;
|
||||
int unicode;
|
||||
Display *dpy;
|
||||
KeySym ks;
|
||||
FILE *outf;
|
||||
XKeyPressedEvent e;
|
||||
wchar_t wtext[256];
|
||||
|
||||
setlocale(LC_CTYPE, "");
|
||||
programname = argv[0];
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s out_filename\n", programname);
|
||||
fprintf(stderr, "Example: %s /etc/xrdp/km-0409.ini\n", programname);
|
||||
return 1;
|
||||
}
|
||||
|
||||
outfname = argv[1];
|
||||
dpy = XOpenDisplay(displayname);
|
||||
|
||||
if (!dpy)
|
||||
{
|
||||
fprintf(stderr, "%s: unable to open display '%s'\n",
|
||||
programname, XDisplayName(displayname));
|
||||
return 1;
|
||||
}
|
||||
|
||||
outf = fopen(outfname, "w");
|
||||
|
||||
if (outf == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: unable to create file '%s'\n", programname, outfname);
|
||||
XCloseDisplay(dpy);
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.type = KeyPress;
|
||||
e.serial = 16;
|
||||
e.send_event = True;
|
||||
e.display = dpy;
|
||||
e.same_screen = True;
|
||||
|
||||
for (idx = 0; idx < 5; idx++) /* Sections and states */
|
||||
{
|
||||
fprintf(outf, "[%s]\n", sections[idx]);
|
||||
e.state = states[idx];
|
||||
|
||||
for (i = 8; i <= 137; i++) /* Keycodes */
|
||||
{
|
||||
e.keycode = i;
|
||||
nbytes = XLookupString(&e, text, 255, &ks, NULL);
|
||||
text[nbytes] = 0;
|
||||
char_count = mbstowcs(wtext, text, 255);
|
||||
unicode = 0;
|
||||
|
||||
if (char_count == 1)
|
||||
{
|
||||
unicode = wtext[0];
|
||||
}
|
||||
|
||||
fprintf(outf, "Key%d=%d:%d\n", i, (int) ks, unicode);
|
||||
}
|
||||
|
||||
if (idx != 4)
|
||||
{
|
||||
fprintf(outf, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
setlocale(LC_CTYPE, "");
|
||||
programname = argv[0];
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s out_filename\n", programname);
|
||||
fprintf(stderr, "Example: %s /etc/xrdp/km-0409.ini\n", programname);
|
||||
return 1;
|
||||
}
|
||||
outfname = argv[1];
|
||||
dpy = XOpenDisplay(displayname);
|
||||
if (!dpy)
|
||||
{
|
||||
fprintf(stderr, "%s: unable to open display '%s'\n",
|
||||
programname, XDisplayName(displayname));
|
||||
return 1;
|
||||
}
|
||||
outf = fopen(outfname, "w");
|
||||
if (outf == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: unable to create file '%s'\n", programname, outfname);
|
||||
XCloseDisplay(dpy);
|
||||
return 1;
|
||||
}
|
||||
memset(&e, 0, sizeof(e));
|
||||
e.type = KeyPress;
|
||||
e.serial = 16;
|
||||
e.send_event = True;
|
||||
e.display = dpy;
|
||||
e.same_screen = True;
|
||||
for (idx = 0; idx < 5; idx++) /* Sections and states */
|
||||
{
|
||||
fprintf(outf, "[%s]\n", sections[idx]);
|
||||
e.state = states[idx];
|
||||
for (i = 8; i <= 137; i++) /* Keycodes */
|
||||
{
|
||||
e.keycode = i;
|
||||
nbytes = XLookupString(&e, text, 255, &ks, NULL);
|
||||
text[nbytes] = 0;
|
||||
char_count = mbstowcs(wtext, text, 255);
|
||||
unicode = 0;
|
||||
if (char_count == 1)
|
||||
{
|
||||
unicode = wtext[0];
|
||||
}
|
||||
fprintf(outf, "Key%d=%d:%d\n", i, (int) ks, unicode);
|
||||
}
|
||||
if (idx != 4)
|
||||
{
|
||||
fprintf(outf, "\n");
|
||||
}
|
||||
}
|
||||
XCloseDisplay(dpy);
|
||||
fclose(outf);
|
||||
return 0;
|
||||
fclose(outf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+384
-358
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2007-2010
|
||||
|
||||
rsa key generator for xrdp
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* rsa key generator for xrdp
|
||||
*/
|
||||
|
||||
/*
|
||||
references:
|
||||
@@ -37,74 +35,74 @@
|
||||
|
||||
static tui8 g_exponent[4] =
|
||||
{
|
||||
0x01, 0x00, 0x01, 0x00
|
||||
0x01, 0x00, 0x01, 0x00
|
||||
};
|
||||
|
||||
static tui8 g_ppk_e[4] =
|
||||
{
|
||||
0x5B, 0x7B, 0x88, 0xC0
|
||||
0x5B, 0x7B, 0x88, 0xC0
|
||||
};
|
||||
|
||||
static tui8 g_ppk_n[72] =
|
||||
{
|
||||
0x3D, 0x3A, 0x5E, 0xBD, 0x72, 0x43, 0x3E, 0xC9,
|
||||
0x4D, 0xBB, 0xC1, 0x1E, 0x4A, 0xBA, 0x5F, 0xCB,
|
||||
0x3E, 0x88, 0x20, 0x87, 0xEF, 0xF5, 0xC1, 0xE2,
|
||||
0xD7, 0xB7, 0x6B, 0x9A, 0xF2, 0x52, 0x45, 0x95,
|
||||
0xCE, 0x63, 0x65, 0x6B, 0x58, 0x3A, 0xFE, 0xEF,
|
||||
0x7C, 0xE7, 0xBF, 0xFE, 0x3D, 0xF6, 0x5C, 0x7D,
|
||||
0x6C, 0x5E, 0x06, 0x09, 0x1A, 0xF5, 0x61, 0xBB,
|
||||
0x20, 0x93, 0x09, 0x5F, 0x05, 0x6D, 0xEA, 0x87,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
0x3D, 0x3A, 0x5E, 0xBD, 0x72, 0x43, 0x3E, 0xC9,
|
||||
0x4D, 0xBB, 0xC1, 0x1E, 0x4A, 0xBA, 0x5F, 0xCB,
|
||||
0x3E, 0x88, 0x20, 0x87, 0xEF, 0xF5, 0xC1, 0xE2,
|
||||
0xD7, 0xB7, 0x6B, 0x9A, 0xF2, 0x52, 0x45, 0x95,
|
||||
0xCE, 0x63, 0x65, 0x6B, 0x58, 0x3A, 0xFE, 0xEF,
|
||||
0x7C, 0xE7, 0xBF, 0xFE, 0x3D, 0xF6, 0x5C, 0x7D,
|
||||
0x6C, 0x5E, 0x06, 0x09, 0x1A, 0xF5, 0x61, 0xBB,
|
||||
0x20, 0x93, 0x09, 0x5F, 0x05, 0x6D, 0xEA, 0x87,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
static tui8 g_ppk_d[108] =
|
||||
{
|
||||
0x87, 0xA7, 0x19, 0x32, 0xDA, 0x11, 0x87, 0x55,
|
||||
0x58, 0x00, 0x16, 0x16, 0x25, 0x65, 0x68, 0xF8,
|
||||
0x24, 0x3E, 0xE6, 0xFA, 0xE9, 0x67, 0x49, 0x94,
|
||||
0xCF, 0x92, 0xCC, 0x33, 0x99, 0xE8, 0x08, 0x60,
|
||||
0x17, 0x9A, 0x12, 0x9F, 0x24, 0xDD, 0xB1, 0x24,
|
||||
0x99, 0xC7, 0x3A, 0xB8, 0x0A, 0x7B, 0x0D, 0xDD,
|
||||
0x35, 0x07, 0x79, 0x17, 0x0B, 0x51, 0x9B, 0xB3,
|
||||
0xC7, 0x10, 0x01, 0x13, 0xE7, 0x3F, 0xF3, 0x5F,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00
|
||||
0x87, 0xA7, 0x19, 0x32, 0xDA, 0x11, 0x87, 0x55,
|
||||
0x58, 0x00, 0x16, 0x16, 0x25, 0x65, 0x68, 0xF8,
|
||||
0x24, 0x3E, 0xE6, 0xFA, 0xE9, 0x67, 0x49, 0x94,
|
||||
0xCF, 0x92, 0xCC, 0x33, 0x99, 0xE8, 0x08, 0x60,
|
||||
0x17, 0x9A, 0x12, 0x9F, 0x24, 0xDD, 0xB1, 0x24,
|
||||
0x99, 0xC7, 0x3A, 0xB8, 0x0A, 0x7B, 0x0D, 0xDD,
|
||||
0x35, 0x07, 0x79, 0x17, 0x0B, 0x51, 0x9B, 0xB3,
|
||||
0xC7, 0x10, 0x01, 0x13, 0xE7, 0x3F, 0xF3, 0x5F,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
static tui8 g_testkey[176] =
|
||||
{
|
||||
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x5c, 0x00,
|
||||
0x52, 0x53, 0x41, 0x31, 0x48, 0x00, 0x00, 0x00,
|
||||
0x00, 0x02, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x01, 0x00, 0x79, 0x6f, 0xb4, 0xdf,
|
||||
0xa6, 0x95, 0xb9, 0xa9, 0x61, 0xe3, 0xc4, 0x5e,
|
||||
0xff, 0x6b, 0xd8, 0x81, 0x8a, 0x12, 0x4a, 0x93,
|
||||
0x42, 0x97, 0x18, 0x93, 0xac, 0xd1, 0x3a, 0x38,
|
||||
0x3c, 0x68, 0x50, 0x19, 0x31, 0xb6, 0x84, 0x51,
|
||||
0x79, 0xfb, 0x1c, 0xe7, 0xe3, 0x99, 0x20, 0xc7,
|
||||
0x84, 0xdf, 0xd1, 0xaa, 0xb5, 0x15, 0xef, 0x47,
|
||||
0x7e, 0xfc, 0x88, 0xeb, 0x29, 0xc3, 0x27, 0x5a,
|
||||
0x35, 0xf8, 0xfd, 0xaa, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x48, 0x00,
|
||||
0x32, 0x3b, 0xde, 0x6f, 0x18, 0x97, 0x1e, 0xc3,
|
||||
0x6b, 0x2b, 0x2d, 0xe4, 0xfc, 0x2d, 0xa2, 0x8e,
|
||||
0x32, 0x3c, 0xf3, 0x1b, 0x24, 0x90, 0x57, 0x4d,
|
||||
0x8e, 0xe4, 0x69, 0xfc, 0x16, 0x8d, 0x41, 0x92,
|
||||
0x78, 0xc7, 0x9c, 0xb4, 0x26, 0xff, 0xe8, 0x3e,
|
||||
0xa1, 0x8a, 0xf5, 0x57, 0xc0, 0x7f, 0x3e, 0x21,
|
||||
0x17, 0x32, 0x30, 0x6f, 0x79, 0xe1, 0x36, 0xcd,
|
||||
0xb6, 0x8e, 0xbe, 0x57, 0x57, 0xd2, 0xa9, 0x36
|
||||
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x5c, 0x00,
|
||||
0x52, 0x53, 0x41, 0x31, 0x48, 0x00, 0x00, 0x00,
|
||||
0x00, 0x02, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x01, 0x00, 0x79, 0x6f, 0xb4, 0xdf,
|
||||
0xa6, 0x95, 0xb9, 0xa9, 0x61, 0xe3, 0xc4, 0x5e,
|
||||
0xff, 0x6b, 0xd8, 0x81, 0x8a, 0x12, 0x4a, 0x93,
|
||||
0x42, 0x97, 0x18, 0x93, 0xac, 0xd1, 0x3a, 0x38,
|
||||
0x3c, 0x68, 0x50, 0x19, 0x31, 0xb6, 0x84, 0x51,
|
||||
0x79, 0xfb, 0x1c, 0xe7, 0xe3, 0x99, 0x20, 0xc7,
|
||||
0x84, 0xdf, 0xd1, 0xaa, 0xb5, 0x15, 0xef, 0x47,
|
||||
0x7e, 0xfc, 0x88, 0xeb, 0x29, 0xc3, 0x27, 0x5a,
|
||||
0x35, 0xf8, 0xfd, 0xaa, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x08, 0x00, 0x48, 0x00,
|
||||
0x32, 0x3b, 0xde, 0x6f, 0x18, 0x97, 0x1e, 0xc3,
|
||||
0x6b, 0x2b, 0x2d, 0xe4, 0xfc, 0x2d, 0xa2, 0x8e,
|
||||
0x32, 0x3c, 0xf3, 0x1b, 0x24, 0x90, 0x57, 0x4d,
|
||||
0x8e, 0xe4, 0x69, 0xfc, 0x16, 0x8d, 0x41, 0x92,
|
||||
0x78, 0xc7, 0x9c, 0xb4, 0x26, 0xff, 0xe8, 0x3e,
|
||||
0xa1, 0x8a, 0xf5, 0x57, 0xc0, 0x7f, 0x3e, 0x21,
|
||||
0x17, 0x32, 0x30, 0x6f, 0x79, 0xe1, 0x36, 0xcd,
|
||||
0xb6, 0x8e, 0xbe, 0x57, 0x57, 0xd2, 0xa9, 0x36
|
||||
};
|
||||
|
||||
/* this is the installed signature */
|
||||
char inst_pub_sig[]="0x6a,0x41,0xb1,0x43,0xcf,0x47,0x6f,0xf1,0xe6,0xcc,0xa1,\
|
||||
char inst_pub_sig[] = "0x6a,0x41,0xb1,0x43,0xcf,0x47,0x6f,0xf1,0xe6,0xcc,0xa1,\
|
||||
0x72,0x97,0xd9,0xe1,0x85,0x15,0xb3,0xc2,0x39,0xa0,0xa6,0x26,0x1a,0xb6,\
|
||||
0x49,0x01,0xfa,0xa6,0xda,0x60,0xd7,0x45,0xf7,0x2c,0xee,0xe4,0x8e,0x64,\
|
||||
0x2e,0x37,0x49,0xf0,0x4c,0x94,0x6f,0x08,0xf5,0x63,0x4c,0x56,0x29,0x55,\
|
||||
@@ -115,212 +113,230 @@ char inst_pub_sig[]="0x6a,0x41,0xb1,0x43,0xcf,0x47,0x6f,0xf1,0xe6,0xcc,0xa1,\
|
||||
static int APP_CC
|
||||
out_params(void)
|
||||
{
|
||||
g_writeln("");
|
||||
g_writeln("xrdp rsa key gen utility examples");
|
||||
g_writeln(" xrdp-keygen xrdp ['path and file name' | auto]");
|
||||
g_writeln(" xrdp-keygen test");
|
||||
g_writeln("");
|
||||
return 0;
|
||||
g_writeln("");
|
||||
g_writeln("xrdp rsa key gen utility examples");
|
||||
g_writeln(" xrdp-keygen xrdp ['path and file name' | auto]");
|
||||
g_writeln(" xrdp-keygen test");
|
||||
g_writeln("");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* this is the special key signing algorithm */
|
||||
static int APP_CC
|
||||
sign_key(char* e_data, int e_len, char* n_data, int n_len,
|
||||
char* sign_data, int sign_len)
|
||||
sign_key(char *e_data, int e_len, char *n_data, int n_len,
|
||||
char *sign_data, int sign_len)
|
||||
{
|
||||
char* key;
|
||||
char* md5_final;
|
||||
void* md5;
|
||||
char *key;
|
||||
char *md5_final;
|
||||
void *md5;
|
||||
|
||||
if ((e_len != 4) || (n_len != 64) || (sign_len != 64))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
key = (char*)g_malloc(176, 0);
|
||||
md5_final = (char*)g_malloc(64, 0);
|
||||
md5 = ssl_md5_info_create();
|
||||
/* copy the test key */
|
||||
g_memcpy(key, g_testkey, 176);
|
||||
/* replace e and n */
|
||||
g_memcpy(key + 32, e_data, 4);
|
||||
g_memcpy(key + 36, n_data, 64);
|
||||
ssl_md5_clear(md5);
|
||||
/* the first 108 bytes */
|
||||
ssl_md5_transform(md5, key, 108);
|
||||
/* set the whole thing with 0xff */
|
||||
g_memset(md5_final, 0xff, 64);
|
||||
/* digest 16 bytes */
|
||||
ssl_md5_complete(md5, md5_final);
|
||||
/* set non 0xff array items */
|
||||
md5_final[16] = 0;
|
||||
md5_final[62] = 1;
|
||||
md5_final[63] = 0;
|
||||
/* encrypt */
|
||||
ssl_mod_exp(sign_data, 64, md5_final, 64, (char*)g_ppk_n, 64,
|
||||
(char*)g_ppk_d, 64);
|
||||
/* cleanup */
|
||||
ssl_md5_info_delete(md5);
|
||||
g_free(key);
|
||||
g_free(md5_final);
|
||||
return 0;
|
||||
if ((e_len != 4) || (n_len != 64) || (sign_len != 64))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
key = (char *)g_malloc(176, 0);
|
||||
md5_final = (char *)g_malloc(64, 0);
|
||||
md5 = ssl_md5_info_create();
|
||||
/* copy the test key */
|
||||
g_memcpy(key, g_testkey, 176);
|
||||
/* replace e and n */
|
||||
g_memcpy(key + 32, e_data, 4);
|
||||
g_memcpy(key + 36, n_data, 64);
|
||||
ssl_md5_clear(md5);
|
||||
/* the first 108 bytes */
|
||||
ssl_md5_transform(md5, key, 108);
|
||||
/* set the whole thing with 0xff */
|
||||
g_memset(md5_final, 0xff, 64);
|
||||
/* digest 16 bytes */
|
||||
ssl_md5_complete(md5, md5_final);
|
||||
/* set non 0xff array items */
|
||||
md5_final[16] = 0;
|
||||
md5_final[62] = 1;
|
||||
md5_final[63] = 0;
|
||||
/* encrypt */
|
||||
ssl_mod_exp(sign_data, 64, md5_final, 64, (char *)g_ppk_n, 64,
|
||||
(char *)g_ppk_d, 64);
|
||||
/* cleanup */
|
||||
ssl_md5_info_delete(md5);
|
||||
g_free(key);
|
||||
g_free(md5_final);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
write_out_line(int fd, char* name, char* data, int len)
|
||||
write_out_line(int fd, char *name, char *data, int len)
|
||||
{
|
||||
int max;
|
||||
int error;
|
||||
int index;
|
||||
int data_item;
|
||||
int buf_pos;
|
||||
char* buf;
|
||||
char* text;
|
||||
int max;
|
||||
int error;
|
||||
int index;
|
||||
int data_item;
|
||||
int buf_pos;
|
||||
char *buf;
|
||||
char *text;
|
||||
|
||||
text = (char*)g_malloc(256, 0);
|
||||
max = len;
|
||||
max = max * 10;
|
||||
buf_pos = g_strlen(name);
|
||||
max = max + buf_pos + 16;
|
||||
buf = (char*)g_malloc(max, 0);
|
||||
g_strncpy(buf, name, max - 1);
|
||||
buf[buf_pos] = '=';
|
||||
buf_pos++;
|
||||
for (index = 0; index < len; index++)
|
||||
{
|
||||
data_item = (tui8)(data[index]);
|
||||
g_snprintf(text, 255, "0x%2.2x", data_item);
|
||||
if (index != 0)
|
||||
text = (char *)g_malloc(256, 0);
|
||||
max = len;
|
||||
max = max * 10;
|
||||
buf_pos = g_strlen(name);
|
||||
max = max + buf_pos + 16;
|
||||
buf = (char *)g_malloc(max, 0);
|
||||
g_strncpy(buf, name, max - 1);
|
||||
buf[buf_pos] = '=';
|
||||
buf_pos++;
|
||||
|
||||
for (index = 0; index < len; index++)
|
||||
{
|
||||
buf[buf_pos] = ',';
|
||||
buf_pos++;
|
||||
data_item = (tui8)(data[index]);
|
||||
g_snprintf(text, 255, "0x%2.2x", data_item);
|
||||
|
||||
if (index != 0)
|
||||
{
|
||||
buf[buf_pos] = ',';
|
||||
buf_pos++;
|
||||
}
|
||||
|
||||
buf[buf_pos] = text[0];
|
||||
buf_pos++;
|
||||
buf[buf_pos] = text[1];
|
||||
buf_pos++;
|
||||
buf[buf_pos] = text[2];
|
||||
buf_pos++;
|
||||
buf[buf_pos] = text[3];
|
||||
buf_pos++;
|
||||
}
|
||||
buf[buf_pos] = text[0];
|
||||
|
||||
buf[buf_pos] = '\n';
|
||||
buf_pos++;
|
||||
buf[buf_pos] = text[1];
|
||||
buf_pos++;
|
||||
buf[buf_pos] = text[2];
|
||||
buf_pos++;
|
||||
buf[buf_pos] = text[3];
|
||||
buf_pos++;
|
||||
}
|
||||
buf[buf_pos] = '\n';
|
||||
buf_pos++;
|
||||
buf[buf_pos] = 0;
|
||||
error = g_file_write(fd, buf, buf_pos) == -1;
|
||||
g_free(buf);
|
||||
g_free(text);
|
||||
return error;
|
||||
buf[buf_pos] = 0;
|
||||
error = g_file_write(fd, buf, buf_pos) == -1;
|
||||
g_free(buf);
|
||||
g_free(text);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
save_all(char* e_data, int e_len, char* n_data, int n_len,
|
||||
char* d_data, int d_len, char* sign_data, int sign_len,
|
||||
const char* path_and_file_name)
|
||||
save_all(char *e_data, int e_len, char *n_data, int n_len,
|
||||
char *d_data, int d_len, char *sign_data, int sign_len,
|
||||
const char *path_and_file_name)
|
||||
{
|
||||
int fd;
|
||||
char filename[256];
|
||||
int fd;
|
||||
char filename[256];
|
||||
|
||||
if (path_and_file_name == 0)
|
||||
{
|
||||
g_strncpy(filename, "rsakeys.ini", 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_strncpy(filename, path_and_file_name, 255);
|
||||
}
|
||||
g_writeln("saving to %s", filename);
|
||||
g_writeln("");
|
||||
if (g_file_exist(filename))
|
||||
{
|
||||
if (g_file_delete(filename) == 0)
|
||||
if (path_and_file_name == 0)
|
||||
{
|
||||
g_writeln("problem deleting %s, maybe no rights", filename);
|
||||
return 1;
|
||||
g_strncpy(filename, "rsakeys.ini", 255);
|
||||
}
|
||||
}
|
||||
fd = g_file_open(filename);
|
||||
if (fd > 0)
|
||||
{
|
||||
if (g_file_write(fd, "[keys]\n", 7) == -1)
|
||||
else
|
||||
{
|
||||
g_writeln("problem writing to %s, maybe no rights", filename);
|
||||
return 1;
|
||||
g_strncpy(filename, path_and_file_name, 255);
|
||||
}
|
||||
write_out_line(fd, "pub_exp", e_data, e_len);
|
||||
write_out_line(fd, "pub_mod", n_data, n_len);
|
||||
write_out_line(fd, "pub_sig", sign_data, sign_len);
|
||||
write_out_line(fd, "pri_exp", d_data, d_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("problem opening %s, maybe no rights", filename);
|
||||
return 1;
|
||||
}
|
||||
g_file_close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
key_gen(const char* path_and_file_name)
|
||||
{
|
||||
char* e_data;
|
||||
char* n_data;
|
||||
char* d_data;
|
||||
char* sign_data;
|
||||
int e_len;
|
||||
int n_len;
|
||||
int d_len;
|
||||
int sign_len;
|
||||
int error;
|
||||
|
||||
e_data = (char*)g_exponent;
|
||||
n_data = (char*)g_malloc(64, 0);
|
||||
d_data = (char*)g_malloc(64, 0);
|
||||
sign_data = (char*)g_malloc(64, 0);
|
||||
e_len = 4;
|
||||
n_len = 64;
|
||||
d_len = 64;
|
||||
sign_len = 64;
|
||||
error = 0;
|
||||
g_writeln("");
|
||||
g_writeln("Generating %d bit rsa key...", MY_KEY_SIZE);
|
||||
g_writeln("");
|
||||
if (error == 0)
|
||||
{
|
||||
error = ssl_gen_key_xrdp1(MY_KEY_SIZE, e_data, e_len, n_data, n_len,
|
||||
d_data, d_len);
|
||||
if (error != 0)
|
||||
{
|
||||
g_writeln("error %d in key_gen, ssl_gen_key_xrdp1", error);
|
||||
}
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
g_writeln("ssl_gen_key_xrdp1 ok");
|
||||
g_writeln("saving to %s", filename);
|
||||
g_writeln("");
|
||||
error = sign_key(e_data, e_len, n_data, n_len, sign_data, sign_len);
|
||||
if (error != 0)
|
||||
|
||||
if (g_file_exist(filename))
|
||||
{
|
||||
g_writeln("error %d in key_gen, sign_key", error);
|
||||
if (g_file_delete(filename) == 0)
|
||||
{
|
||||
g_writeln("problem deleting %s, maybe no rights", filename);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
error = save_all(e_data, e_len, n_data, n_len, d_data, d_len,
|
||||
sign_data, sign_len, path_and_file_name);
|
||||
if (error != 0)
|
||||
|
||||
fd = g_file_open(filename);
|
||||
|
||||
if (fd > 0)
|
||||
{
|
||||
g_writeln("error %d in key_gen, save_all", error);
|
||||
if (g_file_write(fd, "[keys]\n", 7) == -1)
|
||||
{
|
||||
g_writeln("problem writing to %s, maybe no rights", filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
write_out_line(fd, "pub_exp", e_data, e_len);
|
||||
write_out_line(fd, "pub_mod", n_data, n_len);
|
||||
write_out_line(fd, "pub_sig", sign_data, sign_len);
|
||||
write_out_line(fd, "pri_exp", d_data, d_len);
|
||||
}
|
||||
}
|
||||
g_free(n_data);
|
||||
g_free(d_data);
|
||||
g_free(sign_data);
|
||||
return error;
|
||||
else
|
||||
{
|
||||
g_writeln("problem opening %s, maybe no rights", filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_file_close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
key_gen(const char *path_and_file_name)
|
||||
{
|
||||
char *e_data;
|
||||
char *n_data;
|
||||
char *d_data;
|
||||
char *sign_data;
|
||||
int e_len;
|
||||
int n_len;
|
||||
int d_len;
|
||||
int sign_len;
|
||||
int error;
|
||||
|
||||
e_data = (char *)g_exponent;
|
||||
n_data = (char *)g_malloc(64, 0);
|
||||
d_data = (char *)g_malloc(64, 0);
|
||||
sign_data = (char *)g_malloc(64, 0);
|
||||
e_len = 4;
|
||||
n_len = 64;
|
||||
d_len = 64;
|
||||
sign_len = 64;
|
||||
error = 0;
|
||||
g_writeln("");
|
||||
g_writeln("Generating %d bit rsa key...", MY_KEY_SIZE);
|
||||
g_writeln("");
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
error = ssl_gen_key_xrdp1(MY_KEY_SIZE, e_data, e_len, n_data, n_len,
|
||||
d_data, d_len);
|
||||
|
||||
if (error != 0)
|
||||
{
|
||||
g_writeln("error %d in key_gen, ssl_gen_key_xrdp1", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
g_writeln("ssl_gen_key_xrdp1 ok");
|
||||
g_writeln("");
|
||||
error = sign_key(e_data, e_len, n_data, n_len, sign_data, sign_len);
|
||||
|
||||
if (error != 0)
|
||||
{
|
||||
g_writeln("error %d in key_gen, sign_key", error);
|
||||
}
|
||||
}
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
error = save_all(e_data, e_len, n_data, n_len, d_data, d_len,
|
||||
sign_data, sign_len, path_and_file_name);
|
||||
|
||||
if (error != 0)
|
||||
{
|
||||
g_writeln("error %d in key_gen, save_all", error);
|
||||
}
|
||||
}
|
||||
|
||||
g_free(n_data);
|
||||
g_free(d_data);
|
||||
g_free(sign_data);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -328,146 +344,156 @@ key_gen(const char* path_and_file_name)
|
||||
static int APP_CC
|
||||
key_gen_run_it(void)
|
||||
{
|
||||
int fd;
|
||||
int index;
|
||||
int rv;
|
||||
struct list* names;
|
||||
struct list* values;
|
||||
char* name;
|
||||
char* value;
|
||||
int fd;
|
||||
int index;
|
||||
int rv;
|
||||
struct list *names;
|
||||
struct list *values;
|
||||
char *name;
|
||||
char *value;
|
||||
|
||||
if (!g_file_exist("/etc/xrdp/rsakeys.ini"))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (g_file_get_size("/etc/xrdp/rsakeys.ini") < 10)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
fd = g_file_open("/etc/xrdp/rsakeys.ini");
|
||||
if (fd < 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
rv = 0;
|
||||
names = list_create();
|
||||
names->auto_free = 1;
|
||||
values = list_create();
|
||||
values->auto_free = 1;
|
||||
if (file_read_section(fd, "keys", names, values) == 0)
|
||||
{
|
||||
for (index = 0; index < names->count; index++)
|
||||
if (!g_file_exist("/etc/xrdp/rsakeys.ini"))
|
||||
{
|
||||
name = (char*)list_get_item(names, index);
|
||||
value = (char*)list_get_item(values, index);
|
||||
if (g_strcasecmp(name, "pub_sig") == 0)
|
||||
{
|
||||
if (g_strcasecmp(value, inst_pub_sig) == 0)
|
||||
{
|
||||
rv = 1;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("error reading keys section of rsakeys.ini");
|
||||
}
|
||||
list_delete(names);
|
||||
list_delete(values);
|
||||
g_file_close(fd);
|
||||
return rv;
|
||||
|
||||
if (g_file_get_size("/etc/xrdp/rsakeys.ini") < 10)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
fd = g_file_open("/etc/xrdp/rsakeys.ini");
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
names = list_create();
|
||||
names->auto_free = 1;
|
||||
values = list_create();
|
||||
values->auto_free = 1;
|
||||
|
||||
if (file_read_section(fd, "keys", names, values) == 0)
|
||||
{
|
||||
for (index = 0; index < names->count; index++)
|
||||
{
|
||||
name = (char *)list_get_item(names, index);
|
||||
value = (char *)list_get_item(values, index);
|
||||
|
||||
if (g_strcasecmp(name, "pub_sig") == 0)
|
||||
{
|
||||
if (g_strcasecmp(value, inst_pub_sig) == 0)
|
||||
{
|
||||
rv = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("error reading keys section of rsakeys.ini");
|
||||
}
|
||||
|
||||
list_delete(names);
|
||||
list_delete(values);
|
||||
g_file_close(fd);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
key_gen_auto(void)
|
||||
{
|
||||
if (key_gen_run_it())
|
||||
{
|
||||
return key_gen("/etc/xrdp/rsakeys.ini");
|
||||
}
|
||||
g_writeln("xrdp-keygen does not need to run");
|
||||
return 0;
|
||||
if (key_gen_run_it())
|
||||
{
|
||||
return key_gen("/etc/xrdp/rsakeys.ini");
|
||||
}
|
||||
|
||||
g_writeln("xrdp-keygen does not need to run");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
key_test(void)
|
||||
{
|
||||
char* md5_final;
|
||||
char* sig;
|
||||
void* md5;
|
||||
char *md5_final;
|
||||
char *sig;
|
||||
void *md5;
|
||||
|
||||
md5_final = (char*)g_malloc(64, 0);
|
||||
sig = (char*)g_malloc(64, 0);
|
||||
md5 = ssl_md5_info_create();
|
||||
g_writeln("original key is:");
|
||||
g_hexdump((char*)g_testkey, 176);
|
||||
g_writeln("original exponent is:");
|
||||
g_hexdump((char*)g_testkey + 32, 4);
|
||||
g_writeln("original modulus is:");
|
||||
g_hexdump((char*)g_testkey + 36, 64);
|
||||
g_writeln("original signature is:");
|
||||
g_hexdump((char*)g_testkey + 112, 64);
|
||||
ssl_md5_clear(md5);
|
||||
ssl_md5_transform(md5, (char*)g_testkey, 108);
|
||||
g_memset(md5_final, 0xff, 64);
|
||||
ssl_md5_complete(md5, md5_final);
|
||||
g_writeln("md5 hash of first 108 bytes of this key is:");
|
||||
g_hexdump(md5_final, 16);
|
||||
md5_final[16] = 0;
|
||||
md5_final[62] = 1;
|
||||
md5_final[63] = 0;
|
||||
ssl_mod_exp(sig, 64, md5_final, 64, (char*)g_ppk_n, 64, (char*)g_ppk_d, 64);
|
||||
g_writeln("produced signature(this should match original \
|
||||
md5_final = (char *)g_malloc(64, 0);
|
||||
sig = (char *)g_malloc(64, 0);
|
||||
md5 = ssl_md5_info_create();
|
||||
g_writeln("original key is:");
|
||||
g_hexdump((char *)g_testkey, 176);
|
||||
g_writeln("original exponent is:");
|
||||
g_hexdump((char *)g_testkey + 32, 4);
|
||||
g_writeln("original modulus is:");
|
||||
g_hexdump((char *)g_testkey + 36, 64);
|
||||
g_writeln("original signature is:");
|
||||
g_hexdump((char *)g_testkey + 112, 64);
|
||||
ssl_md5_clear(md5);
|
||||
ssl_md5_transform(md5, (char *)g_testkey, 108);
|
||||
g_memset(md5_final, 0xff, 64);
|
||||
ssl_md5_complete(md5, md5_final);
|
||||
g_writeln("md5 hash of first 108 bytes of this key is:");
|
||||
g_hexdump(md5_final, 16);
|
||||
md5_final[16] = 0;
|
||||
md5_final[62] = 1;
|
||||
md5_final[63] = 0;
|
||||
ssl_mod_exp(sig, 64, md5_final, 64, (char *)g_ppk_n, 64, (char *)g_ppk_d, 64);
|
||||
g_writeln("produced signature(this should match original \
|
||||
signature above) is:");
|
||||
g_hexdump(sig, 64);
|
||||
g_memset(md5_final, 0, 64);
|
||||
ssl_mod_exp(md5_final, 64, (char*)g_testkey + 112, 64, (char*)g_ppk_n, 64,
|
||||
(char*)g_ppk_e, 4);
|
||||
g_writeln("decrypted hash of first 108 bytes of this key is:");
|
||||
g_hexdump(md5_final, 64);
|
||||
ssl_md5_info_delete(md5);
|
||||
g_free(md5_final);
|
||||
g_free(sig);
|
||||
return 0;
|
||||
g_hexdump(sig, 64);
|
||||
g_memset(md5_final, 0, 64);
|
||||
ssl_mod_exp(md5_final, 64, (char *)g_testkey + 112, 64, (char *)g_ppk_n, 64,
|
||||
(char *)g_ppk_e, 4);
|
||||
g_writeln("decrypted hash of first 108 bytes of this key is:");
|
||||
g_hexdump(md5_final, 64);
|
||||
ssl_md5_info_delete(md5);
|
||||
g_free(md5_final);
|
||||
g_free(sig);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int DEFAULT_CC
|
||||
main(int argc, char** argv)
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
if (argc > 1)
|
||||
{
|
||||
if (g_strcasecmp(argv[1], "xrdp") == 0)
|
||||
if (argc > 1)
|
||||
{
|
||||
if (argc > 2)
|
||||
{
|
||||
if (g_strcasecmp(argv[2], "auto") == 0)
|
||||
if (g_strcasecmp(argv[1], "xrdp") == 0)
|
||||
{
|
||||
if (g_getuid() != 0)
|
||||
{
|
||||
g_writeln("must run as root");
|
||||
return 0;
|
||||
}
|
||||
return key_gen_auto();
|
||||
if (argc > 2)
|
||||
{
|
||||
if (g_strcasecmp(argv[2], "auto") == 0)
|
||||
{
|
||||
if (g_getuid() != 0)
|
||||
{
|
||||
g_writeln("must run as root");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return key_gen_auto();
|
||||
}
|
||||
else
|
||||
{
|
||||
return key_gen(argv[2]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return key_gen(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (g_strcasecmp(argv[1], "test") == 0)
|
||||
{
|
||||
return key_gen(argv[2]);
|
||||
return key_test();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return key_gen(0);
|
||||
}
|
||||
}
|
||||
else if (g_strcasecmp(argv[1], "test") == 0)
|
||||
{
|
||||
return key_test();
|
||||
}
|
||||
}
|
||||
out_params();
|
||||
return 0;
|
||||
|
||||
out_params();
|
||||
return 0;
|
||||
}
|
||||
|
||||
+680
-615
File diff suppressed because it is too large
Load Diff
+19
-21
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
libxrdp header
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2010
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* libxrdp header
|
||||
*/
|
||||
|
||||
#if !defined(LIBXRDP_H)
|
||||
#define LIBXRDP_H
|
||||
|
||||
+19
-21
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
header file for use with libxrdp.so / xrdp.dll
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2010
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* header file for use with libxrdp.so / xrdp.dll
|
||||
*/
|
||||
|
||||
#ifndef LIBXRDPINC_H
|
||||
#define LIBXRDPINC_H
|
||||
|
||||
+1356
-1260
File diff suppressed because it is too large
Load Diff
+129
-117
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2006-2010
|
||||
|
||||
channel layer
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2006-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* channel layer
|
||||
*/
|
||||
|
||||
#include "libxrdp.h"
|
||||
|
||||
@@ -31,86 +29,96 @@
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns pointer or nil on error */
|
||||
static struct mcs_channel_item* APP_CC
|
||||
xrdp_channel_get_item(struct xrdp_channel* self, int channel_id)
|
||||
static struct mcs_channel_item *APP_CC
|
||||
xrdp_channel_get_item(struct xrdp_channel *self, int channel_id)
|
||||
{
|
||||
struct mcs_channel_item* channel;
|
||||
if(self->mcs_layer->channel_list==NULL)
|
||||
{
|
||||
g_writeln("xrdp_channel_get_item - No channel initialized");
|
||||
return NULL ;
|
||||
}
|
||||
channel = (struct mcs_channel_item*)
|
||||
list_get_item(self->mcs_layer->channel_list, channel_id);
|
||||
return channel;
|
||||
struct mcs_channel_item *channel;
|
||||
|
||||
if (self->mcs_layer->channel_list == NULL)
|
||||
{
|
||||
g_writeln("xrdp_channel_get_item - No channel initialized");
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
channel = (struct mcs_channel_item *)
|
||||
list_get_item(self->mcs_layer->channel_list, channel_id);
|
||||
return channel;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
struct xrdp_channel* APP_CC
|
||||
xrdp_channel_create(struct xrdp_sec* owner, struct xrdp_mcs* mcs_layer)
|
||||
struct xrdp_channel *APP_CC
|
||||
xrdp_channel_create(struct xrdp_sec *owner, struct xrdp_mcs *mcs_layer)
|
||||
{
|
||||
struct xrdp_channel* self;
|
||||
struct xrdp_channel *self;
|
||||
|
||||
self = (struct xrdp_channel*)g_malloc(sizeof(struct xrdp_channel), 1);
|
||||
self->sec_layer = owner;
|
||||
self->mcs_layer = mcs_layer;
|
||||
return self;
|
||||
self = (struct xrdp_channel *)g_malloc(sizeof(struct xrdp_channel), 1);
|
||||
self->sec_layer = owner;
|
||||
self->mcs_layer = mcs_layer;
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
void APP_CC
|
||||
xrdp_channel_delete(struct xrdp_channel* self)
|
||||
xrdp_channel_delete(struct xrdp_channel *self)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_memset(self,0,sizeof(struct xrdp_channel));
|
||||
g_free(self);
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
g_memset(self, 0, sizeof(struct xrdp_channel));
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_channel_init(struct xrdp_channel* self, struct stream* s)
|
||||
xrdp_channel_init(struct xrdp_channel *self, struct stream *s)
|
||||
{
|
||||
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
s_push_layer(s, channel_hdr, 8);
|
||||
return 0;
|
||||
if (xrdp_sec_init(self->sec_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
s_push_layer(s, channel_hdr, 8);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
/* This sends data out to the secure layer. */
|
||||
int APP_CC
|
||||
xrdp_channel_send(struct xrdp_channel* self, struct stream* s, int channel_id,
|
||||
xrdp_channel_send(struct xrdp_channel *self, struct stream *s, int channel_id,
|
||||
int total_data_len, int flags)
|
||||
{
|
||||
struct mcs_channel_item* channel;
|
||||
struct mcs_channel_item *channel;
|
||||
|
||||
channel = xrdp_channel_get_item(self, channel_id);
|
||||
if (channel == NULL)
|
||||
{
|
||||
g_writeln("xrdp_channel_send - no such channel");
|
||||
return 1;
|
||||
}
|
||||
s_pop_layer(s, channel_hdr);
|
||||
out_uint32_le(s, total_data_len);
|
||||
if (channel->flags & XR_CHANNEL_OPTION_SHOW_PROTOCOL)
|
||||
{
|
||||
flags |= CHANNEL_FLAG_SHOW_PROTOCOL;
|
||||
}
|
||||
out_uint32_le(s, flags);
|
||||
if (xrdp_sec_send(self->sec_layer, s, channel->chanid) != 0)
|
||||
{
|
||||
g_writeln("xrdp_channel_send - failure sending data");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
channel = xrdp_channel_get_item(self, channel_id);
|
||||
|
||||
if (channel == NULL)
|
||||
{
|
||||
g_writeln("xrdp_channel_send - no such channel");
|
||||
return 1;
|
||||
}
|
||||
|
||||
s_pop_layer(s, channel_hdr);
|
||||
out_uint32_le(s, total_data_len);
|
||||
|
||||
if (channel->flags & XR_CHANNEL_OPTION_SHOW_PROTOCOL)
|
||||
{
|
||||
flags |= CHANNEL_FLAG_SHOW_PROTOCOL;
|
||||
}
|
||||
|
||||
out_uint32_le(s, flags);
|
||||
|
||||
if (xrdp_sec_send(self->sec_layer, s, channel->chanid) != 0)
|
||||
{
|
||||
g_writeln("xrdp_channel_send - failure sending data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -118,36 +126,38 @@ xrdp_channel_send(struct xrdp_channel* self, struct stream* s, int channel_id,
|
||||
/* this will inform the callback, whatever it is that some channel data is
|
||||
ready. the default for this is a call to xrdp_wm.c. */
|
||||
static int APP_CC
|
||||
xrdp_channel_call_callback(struct xrdp_channel* self, struct stream* s,
|
||||
xrdp_channel_call_callback(struct xrdp_channel *self, struct stream *s,
|
||||
int channel_id,
|
||||
int total_data_len, int flags)
|
||||
{
|
||||
struct xrdp_session* session;
|
||||
int rv;
|
||||
int size;
|
||||
struct xrdp_session *session;
|
||||
int rv;
|
||||
int size;
|
||||
|
||||
rv = 0;
|
||||
session = self->sec_layer->rdp_layer->session;
|
||||
if (session != 0)
|
||||
{
|
||||
if (session->callback != 0)
|
||||
rv = 0;
|
||||
session = self->sec_layer->rdp_layer->session;
|
||||
|
||||
if (session != 0)
|
||||
{
|
||||
size = (int)(s->end - s->p);
|
||||
/* in xrdp_wm.c */
|
||||
rv = session->callback(session->id, 0x5555,
|
||||
MAKELONG(channel_id, flags),
|
||||
size, (tbus)(s->p), total_data_len);
|
||||
if (session->callback != 0)
|
||||
{
|
||||
size = (int)(s->end - s->p);
|
||||
/* in xrdp_wm.c */
|
||||
rv = session->callback(session->id, 0x5555,
|
||||
MAKELONG(channel_id, flags),
|
||||
size, (tbus)(s->p), total_data_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("in xrdp_channel_call_callback, session->callback is nil");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("in xrdp_channel_call_callback, session->callback is nil");
|
||||
g_writeln("in xrdp_channel_call_callback, session is nil");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("in xrdp_channel_call_callback, session is nil");
|
||||
}
|
||||
return rv;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -157,30 +167,32 @@ xrdp_channel_call_callback(struct xrdp_channel* self, struct stream* s,
|
||||
'chanid' passed in here is the mcs channel id so it MCS_GLOBAL_CHANNEL
|
||||
plus something. */
|
||||
int APP_CC
|
||||
xrdp_channel_process(struct xrdp_channel* self, struct stream* s,
|
||||
xrdp_channel_process(struct xrdp_channel *self, struct stream *s,
|
||||
int chanid)
|
||||
{
|
||||
int length;
|
||||
int flags;
|
||||
int rv;
|
||||
int channel_id;
|
||||
struct mcs_channel_item* channel;
|
||||
int length;
|
||||
int flags;
|
||||
int rv;
|
||||
int channel_id;
|
||||
struct mcs_channel_item *channel;
|
||||
|
||||
|
||||
/* this assumes that the channels are in order of chanid(mcs channel id)
|
||||
but they should be, see xrdp_sec_process_mcs_data_channels
|
||||
the first channel should be MCS_GLOBAL_CHANNEL + 1, second
|
||||
one should be MCS_GLOBAL_CHANNEL + 2, and so on */
|
||||
channel_id = (chanid - MCS_GLOBAL_CHANNEL) - 1;
|
||||
channel = xrdp_channel_get_item(self, channel_id);
|
||||
if (channel == NULL)
|
||||
{
|
||||
g_writeln("xrdp_channel_process, channel not found");
|
||||
return 1;
|
||||
}
|
||||
rv = 0;
|
||||
in_uint32_le(s, length);
|
||||
in_uint32_le(s, flags);
|
||||
rv = xrdp_channel_call_callback(self, s, channel_id, length, flags);
|
||||
return rv;
|
||||
/* this assumes that the channels are in order of chanid(mcs channel id)
|
||||
but they should be, see xrdp_sec_process_mcs_data_channels
|
||||
the first channel should be MCS_GLOBAL_CHANNEL + 1, second
|
||||
one should be MCS_GLOBAL_CHANNEL + 2, and so on */
|
||||
channel_id = (chanid - MCS_GLOBAL_CHANNEL) - 1;
|
||||
channel = xrdp_channel_get_item(self, channel_id);
|
||||
|
||||
if (channel == NULL)
|
||||
{
|
||||
g_writeln("xrdp_channel_process, channel not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
in_uint32_le(s, length);
|
||||
in_uint32_le(s, flags);
|
||||
rv = xrdp_channel_call_callback(self, s, channel_id, length, flags);
|
||||
return rv;
|
||||
}
|
||||
|
||||
+147
-134
@@ -20,177 +20,190 @@
|
||||
#include "libxrdp.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct xrdp_fastpath* APP_CC
|
||||
xrdp_fastpath_create(struct xrdp_session* session)
|
||||
struct xrdp_fastpath *APP_CC
|
||||
xrdp_fastpath_create(struct xrdp_session *session)
|
||||
{
|
||||
struct xrdp_fastpath* self;
|
||||
struct xrdp_fastpath *self;
|
||||
|
||||
self = (struct xrdp_fastpath*)g_malloc(sizeof(struct xrdp_fastpath), 1);
|
||||
self->tcp_layer =
|
||||
((struct xrdp_rdp*)session->rdp)->sec_layer->
|
||||
mcs_layer->iso_layer->tcp_layer;
|
||||
make_stream(self->out_s);
|
||||
init_stream(self->out_s, FASTPATH_MAX_PACKET_SIZE);
|
||||
return self;
|
||||
self = (struct xrdp_fastpath *)g_malloc(sizeof(struct xrdp_fastpath), 1);
|
||||
self->tcp_layer =
|
||||
((struct xrdp_rdp *)session->rdp)->sec_layer->
|
||||
mcs_layer->iso_layer->tcp_layer;
|
||||
make_stream(self->out_s);
|
||||
init_stream(self->out_s, FASTPATH_MAX_PACKET_SIZE);
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
xrdp_fastpath_delete(struct xrdp_fastpath* self)
|
||||
xrdp_fastpath_delete(struct xrdp_fastpath *self)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
free_stream(self->out_s);
|
||||
g_free(self);
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
free_stream(self->out_s);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_fastpath_reset(struct xrdp_fastpath* self)
|
||||
xrdp_fastpath_reset(struct xrdp_fastpath *self)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int APP_CC
|
||||
xrdp_fastpath_init(struct xrdp_fastpath* self)
|
||||
xrdp_fastpath_init(struct xrdp_fastpath *self)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_fastpath_send_update_pdu(struct xrdp_fastpath* self, tui8 updateCode,
|
||||
struct stream* s)
|
||||
xrdp_fastpath_send_update_pdu(struct xrdp_fastpath *self, tui8 updateCode,
|
||||
struct stream *s)
|
||||
{
|
||||
tui16 len;
|
||||
tui16 maxLen;
|
||||
tui32 payloadLeft;
|
||||
tui8 fragment;
|
||||
struct stream* s_send;
|
||||
int compression;
|
||||
int i;
|
||||
int i32;
|
||||
tui16 len;
|
||||
tui16 maxLen;
|
||||
tui32 payloadLeft;
|
||||
tui8 fragment;
|
||||
struct stream *s_send;
|
||||
int compression;
|
||||
int i;
|
||||
int i32;
|
||||
|
||||
compression = 0;
|
||||
s_send = self->out_s;
|
||||
maxLen = FASTPATH_MAX_PACKET_SIZE - 6; /* 6 bytes for header */
|
||||
payloadLeft = (s->end - s->data);
|
||||
for (i = 0; payloadLeft > 0; i++)
|
||||
{
|
||||
if (payloadLeft > maxLen)
|
||||
compression = 0;
|
||||
s_send = self->out_s;
|
||||
maxLen = FASTPATH_MAX_PACKET_SIZE - 6; /* 6 bytes for header */
|
||||
payloadLeft = (s->end - s->data);
|
||||
|
||||
for (i = 0; payloadLeft > 0; i++)
|
||||
{
|
||||
len = maxLen;
|
||||
if (payloadLeft > maxLen)
|
||||
{
|
||||
len = maxLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
len = payloadLeft;
|
||||
}
|
||||
|
||||
payloadLeft -= len;
|
||||
|
||||
if (payloadLeft == 0)
|
||||
{
|
||||
fragment = i ? FASTPATH_FRAGMENT_LAST : FASTPATH_FRAGMENT_SINGLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
fragment = i ? FASTPATH_FRAGMENT_NEXT : FASTPATH_FRAGMENT_FIRST;
|
||||
}
|
||||
|
||||
init_stream(s_send, 0);
|
||||
out_uint8(s_send, 0); /* fOutputHeader */
|
||||
i32 = ((len + 6) >> 8) | 0x80;
|
||||
out_uint8(s_send, i32); /* use 2 bytes for length even length < 128 ??? */
|
||||
i32 = (len + 6) & 0xff;
|
||||
out_uint8(s_send, i32);
|
||||
i32 = (updateCode & 0x0f) | ((fragment & 0x03) << 4) |
|
||||
((compression & 0x03) << 6);
|
||||
out_uint8(s_send, i32);
|
||||
out_uint16_le(s_send, len);
|
||||
s_copy(s_send, s, len);
|
||||
s_mark_end(s_send);
|
||||
|
||||
if (xrdp_tcp_send(self->tcp_layer, s_send) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
len = payloadLeft;
|
||||
}
|
||||
payloadLeft -= len;
|
||||
if (payloadLeft == 0)
|
||||
{
|
||||
fragment = i ? FASTPATH_FRAGMENT_LAST : FASTPATH_FRAGMENT_SINGLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
fragment = i ? FASTPATH_FRAGMENT_NEXT : FASTPATH_FRAGMENT_FIRST;
|
||||
}
|
||||
init_stream(s_send, 0);
|
||||
out_uint8(s_send, 0); /* fOutputHeader */
|
||||
i32 = ((len + 6) >> 8) | 0x80;
|
||||
out_uint8(s_send, i32); /* use 2 bytes for length even length < 128 ??? */
|
||||
i32 = (len + 6) & 0xff;
|
||||
out_uint8(s_send, i32);
|
||||
i32 = (updateCode & 0x0f) | ((fragment & 0x03) << 4) |
|
||||
((compression & 0x03) << 6);
|
||||
out_uint8(s_send, i32);
|
||||
out_uint16_le(s_send, len);
|
||||
s_copy(s_send, s, len);
|
||||
s_mark_end(s_send);
|
||||
if (xrdp_tcp_send(self->tcp_layer, s_send) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
xrdp_fastpath_process_update(struct xrdp_fastpath* self, tui8 updateCode,
|
||||
tui32 size, struct stream* s)
|
||||
xrdp_fastpath_process_update(struct xrdp_fastpath *self, tui8 updateCode,
|
||||
tui32 size, struct stream *s)
|
||||
{
|
||||
switch (updateCode)
|
||||
{
|
||||
case FASTPATH_UPDATETYPE_ORDERS:
|
||||
case FASTPATH_UPDATETYPE_BITMAP:
|
||||
case FASTPATH_UPDATETYPE_PALETTE:
|
||||
case FASTPATH_UPDATETYPE_SYNCHRONIZE:
|
||||
case FASTPATH_UPDATETYPE_SURFCMDS:
|
||||
case FASTPATH_UPDATETYPE_PTR_NULL:
|
||||
case FASTPATH_UPDATETYPE_PTR_DEFAULT:
|
||||
case FASTPATH_UPDATETYPE_PTR_POSITION:
|
||||
case FASTPATH_UPDATETYPE_COLOR:
|
||||
case FASTPATH_UPDATETYPE_CACHED:
|
||||
case FASTPATH_UPDATETYPE_POINTER:
|
||||
break;
|
||||
default:
|
||||
g_writeln("xrdp_fastpath_process_update: unknown updateCode 0x%X",
|
||||
updateCode);
|
||||
break;
|
||||
}
|
||||
switch (updateCode)
|
||||
{
|
||||
case FASTPATH_UPDATETYPE_ORDERS:
|
||||
case FASTPATH_UPDATETYPE_BITMAP:
|
||||
case FASTPATH_UPDATETYPE_PALETTE:
|
||||
case FASTPATH_UPDATETYPE_SYNCHRONIZE:
|
||||
case FASTPATH_UPDATETYPE_SURFCMDS:
|
||||
case FASTPATH_UPDATETYPE_PTR_NULL:
|
||||
case FASTPATH_UPDATETYPE_PTR_DEFAULT:
|
||||
case FASTPATH_UPDATETYPE_PTR_POSITION:
|
||||
case FASTPATH_UPDATETYPE_COLOR:
|
||||
case FASTPATH_UPDATETYPE_CACHED:
|
||||
case FASTPATH_UPDATETYPE_POINTER:
|
||||
break;
|
||||
default:
|
||||
g_writeln("xrdp_fastpath_process_update: unknown updateCode 0x%X",
|
||||
updateCode);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_fastpath_process_data(struct xrdp_fastpath* self, struct stream* s,
|
||||
xrdp_fastpath_process_data(struct xrdp_fastpath *self, struct stream *s,
|
||||
tui8 header)
|
||||
{
|
||||
tui8 encryptionFlags;
|
||||
tui8 numberEvents;
|
||||
tui8 length2;
|
||||
tui8 updateHeader;
|
||||
tui8 updateCode;
|
||||
tui8 updateFrag;
|
||||
tui8 updateComp;
|
||||
tui16 length;
|
||||
tui32 size;
|
||||
tui8 encryptionFlags;
|
||||
tui8 numberEvents;
|
||||
tui8 length2;
|
||||
tui8 updateHeader;
|
||||
tui8 updateCode;
|
||||
tui8 updateFrag;
|
||||
tui8 updateComp;
|
||||
tui16 length;
|
||||
tui32 size;
|
||||
|
||||
encryptionFlags = (header & 0xc0) >> 6;
|
||||
numberEvents = (header & 0x3c) >> 2;
|
||||
xrdp_tcp_recv(self->tcp_layer, s, 1);
|
||||
in_uint8(s, length);
|
||||
if (length & 0x80)
|
||||
{
|
||||
encryptionFlags = (header & 0xc0) >> 6;
|
||||
numberEvents = (header & 0x3c) >> 2;
|
||||
xrdp_tcp_recv(self->tcp_layer, s, 1);
|
||||
in_uint8(s, length2);
|
||||
length = (length & 0x7f) << 8 + length2 - 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
length -= 2;
|
||||
}
|
||||
xrdp_tcp_recv(self->tcp_layer, s, length);
|
||||
if (encryptionFlags != 0)
|
||||
{
|
||||
/* TODO decryption ...*/
|
||||
}
|
||||
/* parse updateHeader */
|
||||
in_uint8(s, updateHeader);
|
||||
updateCode = (updateHeader & 0x0f);
|
||||
updateFrag = (updateHeader & 0x30) >> 4;
|
||||
updateComp = (updateHeader & 0xc0) >> 6;
|
||||
if (updateFrag && updateComp)
|
||||
{
|
||||
/* TODO */
|
||||
g_writeln("xrdp_fastpath_process_data: updateFrag=%d, updateComp=%d",
|
||||
updateFrag,updateComp);
|
||||
return 1;
|
||||
}
|
||||
in_uint16_le(s, size);
|
||||
return xrdp_fastpath_process_update(self, updateCode, size, s);
|
||||
in_uint8(s, length);
|
||||
|
||||
if (length & 0x80)
|
||||
{
|
||||
xrdp_tcp_recv(self->tcp_layer, s, 1);
|
||||
in_uint8(s, length2);
|
||||
length = (length & 0x7f) << 8 + length2 - 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
length -= 2;
|
||||
}
|
||||
|
||||
xrdp_tcp_recv(self->tcp_layer, s, length);
|
||||
|
||||
if (encryptionFlags != 0)
|
||||
{
|
||||
/* TODO decryption ...*/
|
||||
}
|
||||
|
||||
/* parse updateHeader */
|
||||
in_uint8(s, updateHeader);
|
||||
updateCode = (updateHeader & 0x0f);
|
||||
updateFrag = (updateHeader & 0x30) >> 4;
|
||||
updateComp = (updateHeader & 0xc0) >> 6;
|
||||
|
||||
if (updateFrag && updateComp)
|
||||
{
|
||||
/* TODO */
|
||||
g_writeln("xrdp_fastpath_process_data: updateFrag=%d, updateComp=%d",
|
||||
updateFrag, updateComp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_uint16_le(s, size);
|
||||
return xrdp_fastpath_process_update(self, updateCode, size, s);
|
||||
}
|
||||
|
||||
+163
-144
@@ -1,197 +1,216 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
iso layer
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* iso layer
|
||||
*/
|
||||
|
||||
#include "libxrdp.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct xrdp_iso* APP_CC
|
||||
xrdp_iso_create(struct xrdp_mcs* owner, struct trans* trans)
|
||||
struct xrdp_iso *APP_CC
|
||||
xrdp_iso_create(struct xrdp_mcs *owner, struct trans *trans)
|
||||
{
|
||||
struct xrdp_iso* self;
|
||||
struct xrdp_iso *self;
|
||||
|
||||
DEBUG((" in xrdp_iso_create"));
|
||||
self = (struct xrdp_iso*)g_malloc(sizeof(struct xrdp_iso), 1);
|
||||
self->mcs_layer = owner;
|
||||
self->tcp_layer = xrdp_tcp_create(self, trans);
|
||||
DEBUG((" out xrdp_iso_create"));
|
||||
return self;
|
||||
DEBUG((" in xrdp_iso_create"));
|
||||
self = (struct xrdp_iso *)g_malloc(sizeof(struct xrdp_iso), 1);
|
||||
self->mcs_layer = owner;
|
||||
self->tcp_layer = xrdp_tcp_create(self, trans);
|
||||
DEBUG((" out xrdp_iso_create"));
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
xrdp_iso_delete(struct xrdp_iso* self)
|
||||
xrdp_iso_delete(struct xrdp_iso *self)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
xrdp_tcp_delete(self->tcp_layer);
|
||||
g_free(self);
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
xrdp_tcp_delete(self->tcp_layer);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
static int APP_CC
|
||||
xrdp_iso_recv_msg(struct xrdp_iso* self, struct stream* s, int* code)
|
||||
xrdp_iso_recv_msg(struct xrdp_iso *self, struct stream *s, int *code)
|
||||
{
|
||||
int ver;
|
||||
int len;
|
||||
int ver;
|
||||
int len;
|
||||
|
||||
*code = 0;
|
||||
|
||||
if (xrdp_tcp_recv(self->tcp_layer, s, 4) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_uint8(s, ver);
|
||||
|
||||
if (ver != 3)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
*code = 0;
|
||||
if (xrdp_tcp_recv(self->tcp_layer, s, 4) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
in_uint8(s, ver);
|
||||
if (ver != 3)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
in_uint8s(s, 1);
|
||||
in_uint16_be(s, len);
|
||||
if (xrdp_tcp_recv(self->tcp_layer, s, len - 4) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
in_uint8s(s, 1);
|
||||
in_uint8(s, *code);
|
||||
if (*code == ISO_PDU_DT)
|
||||
{
|
||||
in_uint8s(s, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint8s(s, 5);
|
||||
}
|
||||
return 0;
|
||||
in_uint16_be(s, len);
|
||||
|
||||
if (xrdp_tcp_recv(self->tcp_layer, s, len - 4) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_uint8s(s, 1);
|
||||
in_uint8(s, *code);
|
||||
|
||||
if (*code == ISO_PDU_DT)
|
||||
{
|
||||
in_uint8s(s, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint8s(s, 5);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_iso_recv(struct xrdp_iso* self, struct stream* s)
|
||||
xrdp_iso_recv(struct xrdp_iso *self, struct stream *s)
|
||||
{
|
||||
int code;
|
||||
int code;
|
||||
|
||||
DEBUG((" in xrdp_iso_recv"));
|
||||
if (xrdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
DEBUG((" out xrdp_iso_recv xrdp_iso_recv_msg return non zero"));
|
||||
return 1;
|
||||
}
|
||||
if (code != ISO_PDU_DT)
|
||||
{
|
||||
DEBUG((" out xrdp_iso_recv code != ISO_PDU_DT"));
|
||||
return 1;
|
||||
}
|
||||
DEBUG((" out xrdp_iso_recv"));
|
||||
return 0;
|
||||
DEBUG((" in xrdp_iso_recv"));
|
||||
|
||||
if (xrdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
DEBUG((" out xrdp_iso_recv xrdp_iso_recv_msg return non zero"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (code != ISO_PDU_DT)
|
||||
{
|
||||
DEBUG((" out xrdp_iso_recv code != ISO_PDU_DT"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG((" out xrdp_iso_recv"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
xrdp_iso_send_msg(struct xrdp_iso* self, struct stream* s, int code)
|
||||
xrdp_iso_send_msg(struct xrdp_iso *self, struct stream *s, int code)
|
||||
{
|
||||
if (xrdp_tcp_init(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, 11); /* length */
|
||||
out_uint8(s, 6);
|
||||
out_uint8(s, code);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint8(s, 0);
|
||||
s_mark_end(s);
|
||||
if (xrdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (xrdp_tcp_init(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, 11); /* length */
|
||||
out_uint8(s, 6);
|
||||
out_uint8(s, code);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint8(s, 0);
|
||||
s_mark_end(s);
|
||||
|
||||
if (xrdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_iso_incoming(struct xrdp_iso* self)
|
||||
xrdp_iso_incoming(struct xrdp_iso *self)
|
||||
{
|
||||
int code;
|
||||
struct stream* s;
|
||||
int code;
|
||||
struct stream *s;
|
||||
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
DEBUG((" in xrdp_iso_incoming"));
|
||||
if (xrdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
DEBUG((" in xrdp_iso_incoming"));
|
||||
|
||||
if (xrdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (code != ISO_PDU_CR)
|
||||
{
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (xrdp_iso_send_msg(self, s, ISO_PDU_CC) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG((" out xrdp_iso_incoming"));
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
if (code != ISO_PDU_CR)
|
||||
{
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
if (xrdp_iso_send_msg(self, s, ISO_PDU_CC) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
return 1;
|
||||
}
|
||||
DEBUG((" out xrdp_iso_incoming"));
|
||||
free_stream(s);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_iso_init(struct xrdp_iso* self, struct stream* s)
|
||||
xrdp_iso_init(struct xrdp_iso *self, struct stream *s)
|
||||
{
|
||||
xrdp_tcp_init(self->tcp_layer, s);
|
||||
s_push_layer(s, iso_hdr, 7);
|
||||
return 0;
|
||||
xrdp_tcp_init(self->tcp_layer, s);
|
||||
s_push_layer(s, iso_hdr, 7);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_iso_send(struct xrdp_iso* self, struct stream* s)
|
||||
xrdp_iso_send(struct xrdp_iso *self, struct stream *s)
|
||||
{
|
||||
int len;
|
||||
int len;
|
||||
|
||||
DEBUG((" in xrdp_iso_send"));
|
||||
s_pop_layer(s, iso_hdr);
|
||||
len = s->end - s->p;
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, len);
|
||||
out_uint8(s, 2);
|
||||
out_uint8(s, ISO_PDU_DT);
|
||||
out_uint8(s, 0x80);
|
||||
if (xrdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
DEBUG((" out xrdp_iso_send"));
|
||||
return 0;
|
||||
DEBUG((" in xrdp_iso_send"));
|
||||
s_pop_layer(s, iso_hdr);
|
||||
len = s->end - s->p;
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, len);
|
||||
out_uint8(s, 2);
|
||||
out_uint8(s, ISO_PDU_DT);
|
||||
out_uint8(s, 0x80);
|
||||
|
||||
if (xrdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG((" out xrdp_iso_send"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
+160
-153
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2012
|
||||
|
||||
jpeg compressor
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* jpeg compressor
|
||||
*/
|
||||
|
||||
#include "libxrdp.h"
|
||||
|
||||
@@ -33,10 +31,10 @@
|
||||
|
||||
struct mydata_comp
|
||||
{
|
||||
char* cb;
|
||||
int cb_bytes;
|
||||
int total_done;
|
||||
int overwrite;
|
||||
char *cb;
|
||||
int cb_bytes;
|
||||
int total_done;
|
||||
int overwrite;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -44,13 +42,13 @@ struct mydata_comp
|
||||
static void DEFAULT_CC
|
||||
my_init_destination(j_compress_ptr cinfo)
|
||||
{
|
||||
struct mydata_comp* md;
|
||||
struct mydata_comp *md;
|
||||
|
||||
md = (struct mydata_comp*)(cinfo->client_data);
|
||||
md->total_done = 0;
|
||||
md->overwrite = 0;
|
||||
cinfo->dest->next_output_byte = md->cb;
|
||||
cinfo->dest->free_in_buffer = md->cb_bytes;
|
||||
md = (struct mydata_comp *)(cinfo->client_data);
|
||||
md->total_done = 0;
|
||||
md->overwrite = 0;
|
||||
cinfo->dest->next_output_byte = md->cb;
|
||||
cinfo->dest->free_in_buffer = md->cb_bytes;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -58,16 +56,16 @@ my_init_destination(j_compress_ptr cinfo)
|
||||
static int DEFAULT_CC
|
||||
my_empty_output_buffer(j_compress_ptr cinfo)
|
||||
{
|
||||
struct mydata_comp* md;
|
||||
int chunk_bytes;
|
||||
struct mydata_comp *md;
|
||||
int chunk_bytes;
|
||||
|
||||
md = (struct mydata_comp*)(cinfo->client_data);
|
||||
chunk_bytes = md->cb_bytes;
|
||||
md->total_done += chunk_bytes;
|
||||
cinfo->dest->next_output_byte = md->cb;
|
||||
cinfo->dest->free_in_buffer = md->cb_bytes;
|
||||
md->overwrite = 1;
|
||||
return 1;
|
||||
md = (struct mydata_comp *)(cinfo->client_data);
|
||||
chunk_bytes = md->cb_bytes;
|
||||
md->total_done += chunk_bytes;
|
||||
cinfo->dest->next_output_byte = md->cb;
|
||||
cinfo->dest->free_in_buffer = md->cb_bytes;
|
||||
md->overwrite = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -75,149 +73,158 @@ my_empty_output_buffer(j_compress_ptr cinfo)
|
||||
static void DEFAULT_CC
|
||||
my_term_destination(j_compress_ptr cinfo)
|
||||
{
|
||||
struct mydata_comp* md;
|
||||
int chunk_bytes;
|
||||
struct mydata_comp *md;
|
||||
int chunk_bytes;
|
||||
|
||||
md = (struct mydata_comp*)(cinfo->client_data);
|
||||
chunk_bytes = md->cb_bytes - cinfo->dest->free_in_buffer;
|
||||
md->total_done += chunk_bytes;
|
||||
md = (struct mydata_comp *)(cinfo->client_data);
|
||||
chunk_bytes = md->cb_bytes - cinfo->dest->free_in_buffer;
|
||||
md->total_done += chunk_bytes;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
jp_do_compress(char* data, int width, int height, int bpp, int quality,
|
||||
char* comp_data, int* comp_data_bytes)
|
||||
jp_do_compress(char *data, int width, int height, int bpp, int quality,
|
||||
char *comp_data, int *comp_data_bytes)
|
||||
{
|
||||
struct jpeg_compress_struct cinfo;
|
||||
struct jpeg_error_mgr jerr;
|
||||
struct jpeg_destination_mgr dst_mgr;
|
||||
struct mydata_comp md;
|
||||
JSAMPROW row_pointer[4];
|
||||
int Bpp;
|
||||
struct jpeg_compress_struct cinfo;
|
||||
struct jpeg_error_mgr jerr;
|
||||
struct jpeg_destination_mgr dst_mgr;
|
||||
struct mydata_comp md;
|
||||
JSAMPROW row_pointer[4];
|
||||
int Bpp;
|
||||
|
||||
Bpp = (bpp + 7) / 8;
|
||||
memset(&cinfo, 0, sizeof(cinfo));
|
||||
cinfo.err = jpeg_std_error(&jerr);
|
||||
jpeg_create_compress(&cinfo);
|
||||
memset(&md, 0, sizeof(md));
|
||||
md.cb = comp_data,
|
||||
md.cb_bytes = *comp_data_bytes;
|
||||
cinfo.client_data = &md;
|
||||
memset(&dst_mgr, 0, sizeof(dst_mgr));
|
||||
dst_mgr.init_destination = my_init_destination;
|
||||
dst_mgr.empty_output_buffer = my_empty_output_buffer;
|
||||
dst_mgr.term_destination = my_term_destination;
|
||||
cinfo.dest = &dst_mgr;
|
||||
cinfo.image_width = width;
|
||||
cinfo.image_height = height;
|
||||
cinfo.input_components = Bpp;
|
||||
cinfo.in_color_space = JCS_RGB;
|
||||
jpeg_set_defaults(&cinfo);
|
||||
cinfo.num_components = 3;
|
||||
cinfo.dct_method = JDCT_FLOAT;
|
||||
jpeg_set_quality(&cinfo, quality, 1);
|
||||
jpeg_start_compress(&cinfo, 1);
|
||||
while (cinfo.next_scanline + 3 < cinfo.image_height)
|
||||
{
|
||||
row_pointer[0] = data;
|
||||
data += width * Bpp;
|
||||
row_pointer[1] = data;
|
||||
data += width * Bpp;
|
||||
row_pointer[2] = data;
|
||||
data += width * Bpp;
|
||||
row_pointer[3] = data;
|
||||
data += width * Bpp;
|
||||
jpeg_write_scanlines(&cinfo, row_pointer, 4);
|
||||
}
|
||||
while (cinfo.next_scanline < cinfo.image_height)
|
||||
{
|
||||
row_pointer[0] = data;
|
||||
data += width * Bpp;
|
||||
jpeg_write_scanlines(&cinfo, row_pointer, 1);
|
||||
}
|
||||
jpeg_finish_compress(&cinfo);
|
||||
*comp_data_bytes = md.total_done;
|
||||
jpeg_destroy_compress(&cinfo);
|
||||
if (md.overwrite)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
Bpp = (bpp + 7) / 8;
|
||||
memset(&cinfo, 0, sizeof(cinfo));
|
||||
cinfo.err = jpeg_std_error(&jerr);
|
||||
jpeg_create_compress(&cinfo);
|
||||
memset(&md, 0, sizeof(md));
|
||||
md.cb = comp_data,
|
||||
md.cb_bytes = *comp_data_bytes;
|
||||
cinfo.client_data = &md;
|
||||
memset(&dst_mgr, 0, sizeof(dst_mgr));
|
||||
dst_mgr.init_destination = my_init_destination;
|
||||
dst_mgr.empty_output_buffer = my_empty_output_buffer;
|
||||
dst_mgr.term_destination = my_term_destination;
|
||||
cinfo.dest = &dst_mgr;
|
||||
cinfo.image_width = width;
|
||||
cinfo.image_height = height;
|
||||
cinfo.input_components = Bpp;
|
||||
cinfo.in_color_space = JCS_RGB;
|
||||
jpeg_set_defaults(&cinfo);
|
||||
cinfo.num_components = 3;
|
||||
cinfo.dct_method = JDCT_FLOAT;
|
||||
jpeg_set_quality(&cinfo, quality, 1);
|
||||
jpeg_start_compress(&cinfo, 1);
|
||||
|
||||
while (cinfo.next_scanline + 3 < cinfo.image_height)
|
||||
{
|
||||
row_pointer[0] = data;
|
||||
data += width * Bpp;
|
||||
row_pointer[1] = data;
|
||||
data += width * Bpp;
|
||||
row_pointer[2] = data;
|
||||
data += width * Bpp;
|
||||
row_pointer[3] = data;
|
||||
data += width * Bpp;
|
||||
jpeg_write_scanlines(&cinfo, row_pointer, 4);
|
||||
}
|
||||
|
||||
while (cinfo.next_scanline < cinfo.image_height)
|
||||
{
|
||||
row_pointer[0] = data;
|
||||
data += width * Bpp;
|
||||
jpeg_write_scanlines(&cinfo, row_pointer, 1);
|
||||
}
|
||||
|
||||
jpeg_finish_compress(&cinfo);
|
||||
*comp_data_bytes = md.total_done;
|
||||
jpeg_destroy_compress(&cinfo);
|
||||
|
||||
if (md.overwrite)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
jpeg_compress(char* in_data, int width, int height,
|
||||
struct stream* s, struct stream* temp_s, int bpp,
|
||||
jpeg_compress(char *in_data, int width, int height,
|
||||
struct stream *s, struct stream *temp_s, int bpp,
|
||||
int byte_limit, int e, int quality)
|
||||
{
|
||||
char* data;
|
||||
tui32* src32;
|
||||
tui16* src16;
|
||||
tui8* dst8;
|
||||
tui32 pixel;
|
||||
int red;
|
||||
int blue;
|
||||
int green;
|
||||
int j;
|
||||
int i;
|
||||
int cdata_bytes;
|
||||
char *data;
|
||||
tui32 *src32;
|
||||
tui16 *src16;
|
||||
tui8 *dst8;
|
||||
tui32 pixel;
|
||||
int red;
|
||||
int blue;
|
||||
int green;
|
||||
int j;
|
||||
int i;
|
||||
int cdata_bytes;
|
||||
|
||||
data = temp_s->data;
|
||||
dst8 = data;
|
||||
if (bpp == 24)
|
||||
{
|
||||
src32 = (tui32*)in_data;
|
||||
for (j = 0; j < height; j++)
|
||||
data = temp_s->data;
|
||||
dst8 = data;
|
||||
|
||||
if (bpp == 24)
|
||||
{
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
pixel = src32[i + j * width];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
*(dst8++)= blue;
|
||||
*(dst8++)= green;
|
||||
*(dst8++)= red;
|
||||
}
|
||||
for (i = 0; i < e; i++)
|
||||
{
|
||||
*(dst8++) = blue;
|
||||
*(dst8++) = green;
|
||||
*(dst8++) = red;
|
||||
}
|
||||
src32 = (tui32 *)in_data;
|
||||
|
||||
for (j = 0; j < height; j++)
|
||||
{
|
||||
for (i = 0; i < width; i++)
|
||||
{
|
||||
pixel = src32[i + j * width];
|
||||
SPLITCOLOR32(red, green, blue, pixel);
|
||||
*(dst8++) = blue;
|
||||
*(dst8++) = green;
|
||||
*(dst8++) = red;
|
||||
}
|
||||
|
||||
for (i = 0; i < e; i++)
|
||||
{
|
||||
*(dst8++) = blue;
|
||||
*(dst8++) = green;
|
||||
*(dst8++) = red;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("bpp wrong %d", bpp);
|
||||
}
|
||||
cdata_bytes = byte_limit;
|
||||
jp_do_compress(data, width + e, height, 24, quality, s->p, &cdata_bytes);
|
||||
s->p += cdata_bytes;
|
||||
return cdata_bytes;
|
||||
else
|
||||
{
|
||||
g_writeln("bpp wrong %d", bpp);
|
||||
}
|
||||
|
||||
cdata_bytes = byte_limit;
|
||||
jp_do_compress(data, width + e, height, 24, quality, s->p, &cdata_bytes);
|
||||
s->p += cdata_bytes;
|
||||
return cdata_bytes;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_jpeg_compress(char* in_data, int width, int height,
|
||||
struct stream* s, int bpp, int byte_limit,
|
||||
int start_line, struct stream* temp_s,
|
||||
xrdp_jpeg_compress(char *in_data, int width, int height,
|
||||
struct stream *s, int bpp, int byte_limit,
|
||||
int start_line, struct stream *temp_s,
|
||||
int e, int quality)
|
||||
{
|
||||
jpeg_compress(in_data, width, height, s, temp_s, bpp, byte_limit,
|
||||
e, quality);
|
||||
return height;
|
||||
jpeg_compress(in_data, width, height, s, temp_s, bpp, byte_limit,
|
||||
e, quality);
|
||||
return height;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_jpeg_compress(char* in_data, int width, int height,
|
||||
struct stream* s, int bpp, int byte_limit,
|
||||
int start_line, struct stream* temp_s,
|
||||
xrdp_jpeg_compress(char *in_data, int width, int height,
|
||||
struct stream *s, int bpp, int byte_limit,
|
||||
int start_line, struct stream *temp_s,
|
||||
int e, int quality)
|
||||
{
|
||||
return height;
|
||||
return height;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
+697
-604
File diff suppressed because it is too large
Load Diff
+2072
-1779
File diff suppressed because it is too large
Load Diff
+552
-494
File diff suppressed because it is too large
Load Diff
+1338
-1257
File diff suppressed because it is too large
Load Diff
+951
-848
File diff suppressed because it is too large
Load Diff
+98
-95
@@ -21,141 +21,144 @@
|
||||
#include "freerdp/codec/rfx.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct xrdp_surface* APP_CC
|
||||
xrdp_surface_create(struct xrdp_session* session, struct xrdp_fastpath* fastpath)
|
||||
struct xrdp_surface *APP_CC
|
||||
xrdp_surface_create(struct xrdp_session *session, struct xrdp_fastpath *fastpath)
|
||||
{
|
||||
struct xrdp_surface* self;
|
||||
struct xrdp_surface *self;
|
||||
|
||||
self = (struct xrdp_surface*)g_malloc(sizeof(struct xrdp_surface), 1);
|
||||
self->session = session;
|
||||
self->fastpath = fastpath;
|
||||
self->rfx_context = rfx_context_new();
|
||||
self->s = stream_new(16384);
|
||||
return self;
|
||||
self = (struct xrdp_surface *)g_malloc(sizeof(struct xrdp_surface), 1);
|
||||
self->session = session;
|
||||
self->fastpath = fastpath;
|
||||
self->rfx_context = rfx_context_new();
|
||||
self->s = stream_new(16384);
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
xrdp_surface_delete(struct xrdp_surface* self)
|
||||
xrdp_surface_delete(struct xrdp_surface *self)
|
||||
{
|
||||
STREAM* s;
|
||||
RFX_CONTEXT* rfx_context;
|
||||
STREAM *s;
|
||||
RFX_CONTEXT *rfx_context;
|
||||
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
s = (STREAM*)(self->s);
|
||||
rfx_context = (RFX_CONTEXT*)(self->rfx_context);
|
||||
free_stream(self->out_s);
|
||||
stream_free(s);
|
||||
rfx_context_free(rfx_context);
|
||||
g_free(self);
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
s = (STREAM *)(self->s);
|
||||
rfx_context = (RFX_CONTEXT *)(self->rfx_context);
|
||||
free_stream(self->out_s);
|
||||
stream_free(s);
|
||||
rfx_context_free(rfx_context);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_surface_reset(struct xrdp_surface* self)
|
||||
xrdp_surface_reset(struct xrdp_surface *self)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_surface_init(struct xrdp_surface* self)
|
||||
xrdp_surface_init(struct xrdp_surface *self)
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
RFX_CONTEXT* rfx_context;
|
||||
int width;
|
||||
int height;
|
||||
RFX_CONTEXT *rfx_context;
|
||||
|
||||
rfx_context = (RFX_CONTEXT*)(self->rfx_context);
|
||||
width = self->session->client_info->width;
|
||||
height= self->session->client_info->height;
|
||||
rfx_context = (RFX_CONTEXT *)(self->rfx_context);
|
||||
width = self->session->client_info->width;
|
||||
height = self->session->client_info->height;
|
||||
|
||||
rfx_context->mode = self->session->client_info->rfx_entropy;
|
||||
rfx_context->width = width;
|
||||
rfx_context->height= height;
|
||||
rfx_context->mode = self->session->client_info->rfx_entropy;
|
||||
rfx_context->width = width;
|
||||
rfx_context->height = height;
|
||||
|
||||
make_stream(self->out_s);
|
||||
init_stream(self->out_s, 2 * 3 * width * height + 22);
|
||||
make_stream(self->out_s);
|
||||
init_stream(self->out_s, 2 * 3 * width * height + 22);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_surface_send_surface_bits(struct xrdp_surface* self,int bpp, char* data,
|
||||
xrdp_surface_send_surface_bits(struct xrdp_surface *self, int bpp, char *data,
|
||||
int x, int y, int cx, int cy)
|
||||
{
|
||||
RFX_RECT rect;
|
||||
char* buf;
|
||||
int Bpp;
|
||||
int i;
|
||||
int j;
|
||||
int codecId;
|
||||
uint32 bitmapDataLength;
|
||||
STREAM* s;
|
||||
RFX_CONTEXT* rfx_context;
|
||||
RFX_RECT rect;
|
||||
char *buf;
|
||||
int Bpp;
|
||||
int i;
|
||||
int j;
|
||||
int codecId;
|
||||
uint32 bitmapDataLength;
|
||||
STREAM *s;
|
||||
RFX_CONTEXT *rfx_context;
|
||||
|
||||
s = (STREAM*)(self->s);
|
||||
rfx_context = (RFX_CONTEXT*)(self->rfx_context);
|
||||
if ((bpp == 24) || (bpp == 32))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("bpp = %d is not supported\n", bpp);
|
||||
return 1;
|
||||
}
|
||||
Bpp = 4;
|
||||
s = (STREAM *)(self->s);
|
||||
rfx_context = (RFX_CONTEXT *)(self->rfx_context);
|
||||
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.width = cx;
|
||||
rect.height = cy;
|
||||
if ((bpp == 24) || (bpp == 32))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("bpp = %d is not supported\n", bpp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
init_stream(self->out_s, 0);
|
||||
Bpp = 4;
|
||||
|
||||
stream_set_pos(s, 0);
|
||||
rfx_compose_message(rfx_context, s, &rect, 1, data, cx, cy, Bpp * cx);
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.width = cx;
|
||||
rect.height = cy;
|
||||
|
||||
codecId = self->session->client_info->rfx_codecId;
|
||||
/* surface_bits_command */
|
||||
out_uint16_le(self->out_s, CMDTYPE_STREAM_SURFACE_BITS); /* cmdType */
|
||||
out_uint16_le(self->out_s, x); /* destLeft */
|
||||
out_uint16_le(self->out_s, y); /* destTop */
|
||||
out_uint16_le(self->out_s, x + cx); /* destRight */
|
||||
out_uint16_le(self->out_s, y + cy); /* destBottom */
|
||||
out_uint8(self->out_s, 32); /* bpp */
|
||||
out_uint8(self->out_s, 0); /* reserved1 */
|
||||
out_uint8(self->out_s, 0); /* reserved2 */
|
||||
out_uint8(self->out_s, codecId); /* codecId */
|
||||
out_uint16_le(self->out_s, cx); /* width */
|
||||
out_uint16_le(self->out_s, cy); /* height */
|
||||
bitmapDataLength = stream_get_length(s);
|
||||
out_uint32_le(self->out_s, bitmapDataLength); /* bitmapDataLength */
|
||||
init_stream(self->out_s, 0);
|
||||
|
||||
/* rfx bit stream */
|
||||
out_uint8p(self->out_s, s->data, bitmapDataLength);
|
||||
stream_set_pos(s, 0);
|
||||
rfx_compose_message(rfx_context, s, &rect, 1, data, cx, cy, Bpp * cx);
|
||||
|
||||
s_mark_end(self->out_s);
|
||||
return xrdp_fastpath_send_update_pdu(self->fastpath,
|
||||
FASTPATH_UPDATETYPE_SURFCMDS,
|
||||
self->out_s);
|
||||
codecId = self->session->client_info->rfx_codecId;
|
||||
/* surface_bits_command */
|
||||
out_uint16_le(self->out_s, CMDTYPE_STREAM_SURFACE_BITS); /* cmdType */
|
||||
out_uint16_le(self->out_s, x); /* destLeft */
|
||||
out_uint16_le(self->out_s, y); /* destTop */
|
||||
out_uint16_le(self->out_s, x + cx); /* destRight */
|
||||
out_uint16_le(self->out_s, y + cy); /* destBottom */
|
||||
out_uint8(self->out_s, 32); /* bpp */
|
||||
out_uint8(self->out_s, 0); /* reserved1 */
|
||||
out_uint8(self->out_s, 0); /* reserved2 */
|
||||
out_uint8(self->out_s, codecId); /* codecId */
|
||||
out_uint16_le(self->out_s, cx); /* width */
|
||||
out_uint16_le(self->out_s, cy); /* height */
|
||||
bitmapDataLength = stream_get_length(s);
|
||||
out_uint32_le(self->out_s, bitmapDataLength); /* bitmapDataLength */
|
||||
|
||||
/* rfx bit stream */
|
||||
out_uint8p(self->out_s, s->data, bitmapDataLength);
|
||||
|
||||
s_mark_end(self->out_s);
|
||||
return xrdp_fastpath_send_update_pdu(self->fastpath,
|
||||
FASTPATH_UPDATETYPE_SURFCMDS,
|
||||
self->out_s);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xrdp_surface_send_frame_marker(struct xrdp_surface* self,
|
||||
xrdp_surface_send_frame_marker(struct xrdp_surface *self,
|
||||
uint16 frameAction, uint32 frameId)
|
||||
{
|
||||
init_stream(self->out_s, 0);
|
||||
out_uint16_le(self->out_s, CMDTYPE_FRAME_MARKER);
|
||||
out_uint16_le(self->out_s, frameAction);
|
||||
out_uint32_le(self->out_s, frameId);
|
||||
s_mark_end(self->out_s);
|
||||
return xrdp_fastpath_send_update_pdu(self->fastpath,
|
||||
FASTPATH_UPDATETYPE_SURFCMDS,
|
||||
self->out_s);
|
||||
init_stream(self->out_s, 0);
|
||||
out_uint16_le(self->out_s, CMDTYPE_FRAME_MARKER);
|
||||
out_uint16_le(self->out_s, frameAction);
|
||||
out_uint32_le(self->out_s, frameId);
|
||||
s_mark_end(self->out_s);
|
||||
return xrdp_fastpath_send_update_pdu(self->fastpath,
|
||||
FASTPATH_UPDATETYPE_SURFCMDS,
|
||||
self->out_s);
|
||||
}
|
||||
|
||||
+58
-56
@@ -1,87 +1,89 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2004-2010
|
||||
|
||||
tcp layer
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004 - 2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* tcp layer
|
||||
*/
|
||||
|
||||
#include "libxrdp.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct xrdp_tcp* APP_CC
|
||||
xrdp_tcp_create(struct xrdp_iso* owner, struct trans* trans)
|
||||
struct xrdp_tcp *APP_CC
|
||||
xrdp_tcp_create(struct xrdp_iso *owner, struct trans *trans)
|
||||
{
|
||||
struct xrdp_tcp* self;
|
||||
struct xrdp_tcp *self;
|
||||
|
||||
DEBUG((" in xrdp_tcp_create"));
|
||||
self = (struct xrdp_tcp*)g_malloc(sizeof(struct xrdp_tcp), 1);
|
||||
self->iso_layer = owner;
|
||||
self->trans = trans;
|
||||
DEBUG((" out xrdp_tcp_create"));
|
||||
return self;
|
||||
DEBUG((" in xrdp_tcp_create"));
|
||||
self = (struct xrdp_tcp *)g_malloc(sizeof(struct xrdp_tcp), 1);
|
||||
self->iso_layer = owner;
|
||||
self->trans = trans;
|
||||
DEBUG((" out xrdp_tcp_create"));
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
xrdp_tcp_delete(struct xrdp_tcp* self)
|
||||
xrdp_tcp_delete(struct xrdp_tcp *self)
|
||||
{
|
||||
g_free(self);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* get out stream ready for data */
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_tcp_init(struct xrdp_tcp* self, struct stream* s)
|
||||
xrdp_tcp_init(struct xrdp_tcp *self, struct stream *s)
|
||||
{
|
||||
init_stream(s, 8192);
|
||||
return 0;
|
||||
init_stream(s, 8192);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len)
|
||||
xrdp_tcp_recv(struct xrdp_tcp *self, struct stream *s, int len)
|
||||
{
|
||||
DEBUG((" in xrdp_tcp_recv, gota get %d bytes", len));
|
||||
init_stream(s, len);
|
||||
if (trans_force_read_s(self->trans, s, len) != 0)
|
||||
{
|
||||
DEBUG((" error in trans_force_read_s"));
|
||||
return 1;
|
||||
}
|
||||
DEBUG((" out xrdp_tcp_recv"));
|
||||
return 0;
|
||||
DEBUG((" in xrdp_tcp_recv, gota get %d bytes", len));
|
||||
init_stream(s, len);
|
||||
|
||||
if (trans_force_read_s(self->trans, s, len) != 0)
|
||||
{
|
||||
DEBUG((" error in trans_force_read_s"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG((" out xrdp_tcp_recv"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s)
|
||||
xrdp_tcp_send(struct xrdp_tcp *self, struct stream *s)
|
||||
{
|
||||
int len;
|
||||
len = s->end - s->data;
|
||||
DEBUG((" in xrdp_tcp_send, gota send %d bytes", len));
|
||||
if (trans_force_write_s(self->trans, s) != 0)
|
||||
{
|
||||
DEBUG((" error in trans_force_write_s"));
|
||||
return 1;
|
||||
}
|
||||
DEBUG((" out xrdp_tcp_send, sent %d bytes ok", len));
|
||||
return 0;
|
||||
int len;
|
||||
len = s->end - s->data;
|
||||
DEBUG((" in xrdp_tcp_send, gota send %d bytes", len));
|
||||
|
||||
if (trans_force_write_s(self->trans, s) != 0)
|
||||
{
|
||||
DEBUG((" error in trans_force_write_s"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG((" out xrdp_tcp_send, sent %d bytes ok", len));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,114 +1,113 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2007-2010
|
||||
|
||||
media center
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* media center
|
||||
*/
|
||||
|
||||
#include "mc.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_start(struct mod* mod, int w, int h, int bpp)
|
||||
lib_mod_start(struct mod *mod, int w, int h, int bpp)
|
||||
{
|
||||
LIB_DEBUG(mod, "in lib_mod_start");
|
||||
mod->width = w;
|
||||
mod->height = h;
|
||||
mod->bpp = bpp;
|
||||
LIB_DEBUG(mod, "out lib_mod_start");
|
||||
return 0;
|
||||
LIB_DEBUG(mod, "in lib_mod_start");
|
||||
mod->width = w;
|
||||
mod->height = h;
|
||||
mod->bpp = bpp;
|
||||
LIB_DEBUG(mod, "out lib_mod_start");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_connect(struct mod* mod)
|
||||
lib_mod_connect(struct mod *mod)
|
||||
{
|
||||
LIB_DEBUG(mod, "in lib_mod_connect");
|
||||
LIB_DEBUG(mod, "out lib_mod_connect");
|
||||
return 0;
|
||||
LIB_DEBUG(mod, "in lib_mod_connect");
|
||||
LIB_DEBUG(mod, "out lib_mod_connect");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_event(struct mod* mod, int msg, long param1, long param2,
|
||||
lib_mod_event(struct mod *mod, int msg, long param1, long param2,
|
||||
long param3, long param4)
|
||||
{
|
||||
LIB_DEBUG(mod, "in lib_mod_event");
|
||||
LIB_DEBUG(mod, "out lib_mod_event");
|
||||
return 0;
|
||||
LIB_DEBUG(mod, "in lib_mod_event");
|
||||
LIB_DEBUG(mod, "out lib_mod_event");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_signal(struct mod* mod)
|
||||
lib_mod_signal(struct mod *mod)
|
||||
{
|
||||
LIB_DEBUG(mod, "in lib_mod_signal");
|
||||
LIB_DEBUG(mod, "out lib_mod_signal");
|
||||
return 0;
|
||||
LIB_DEBUG(mod, "in lib_mod_signal");
|
||||
LIB_DEBUG(mod, "out lib_mod_signal");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_end(struct mod* mod)
|
||||
lib_mod_end(struct mod *mod)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_set_param(struct mod* mod, char* name, char* value)
|
||||
lib_mod_set_param(struct mod *mod, char *name, char *value)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
struct mod* EXPORT_CC
|
||||
struct mod *EXPORT_CC
|
||||
mod_init(void)
|
||||
{
|
||||
struct mod* mod;
|
||||
struct mod *mod;
|
||||
|
||||
mod = (struct mod*)g_malloc(sizeof(struct mod), 1);
|
||||
mod->size = sizeof(struct mod);
|
||||
mod->version = CURRENT_MOD_VER;
|
||||
mod->handle = (long)mod;
|
||||
mod->mod_connect = lib_mod_connect;
|
||||
mod->mod_start = lib_mod_start;
|
||||
mod->mod_event = lib_mod_event;
|
||||
mod->mod_signal = lib_mod_signal;
|
||||
mod->mod_end = lib_mod_end;
|
||||
mod->mod_set_param = lib_mod_set_param;
|
||||
return mod;
|
||||
mod = (struct mod *)g_malloc(sizeof(struct mod), 1);
|
||||
mod->size = sizeof(struct mod);
|
||||
mod->version = CURRENT_MOD_VER;
|
||||
mod->handle = (long)mod;
|
||||
mod->mod_connect = lib_mod_connect;
|
||||
mod->mod_start = lib_mod_start;
|
||||
mod->mod_event = lib_mod_event;
|
||||
mod->mod_signal = lib_mod_signal;
|
||||
mod->mod_end = lib_mod_end;
|
||||
mod->mod_set_param = lib_mod_set_param;
|
||||
return mod;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int EXPORT_CC
|
||||
mod_exit(struct mod* mod)
|
||||
mod_exit(struct mod *mod)
|
||||
{
|
||||
if (mod == 0)
|
||||
{
|
||||
if (mod == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
g_free(mod);
|
||||
return 0;
|
||||
}
|
||||
g_free(mod);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2007-2010
|
||||
|
||||
media center
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* media center
|
||||
*/
|
||||
|
||||
/* include other h files */
|
||||
#include "arch.h"
|
||||
|
||||
@@ -1,333 +1,352 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
|
||||
librdp main file
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* librdp main file
|
||||
*/
|
||||
|
||||
#include "rdp.h"
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_start(struct mod* mod, int w, int h, int bpp)
|
||||
lib_mod_start(struct mod *mod, int w, int h, int bpp)
|
||||
{
|
||||
DEBUG(("in lib_mod_start"));
|
||||
mod->width = w;
|
||||
mod->height = h;
|
||||
mod->rdp_bpp = bpp;
|
||||
mod->xrdp_bpp = bpp;
|
||||
mod->keylayout = 0x409;
|
||||
g_strncpy(mod->port, "3389", 255); /* default */
|
||||
DEBUG(("out lib_mod_start"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_connect(struct mod* mod)
|
||||
{
|
||||
DEBUG(("in lib_mod_connect"));
|
||||
/* clear screen */
|
||||
mod->server_begin_update(mod);
|
||||
mod->server_set_fgcolor(mod, 0);
|
||||
mod->server_fill_rect(mod, 0, 0, mod->width, mod->height);
|
||||
mod->server_end_update(mod);
|
||||
/* connect */
|
||||
if (rdp_rdp_connect(mod->rdp_layer, mod->ip, mod->port) == 0)
|
||||
{
|
||||
mod->sck = mod->rdp_layer->sec_layer->mcs_layer->iso_layer->tcp_layer->sck;
|
||||
g_tcp_set_non_blocking(mod->sck);
|
||||
g_tcp_set_no_delay(mod->sck);
|
||||
mod->sck_obj = g_create_wait_obj_from_socket(mod->sck, 0);
|
||||
DEBUG(("out lib_mod_connect"));
|
||||
DEBUG(("in lib_mod_start"));
|
||||
mod->width = w;
|
||||
mod->height = h;
|
||||
mod->rdp_bpp = bpp;
|
||||
mod->xrdp_bpp = bpp;
|
||||
mod->keylayout = 0x409;
|
||||
g_strncpy(mod->port, "3389", 255); /* default */
|
||||
DEBUG(("out lib_mod_start"));
|
||||
return 0;
|
||||
}
|
||||
DEBUG(("out lib_mod_connect error"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_event(struct mod* mod, int msg, long param1, long param2,
|
||||
lib_mod_connect(struct mod *mod)
|
||||
{
|
||||
DEBUG(("in lib_mod_connect"));
|
||||
/* clear screen */
|
||||
mod->server_begin_update(mod);
|
||||
mod->server_set_fgcolor(mod, 0);
|
||||
mod->server_fill_rect(mod, 0, 0, mod->width, mod->height);
|
||||
mod->server_end_update(mod);
|
||||
|
||||
/* connect */
|
||||
if (rdp_rdp_connect(mod->rdp_layer, mod->ip, mod->port) == 0)
|
||||
{
|
||||
mod->sck = mod->rdp_layer->sec_layer->mcs_layer->iso_layer->tcp_layer->sck;
|
||||
g_tcp_set_non_blocking(mod->sck);
|
||||
g_tcp_set_no_delay(mod->sck);
|
||||
mod->sck_obj = g_create_wait_obj_from_socket(mod->sck, 0);
|
||||
DEBUG(("out lib_mod_connect"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEBUG(("out lib_mod_connect error"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_event(struct mod *mod, int msg, long param1, long param2,
|
||||
long param3, long param4)
|
||||
{
|
||||
struct stream* s;
|
||||
struct stream *s;
|
||||
|
||||
if (!mod->up_and_running)
|
||||
{
|
||||
if (!mod->up_and_running)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEBUG(("in lib_mod_event"));
|
||||
make_stream(s);
|
||||
init_stream(s, 8192 * 2);
|
||||
|
||||
switch (msg)
|
||||
{
|
||||
case 15:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SCANCODE,
|
||||
param4, param3, 0);
|
||||
break;
|
||||
case 16:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SCANCODE,
|
||||
param4, param3, 0);
|
||||
break;
|
||||
case 17:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SYNCHRONIZE,
|
||||
param4, param3, 0);
|
||||
break;
|
||||
case 100:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_MOVE, param1, param2);
|
||||
break;
|
||||
case 101:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON1, param1, param2);
|
||||
break;
|
||||
case 102:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON1 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 103:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON2, param1, param2);
|
||||
break;
|
||||
case 104:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON2 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 105:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON3, param1, param2);
|
||||
break;
|
||||
case 106:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON3 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 107:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON4, param1, param2);
|
||||
break;
|
||||
case 108:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON4 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 109:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON5, param1, param2);
|
||||
break;
|
||||
case 110:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON5 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 200:
|
||||
rdp_rdp_send_invalidate(mod->rdp_layer, s,
|
||||
(param1 >> 16) & 0xffff, param1 & 0xffff,
|
||||
(param2 >> 16) & 0xffff, param2 & 0xffff);
|
||||
break;
|
||||
}
|
||||
|
||||
free_stream(s);
|
||||
DEBUG(("out lib_mod_event"));
|
||||
return 0;
|
||||
}
|
||||
DEBUG(("in lib_mod_event"));
|
||||
make_stream(s);
|
||||
init_stream(s, 8192 * 2);
|
||||
switch (msg)
|
||||
{
|
||||
case 15:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SCANCODE,
|
||||
param4, param3, 0);
|
||||
break;
|
||||
case 16:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SCANCODE,
|
||||
param4, param3, 0);
|
||||
break;
|
||||
case 17:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_SYNCHRONIZE,
|
||||
param4, param3, 0);
|
||||
break;
|
||||
case 100:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_MOVE, param1, param2);
|
||||
break;
|
||||
case 101:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON1, param1, param2);
|
||||
break;
|
||||
case 102:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON1 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 103:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON2, param1, param2);
|
||||
break;
|
||||
case 104:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON2 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 105:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON3, param1, param2);
|
||||
break;
|
||||
case 106:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON3 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 107:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON4, param1, param2);
|
||||
break;
|
||||
case 108:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON4 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 109:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON5, param1, param2);
|
||||
break;
|
||||
case 110:
|
||||
rdp_rdp_send_input(mod->rdp_layer, s, 0, RDP_INPUT_MOUSE,
|
||||
MOUSE_FLAG_BUTTON5 | MOUSE_FLAG_DOWN,
|
||||
param1, param2);
|
||||
break;
|
||||
case 200:
|
||||
rdp_rdp_send_invalidate(mod->rdp_layer, s,
|
||||
(param1 >> 16) & 0xffff, param1 & 0xffff,
|
||||
(param2 >> 16) & 0xffff, param2 & 0xffff);
|
||||
break;
|
||||
}
|
||||
free_stream(s);
|
||||
DEBUG(("out lib_mod_event"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_signal(struct mod* mod)
|
||||
lib_mod_signal(struct mod *mod)
|
||||
{
|
||||
int type;
|
||||
int cont;
|
||||
struct stream* s;
|
||||
int type;
|
||||
int cont;
|
||||
struct stream *s;
|
||||
|
||||
DEBUG(("in lib_mod_signal"));
|
||||
if (mod->in_s == 0)
|
||||
{
|
||||
make_stream(mod->in_s);
|
||||
}
|
||||
s = mod->in_s;
|
||||
init_stream(s, 8192 * 2);
|
||||
cont = 1;
|
||||
while (cont)
|
||||
{
|
||||
type = 0;
|
||||
if (rdp_rdp_recv(mod->rdp_layer, s, &type) != 0)
|
||||
DEBUG(("in lib_mod_signal"));
|
||||
|
||||
if (mod->in_s == 0)
|
||||
{
|
||||
DEBUG(("out lib_mod_signal error rdp_rdp_recv failed"));
|
||||
return 1;
|
||||
make_stream(mod->in_s);
|
||||
}
|
||||
DEBUG(("lib_mod_signal type %d", type));
|
||||
switch (type)
|
||||
|
||||
s = mod->in_s;
|
||||
init_stream(s, 8192 * 2);
|
||||
cont = 1;
|
||||
|
||||
while (cont)
|
||||
{
|
||||
case RDP_PDU_DATA:
|
||||
rdp_rdp_process_data_pdu(mod->rdp_layer, s);
|
||||
break;
|
||||
case RDP_PDU_DEMAND_ACTIVE:
|
||||
rdp_rdp_process_demand_active(mod->rdp_layer, s);
|
||||
mod->up_and_running = 1;
|
||||
break;
|
||||
case RDP_PDU_DEACTIVATE:
|
||||
mod->up_and_running = 0;
|
||||
break;
|
||||
case RDP_PDU_REDIRECT:
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
type = 0;
|
||||
|
||||
if (rdp_rdp_recv(mod->rdp_layer, s, &type) != 0)
|
||||
{
|
||||
DEBUG(("out lib_mod_signal error rdp_rdp_recv failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG(("lib_mod_signal type %d", type));
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case RDP_PDU_DATA:
|
||||
rdp_rdp_process_data_pdu(mod->rdp_layer, s);
|
||||
break;
|
||||
case RDP_PDU_DEMAND_ACTIVE:
|
||||
rdp_rdp_process_demand_active(mod->rdp_layer, s);
|
||||
mod->up_and_running = 1;
|
||||
break;
|
||||
case RDP_PDU_DEACTIVATE:
|
||||
mod->up_and_running = 0;
|
||||
break;
|
||||
case RDP_PDU_REDIRECT:
|
||||
break;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
cont = s->next_packet < s->end;
|
||||
}
|
||||
cont = s->next_packet < s->end;
|
||||
}
|
||||
DEBUG(("out lib_mod_signal"));
|
||||
return 0;
|
||||
|
||||
DEBUG(("out lib_mod_signal"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_end(struct mod* mod)
|
||||
lib_mod_end(struct mod *mod)
|
||||
{
|
||||
rdp_rdp_delete(mod->rdp_layer);
|
||||
mod->rdp_layer = 0;
|
||||
free_stream(mod->in_s);
|
||||
mod->in_s = 0;
|
||||
if (mod->sck_obj != 0)
|
||||
{
|
||||
g_delete_wait_obj_from_socket(mod->sck_obj);
|
||||
mod->sck_obj = 0;
|
||||
}
|
||||
if (mod->sck != 0)
|
||||
{
|
||||
g_tcp_close(mod->sck);
|
||||
mod->sck = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
rdp_rdp_delete(mod->rdp_layer);
|
||||
mod->rdp_layer = 0;
|
||||
free_stream(mod->in_s);
|
||||
mod->in_s = 0;
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_set_param(struct mod* mod, char* name, char* value)
|
||||
{
|
||||
if (g_strncasecmp(name, "ip", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->ip, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "port", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->port, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "username", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->username, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "password", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->password, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "hostname", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->hostname, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "keylayout", 255) == 0)
|
||||
{
|
||||
mod->keylayout = g_atoi(value);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_get_wait_objs(struct mod* mod, tbus* read_objs, int* rcount,
|
||||
tbus* write_objs, int* wcount, int* timeout)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = *rcount;
|
||||
if (mod != 0)
|
||||
{
|
||||
if (mod->sck_obj != 0)
|
||||
{
|
||||
read_objs[i++] = mod->sck_obj;
|
||||
g_delete_wait_obj_from_socket(mod->sck_obj);
|
||||
mod->sck_obj = 0;
|
||||
}
|
||||
}
|
||||
*rcount = i;
|
||||
return 0;
|
||||
|
||||
if (mod->sck != 0)
|
||||
{
|
||||
g_tcp_close(mod->sck);
|
||||
mod->sck = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_check_wait_objs(struct mod* mod)
|
||||
lib_mod_set_param(struct mod *mod, char *name, char *value)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = 0;
|
||||
if (mod != 0)
|
||||
{
|
||||
if (mod->sck_obj != 0)
|
||||
if (g_strncasecmp(name, "ip", 255) == 0)
|
||||
{
|
||||
if (g_is_wait_obj_set(mod->sck_obj))
|
||||
{
|
||||
rv = lib_mod_signal(mod);
|
||||
}
|
||||
g_strncpy(mod->ip, value, 255);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
else if (g_strncasecmp(name, "port", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->port, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "username", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->username, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "password", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->password, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "hostname", 255) == 0)
|
||||
{
|
||||
g_strncpy(mod->hostname, value, 255);
|
||||
}
|
||||
else if (g_strncasecmp(name, "keylayout", 255) == 0)
|
||||
{
|
||||
mod->keylayout = g_atoi(value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
struct mod* EXPORT_CC
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_get_wait_objs(struct mod *mod, tbus *read_objs, int *rcount,
|
||||
tbus *write_objs, int *wcount, int *timeout)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = *rcount;
|
||||
|
||||
if (mod != 0)
|
||||
{
|
||||
if (mod->sck_obj != 0)
|
||||
{
|
||||
read_objs[i++] = mod->sck_obj;
|
||||
}
|
||||
}
|
||||
|
||||
*rcount = i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* return error */
|
||||
int DEFAULT_CC
|
||||
lib_mod_check_wait_objs(struct mod *mod)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = 0;
|
||||
|
||||
if (mod != 0)
|
||||
{
|
||||
if (mod->sck_obj != 0)
|
||||
{
|
||||
if (g_is_wait_obj_set(mod->sck_obj))
|
||||
{
|
||||
rv = lib_mod_signal(mod);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
struct mod *EXPORT_CC
|
||||
mod_init(void)
|
||||
{
|
||||
struct mod* mod;
|
||||
struct mod *mod;
|
||||
|
||||
DEBUG(("in mod_init"));
|
||||
mod = (struct mod*)g_malloc(sizeof(struct mod), 1);
|
||||
mod->size = sizeof(struct mod);
|
||||
mod->version = CURRENT_MOD_VER;
|
||||
mod->handle = (long)mod;
|
||||
mod->mod_connect = lib_mod_connect;
|
||||
mod->mod_start = lib_mod_start;
|
||||
mod->mod_event = lib_mod_event;
|
||||
mod->mod_signal = lib_mod_signal;
|
||||
mod->mod_end = lib_mod_end;
|
||||
mod->mod_set_param = lib_mod_set_param;
|
||||
mod->mod_get_wait_objs = lib_mod_get_wait_objs;
|
||||
mod->mod_check_wait_objs = lib_mod_check_wait_objs;
|
||||
mod->rdp_layer = rdp_rdp_create(mod);
|
||||
DEBUG(("out mod_init"));
|
||||
return mod;
|
||||
DEBUG(("in mod_init"));
|
||||
mod = (struct mod *)g_malloc(sizeof(struct mod), 1);
|
||||
mod->size = sizeof(struct mod);
|
||||
mod->version = CURRENT_MOD_VER;
|
||||
mod->handle = (long)mod;
|
||||
mod->mod_connect = lib_mod_connect;
|
||||
mod->mod_start = lib_mod_start;
|
||||
mod->mod_event = lib_mod_event;
|
||||
mod->mod_signal = lib_mod_signal;
|
||||
mod->mod_end = lib_mod_end;
|
||||
mod->mod_set_param = lib_mod_set_param;
|
||||
mod->mod_get_wait_objs = lib_mod_get_wait_objs;
|
||||
mod->mod_check_wait_objs = lib_mod_check_wait_objs;
|
||||
mod->rdp_layer = rdp_rdp_create(mod);
|
||||
DEBUG(("out mod_init"));
|
||||
return mod;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int EXPORT_CC
|
||||
mod_exit(struct mod* mod)
|
||||
mod_exit(struct mod *mod)
|
||||
{
|
||||
DEBUG(("in mod_exit"));
|
||||
g_free(mod);
|
||||
DEBUG(("out mod_exit"));
|
||||
return 0;
|
||||
DEBUG(("in mod_exit"));
|
||||
g_free(mod);
|
||||
DEBUG(("out mod_exit"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,24 +1,22 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
|
||||
librdp main header file
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* librdp main header file
|
||||
*/
|
||||
|
||||
/* include other h files */
|
||||
#include "arch.h"
|
||||
@@ -269,7 +267,7 @@ struct mod
|
||||
int (*mod_get_wait_objs)(struct mod* v, tbus* read_objs, int* rcount,
|
||||
tbus* write_objs, int* wcount, int* timeout);
|
||||
int (*mod_check_wait_objs)(struct mod* v);
|
||||
long mod_dumby[100 - 9]; /* align, 100 minus the number of mod
|
||||
long mod_dumby[100 - 9]; /* align, 100 minus the number of mod
|
||||
functions above */
|
||||
/* server functions */
|
||||
int (*server_begin_update)(struct mod* v);
|
||||
|
||||
+903
-832
File diff suppressed because it is too large
Load Diff
+184
-164
@@ -1,219 +1,239 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
|
||||
librdp iso layer
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* librdp iso layer
|
||||
*/
|
||||
|
||||
#include "rdp.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct rdp_iso* APP_CC
|
||||
rdp_iso_create(struct rdp_mcs* owner)
|
||||
struct rdp_iso *APP_CC
|
||||
rdp_iso_create(struct rdp_mcs *owner)
|
||||
{
|
||||
struct rdp_iso* self;
|
||||
struct rdp_iso *self;
|
||||
|
||||
self = (struct rdp_iso*)g_malloc(sizeof(struct rdp_iso), 1);
|
||||
self->mcs_layer = owner;
|
||||
self->tcp_layer = rdp_tcp_create(self);
|
||||
return self;
|
||||
self = (struct rdp_iso *)g_malloc(sizeof(struct rdp_iso), 1);
|
||||
self->mcs_layer = owner;
|
||||
self->tcp_layer = rdp_tcp_create(self);
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
rdp_iso_delete(struct rdp_iso* self)
|
||||
rdp_iso_delete(struct rdp_iso *self)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
rdp_tcp_delete(self->tcp_layer);
|
||||
g_free(self);
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
rdp_tcp_delete(self->tcp_layer);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
static int APP_CC
|
||||
rdp_iso_recv_msg(struct rdp_iso* self, struct stream* s, int* code)
|
||||
rdp_iso_recv_msg(struct rdp_iso *self, struct stream *s, int *code)
|
||||
{
|
||||
int ver;
|
||||
int len;
|
||||
int ver;
|
||||
int len;
|
||||
|
||||
*code = 0;
|
||||
|
||||
if (rdp_tcp_recv(self->tcp_layer, s, 4) != 0)
|
||||
{
|
||||
DEBUG((" out rdp_iso_recv_msg error rdp_tcp_recv 1 failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_uint8(s, ver);
|
||||
|
||||
if (ver != 3)
|
||||
{
|
||||
DEBUG((" out rdp_iso_recv_msg error ver != 3"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
*code = 0;
|
||||
if (rdp_tcp_recv(self->tcp_layer, s, 4) != 0)
|
||||
{
|
||||
DEBUG((" out rdp_iso_recv_msg error rdp_tcp_recv 1 failed"));
|
||||
return 1;
|
||||
}
|
||||
in_uint8(s, ver);
|
||||
if (ver != 3)
|
||||
{
|
||||
DEBUG((" out rdp_iso_recv_msg error ver != 3"));
|
||||
return 1;
|
||||
}
|
||||
in_uint8s(s, 1);
|
||||
in_uint16_be(s, len);
|
||||
if (rdp_tcp_recv(self->tcp_layer, s, len - 4) != 0)
|
||||
{
|
||||
DEBUG((" out rdp_iso_recv_msg error rdp_tcp_recv 2 failed"));
|
||||
return 1;
|
||||
}
|
||||
in_uint8s(s, 1);
|
||||
in_uint8(s, *code);
|
||||
if (*code == ISO_PDU_DT)
|
||||
{
|
||||
in_uint8s(s, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint8s(s, 5);
|
||||
}
|
||||
return 0;
|
||||
in_uint16_be(s, len);
|
||||
|
||||
if (rdp_tcp_recv(self->tcp_layer, s, len - 4) != 0)
|
||||
{
|
||||
DEBUG((" out rdp_iso_recv_msg error rdp_tcp_recv 2 failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_uint8s(s, 1);
|
||||
in_uint8(s, *code);
|
||||
|
||||
if (*code == ISO_PDU_DT)
|
||||
{
|
||||
in_uint8s(s, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint8s(s, 5);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
rdp_iso_send_msg(struct rdp_iso* self, struct stream* s, int code)
|
||||
rdp_iso_send_msg(struct rdp_iso *self, struct stream *s, int code)
|
||||
{
|
||||
if (rdp_tcp_init(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, 11); /* length */
|
||||
out_uint8(s, 6);
|
||||
out_uint8(s, code);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint8(s, 0);
|
||||
s_mark_end(s);
|
||||
if (rdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (rdp_tcp_init(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, 11); /* length */
|
||||
out_uint8(s, 6);
|
||||
out_uint8(s, code);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint8(s, 0);
|
||||
s_mark_end(s);
|
||||
|
||||
if (rdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_iso_recv(struct rdp_iso* self, struct stream* s)
|
||||
rdp_iso_recv(struct rdp_iso *self, struct stream *s)
|
||||
{
|
||||
int code;
|
||||
int code;
|
||||
|
||||
if (rdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (code != ISO_PDU_DT)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (rdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (code != ISO_PDU_DT)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_iso_init(struct rdp_iso* self, struct stream* s)
|
||||
rdp_iso_init(struct rdp_iso *self, struct stream *s)
|
||||
{
|
||||
rdp_tcp_init(self->tcp_layer, s);
|
||||
s_push_layer(s, iso_hdr, 7);
|
||||
return 0;
|
||||
rdp_tcp_init(self->tcp_layer, s);
|
||||
s_push_layer(s, iso_hdr, 7);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_iso_send(struct rdp_iso* self, struct stream* s)
|
||||
rdp_iso_send(struct rdp_iso *self, struct stream *s)
|
||||
{
|
||||
int len;
|
||||
int len;
|
||||
|
||||
s_pop_layer(s, iso_hdr);
|
||||
len = s->end - s->p;
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, len);
|
||||
out_uint8(s, 2);
|
||||
out_uint8(s, ISO_PDU_DT);
|
||||
out_uint8(s, 0x80);
|
||||
if (rdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
s_pop_layer(s, iso_hdr);
|
||||
len = s->end - s->p;
|
||||
out_uint8(s, 3);
|
||||
out_uint8(s, 0);
|
||||
out_uint16_be(s, len);
|
||||
out_uint8(s, 2);
|
||||
out_uint8(s, ISO_PDU_DT);
|
||||
out_uint8(s, 0x80);
|
||||
|
||||
if (rdp_tcp_send(self->tcp_layer, s) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_iso_connect(struct rdp_iso* self, char* ip, char* port)
|
||||
rdp_iso_connect(struct rdp_iso *self, char *ip, char *port)
|
||||
{
|
||||
int code;
|
||||
struct stream* s;
|
||||
int code;
|
||||
struct stream *s;
|
||||
|
||||
DEBUG((" in rdp_iso_connect"));
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
|
||||
if (rdp_tcp_connect(self->tcp_layer, ip, port) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
DEBUG((" out rdp_iso_connect error rdp_tcp_connect failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (rdp_iso_send_msg(self, s, ISO_PDU_CR) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
DEBUG((" out rdp_iso_connect error rdp_iso_send_msg failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
init_stream(s, 8192);
|
||||
|
||||
if (rdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
DEBUG((" out rdp_iso_connect error rdp_iso_recv_msg failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (code != ISO_PDU_CC)
|
||||
{
|
||||
free_stream(s);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
DEBUG((" out rdp_iso_connect error code != ISO_PDU_CC"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
DEBUG((" in rdp_iso_connect"));
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
if (rdp_tcp_connect(self->tcp_layer, ip, port) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
DEBUG((" out rdp_iso_connect error rdp_tcp_connect failed"));
|
||||
return 1;
|
||||
}
|
||||
if (rdp_iso_send_msg(self, s, ISO_PDU_CR) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
DEBUG((" out rdp_iso_connect"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
rdp_iso_disconnect(struct rdp_iso *self)
|
||||
{
|
||||
struct stream *s;
|
||||
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_iso_send_msg(self, s, ISO_PDU_DR);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
DEBUG((" out rdp_iso_connect error rdp_iso_send_msg failed"));
|
||||
return 1;
|
||||
}
|
||||
init_stream(s, 8192);
|
||||
if (rdp_iso_recv_msg(self, s, &code) != 0)
|
||||
{
|
||||
free_stream(s);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
DEBUG((" out rdp_iso_connect error rdp_iso_recv_msg failed"));
|
||||
return 1;
|
||||
}
|
||||
if (code != ISO_PDU_CC)
|
||||
{
|
||||
free_stream(s);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
DEBUG((" out rdp_iso_connect error code != ISO_PDU_CC"));
|
||||
return 1;
|
||||
}
|
||||
free_stream(s);
|
||||
DEBUG((" out rdp_iso_connect"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
rdp_iso_disconnect(struct rdp_iso* self)
|
||||
{
|
||||
struct stream* s;
|
||||
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_iso_send_msg(self, s, ISO_PDU_DR);
|
||||
rdp_tcp_disconnect(self->tcp_layer);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
+285
-274
@@ -1,358 +1,369 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
|
||||
licence
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* licence
|
||||
*/
|
||||
|
||||
#include "rdp.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct rdp_lic* APP_CC
|
||||
rdp_lic_create(struct rdp_sec* owner)
|
||||
struct rdp_lic *APP_CC
|
||||
rdp_lic_create(struct rdp_sec *owner)
|
||||
{
|
||||
struct rdp_lic* self;
|
||||
struct rdp_lic *self;
|
||||
|
||||
self = (struct rdp_lic*)g_malloc(sizeof(struct rdp_lic), 1);
|
||||
self->sec_layer = owner;
|
||||
return self;
|
||||
self = (struct rdp_lic *)g_malloc(sizeof(struct rdp_lic), 1);
|
||||
self->sec_layer = owner;
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
rdp_lic_delete(struct rdp_lic* self)
|
||||
rdp_lic_delete(struct rdp_lic *self)
|
||||
{
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
g_free(self);
|
||||
if (self == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Generate a session key and RC4 keys, given client and server randoms */
|
||||
static void APP_CC
|
||||
rdp_lic_generate_keys(struct rdp_lic* self, char* client_random,
|
||||
char* server_random, char* pre_master_secret)
|
||||
rdp_lic_generate_keys(struct rdp_lic *self, char *client_random,
|
||||
char *server_random, char *pre_master_secret)
|
||||
{
|
||||
char master_secret[48];
|
||||
char key_block[48];
|
||||
char master_secret[48];
|
||||
char key_block[48];
|
||||
|
||||
/* Generate master secret and then key material */
|
||||
rdp_sec_hash_48(master_secret, pre_master_secret, client_random,
|
||||
server_random, 65);
|
||||
rdp_sec_hash_48(key_block, master_secret, server_random,
|
||||
client_random, 65);
|
||||
/* Store first 16 bytes of session key as MAC secret */
|
||||
g_memcpy(self->licence_sign_key, key_block, 16);
|
||||
/* Generate RC4 key from next 16 bytes */
|
||||
rdp_sec_hash_16(self->licence_key, key_block + 16, client_random,
|
||||
server_random);
|
||||
/* Generate master secret and then key material */
|
||||
rdp_sec_hash_48(master_secret, pre_master_secret, client_random,
|
||||
server_random, 65);
|
||||
rdp_sec_hash_48(key_block, master_secret, server_random,
|
||||
client_random, 65);
|
||||
/* Store first 16 bytes of session key as MAC secret */
|
||||
g_memcpy(self->licence_sign_key, key_block, 16);
|
||||
/* Generate RC4 key from next 16 bytes */
|
||||
rdp_sec_hash_16(self->licence_key, key_block + 16, client_random,
|
||||
server_random);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void APP_CC
|
||||
rdp_lic_generate_hwid(struct rdp_lic* self, char* hwid)
|
||||
rdp_lic_generate_hwid(struct rdp_lic *self, char *hwid)
|
||||
{
|
||||
rdp_sec_buf_out_uint32(hwid, 2);
|
||||
g_strncpy(hwid + 4, self->sec_layer->rdp_layer->mod->hostname,
|
||||
LICENCE_HWID_SIZE - 4);
|
||||
rdp_sec_buf_out_uint32(hwid, 2);
|
||||
g_strncpy(hwid + 4, self->sec_layer->rdp_layer->mod->hostname,
|
||||
LICENCE_HWID_SIZE - 4);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Present an existing licence to the server */
|
||||
static void APP_CC
|
||||
rdp_lic_present(struct rdp_lic* self, char* client_random, char* rsa_data,
|
||||
char* licence_data, int licence_size, char* hwid,
|
||||
char* signature)
|
||||
rdp_lic_present(struct rdp_lic *self, char *client_random, char *rsa_data,
|
||||
char *licence_data, int licence_size, char *hwid,
|
||||
char *signature)
|
||||
{
|
||||
int sec_flags;
|
||||
int length;
|
||||
struct stream* s;
|
||||
int sec_flags;
|
||||
int length;
|
||||
struct stream *s;
|
||||
|
||||
sec_flags = SEC_LICENCE_NEG;
|
||||
length = 16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE +
|
||||
licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE;
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_sec_init(self->sec_layer, s, sec_flags);
|
||||
out_uint8(s, LICENCE_TAG_PRESENT);
|
||||
out_uint8(s, 2); /* version */
|
||||
out_uint16_le(s, length);
|
||||
out_uint32_le(s, 1);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0x0201);
|
||||
out_uint8p(s, client_random, SEC_RANDOM_SIZE);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, (SEC_MODULUS_SIZE + SEC_PADDING_SIZE));
|
||||
out_uint8p(s, rsa_data, SEC_MODULUS_SIZE);
|
||||
out_uint8s(s, SEC_PADDING_SIZE);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, licence_size);
|
||||
out_uint8p(s, licence_data, licence_size);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, hwid, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE);
|
||||
s_mark_end(s);
|
||||
rdp_sec_send(self->sec_layer, s, sec_flags);
|
||||
free_stream(s);
|
||||
sec_flags = SEC_LICENCE_NEG;
|
||||
length = 16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE +
|
||||
licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE;
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_sec_init(self->sec_layer, s, sec_flags);
|
||||
out_uint8(s, LICENCE_TAG_PRESENT);
|
||||
out_uint8(s, 2); /* version */
|
||||
out_uint16_le(s, length);
|
||||
out_uint32_le(s, 1);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0x0201);
|
||||
out_uint8p(s, client_random, SEC_RANDOM_SIZE);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, (SEC_MODULUS_SIZE + SEC_PADDING_SIZE));
|
||||
out_uint8p(s, rsa_data, SEC_MODULUS_SIZE);
|
||||
out_uint8s(s, SEC_PADDING_SIZE);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, licence_size);
|
||||
out_uint8p(s, licence_data, licence_size);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, hwid, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE);
|
||||
s_mark_end(s);
|
||||
rdp_sec_send(self->sec_layer, s, sec_flags);
|
||||
free_stream(s);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Send a licence request packet */
|
||||
static void APP_CC
|
||||
rdp_lic_send_request(struct rdp_lic* self, char* client_random,
|
||||
char* rsa_data, char* user, char* host)
|
||||
rdp_lic_send_request(struct rdp_lic *self, char *client_random,
|
||||
char *rsa_data, char *user, char *host)
|
||||
{
|
||||
int sec_flags;
|
||||
int userlen;
|
||||
int hostlen;
|
||||
int length;
|
||||
struct stream* s;
|
||||
int sec_flags;
|
||||
int userlen;
|
||||
int hostlen;
|
||||
int length;
|
||||
struct stream *s;
|
||||
|
||||
sec_flags = SEC_LICENCE_NEG;
|
||||
userlen = g_strlen(user) + 1;
|
||||
hostlen = g_strlen(host) + 1;
|
||||
length = 128 + userlen + hostlen;
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_sec_init(self->sec_layer, s, sec_flags);
|
||||
out_uint8(s, LICENCE_TAG_REQUEST);
|
||||
out_uint8(s, 2); /* version */
|
||||
out_uint16_le(s, length);
|
||||
out_uint32_le(s, 1);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0xff01);
|
||||
out_uint8p(s, client_random, SEC_RANDOM_SIZE);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, (SEC_MODULUS_SIZE + SEC_PADDING_SIZE));
|
||||
out_uint8p(s, rsa_data, SEC_MODULUS_SIZE);
|
||||
out_uint8s(s, SEC_PADDING_SIZE);
|
||||
out_uint16_le(s, LICENCE_TAG_USER);
|
||||
out_uint16_le(s, userlen);
|
||||
out_uint8p(s, user, userlen);
|
||||
out_uint16_le(s, LICENCE_TAG_HOST);
|
||||
out_uint16_le(s, hostlen);
|
||||
out_uint8p(s, host, hostlen);
|
||||
s_mark_end(s);
|
||||
rdp_sec_send(self->sec_layer, s, sec_flags);
|
||||
free_stream(s);
|
||||
sec_flags = SEC_LICENCE_NEG;
|
||||
userlen = g_strlen(user) + 1;
|
||||
hostlen = g_strlen(host) + 1;
|
||||
length = 128 + userlen + hostlen;
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_sec_init(self->sec_layer, s, sec_flags);
|
||||
out_uint8(s, LICENCE_TAG_REQUEST);
|
||||
out_uint8(s, 2); /* version */
|
||||
out_uint16_le(s, length);
|
||||
out_uint32_le(s, 1);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, 0xff01);
|
||||
out_uint8p(s, client_random, SEC_RANDOM_SIZE);
|
||||
out_uint16_le(s, 0);
|
||||
out_uint16_le(s, (SEC_MODULUS_SIZE + SEC_PADDING_SIZE));
|
||||
out_uint8p(s, rsa_data, SEC_MODULUS_SIZE);
|
||||
out_uint8s(s, SEC_PADDING_SIZE);
|
||||
out_uint16_le(s, LICENCE_TAG_USER);
|
||||
out_uint16_le(s, userlen);
|
||||
out_uint8p(s, user, userlen);
|
||||
out_uint16_le(s, LICENCE_TAG_HOST);
|
||||
out_uint16_le(s, hostlen);
|
||||
out_uint8p(s, host, hostlen);
|
||||
s_mark_end(s);
|
||||
rdp_sec_send(self->sec_layer, s, sec_flags);
|
||||
free_stream(s);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Process a licence demand packet */
|
||||
static void APP_CC
|
||||
rdp_lic_process_demand(struct rdp_lic* self, struct stream* s)
|
||||
rdp_lic_process_demand(struct rdp_lic *self, struct stream *s)
|
||||
{
|
||||
char null_data[SEC_MODULUS_SIZE];
|
||||
char* server_random;
|
||||
char signature[LICENCE_SIGNATURE_SIZE];
|
||||
char hwid[LICENCE_HWID_SIZE];
|
||||
char* licence_data;
|
||||
int licence_size;
|
||||
void* crypt_key;
|
||||
char null_data[SEC_MODULUS_SIZE];
|
||||
char *server_random;
|
||||
char signature[LICENCE_SIGNATURE_SIZE];
|
||||
char hwid[LICENCE_HWID_SIZE];
|
||||
char *licence_data;
|
||||
int licence_size;
|
||||
void *crypt_key;
|
||||
|
||||
licence_data = 0;
|
||||
/* Retrieve the server random from the incoming packet */
|
||||
in_uint8p(s, server_random, SEC_RANDOM_SIZE);
|
||||
/* We currently use null client keys. This is a bit naughty but, hey,
|
||||
the security of licence negotiation isn't exactly paramount. */
|
||||
g_memset(null_data, 0, sizeof(null_data));
|
||||
rdp_lic_generate_keys(self, null_data, server_random, null_data);
|
||||
licence_size = 0; /* todo load_licence(&licence_data); */
|
||||
if (licence_size > 0)
|
||||
{
|
||||
/* Generate a signature for the HWID buffer */
|
||||
rdp_lic_generate_hwid(self, hwid);
|
||||
rdp_sec_sign(signature, 16, self->licence_sign_key, 16,
|
||||
hwid, sizeof(hwid));
|
||||
/* Now encrypt the HWID */
|
||||
crypt_key = ssl_rc4_info_create();
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
ssl_rc4_crypt(crypt_key, hwid, sizeof(hwid));
|
||||
ssl_rc4_info_delete(crypt_key);
|
||||
rdp_lic_present(self, null_data, null_data, licence_data,
|
||||
licence_size, hwid, signature);
|
||||
g_free(licence_data);
|
||||
return;
|
||||
}
|
||||
rdp_lic_send_request(self, null_data, null_data,
|
||||
self->sec_layer->rdp_layer->mod->username,
|
||||
self->sec_layer->rdp_layer->mod->hostname);
|
||||
licence_data = 0;
|
||||
/* Retrieve the server random from the incoming packet */
|
||||
in_uint8p(s, server_random, SEC_RANDOM_SIZE);
|
||||
/* We currently use null client keys. This is a bit naughty but, hey,
|
||||
the security of licence negotiation isn't exactly paramount. */
|
||||
g_memset(null_data, 0, sizeof(null_data));
|
||||
rdp_lic_generate_keys(self, null_data, server_random, null_data);
|
||||
licence_size = 0; /* todo load_licence(&licence_data); */
|
||||
|
||||
if (licence_size > 0)
|
||||
{
|
||||
/* Generate a signature for the HWID buffer */
|
||||
rdp_lic_generate_hwid(self, hwid);
|
||||
rdp_sec_sign(signature, 16, self->licence_sign_key, 16,
|
||||
hwid, sizeof(hwid));
|
||||
/* Now encrypt the HWID */
|
||||
crypt_key = ssl_rc4_info_create();
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
ssl_rc4_crypt(crypt_key, hwid, sizeof(hwid));
|
||||
ssl_rc4_info_delete(crypt_key);
|
||||
rdp_lic_present(self, null_data, null_data, licence_data,
|
||||
licence_size, hwid, signature);
|
||||
g_free(licence_data);
|
||||
return;
|
||||
}
|
||||
|
||||
rdp_lic_send_request(self, null_data, null_data,
|
||||
self->sec_layer->rdp_layer->mod->username,
|
||||
self->sec_layer->rdp_layer->mod->hostname);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Send an authentication response packet */
|
||||
static void APP_CC
|
||||
rdp_lic_send_authresp(struct rdp_lic* self, char* token, char* crypt_hwid,
|
||||
char* signature)
|
||||
rdp_lic_send_authresp(struct rdp_lic *self, char *token, char *crypt_hwid,
|
||||
char *signature)
|
||||
{
|
||||
int sec_flags;
|
||||
int length;
|
||||
struct stream* s;
|
||||
int sec_flags;
|
||||
int length;
|
||||
struct stream *s;
|
||||
|
||||
sec_flags = SEC_LICENCE_NEG;
|
||||
length = 58;
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_sec_init(self->sec_layer, s, sec_flags);
|
||||
out_uint8(s, LICENCE_TAG_AUTHRESP);
|
||||
out_uint8(s, 2); /* version */
|
||||
out_uint16_le(s, length);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, LICENCE_TOKEN_SIZE);
|
||||
out_uint8p(s, token, LICENCE_TOKEN_SIZE);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, crypt_hwid, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE);
|
||||
s_mark_end(s);
|
||||
rdp_sec_send(self->sec_layer, s, sec_flags);
|
||||
free_stream(s);
|
||||
sec_flags = SEC_LICENCE_NEG;
|
||||
length = 58;
|
||||
make_stream(s);
|
||||
init_stream(s, 8192);
|
||||
rdp_sec_init(self->sec_layer, s, sec_flags);
|
||||
out_uint8(s, LICENCE_TAG_AUTHRESP);
|
||||
out_uint8(s, 2); /* version */
|
||||
out_uint16_le(s, length);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, LICENCE_TOKEN_SIZE);
|
||||
out_uint8p(s, token, LICENCE_TOKEN_SIZE);
|
||||
out_uint16_le(s, 1);
|
||||
out_uint16_le(s, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, crypt_hwid, LICENCE_HWID_SIZE);
|
||||
out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE);
|
||||
s_mark_end(s);
|
||||
rdp_sec_send(self->sec_layer, s, sec_flags);
|
||||
free_stream(s);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Parse an authentication request packet */
|
||||
/* returns boolean */
|
||||
static int APP_CC
|
||||
rdp_lic_parse_authreq(struct rdp_lic* self, struct stream* s,
|
||||
char** token, char** signature)
|
||||
rdp_lic_parse_authreq(struct rdp_lic *self, struct stream *s,
|
||||
char **token, char **signature)
|
||||
{
|
||||
int tokenlen;
|
||||
int tokenlen;
|
||||
|
||||
in_uint8s(s, 6); /* unknown: f8 3d 15 00 04 f6 */
|
||||
in_uint16_le(s, tokenlen);
|
||||
if (tokenlen != LICENCE_TOKEN_SIZE)
|
||||
{
|
||||
/* error("token len %d\n", tokenlen); */
|
||||
return 0;
|
||||
}
|
||||
in_uint8p(s, *token, tokenlen);
|
||||
in_uint8p(s, *signature, LICENCE_SIGNATURE_SIZE);
|
||||
return s_check_end(s);
|
||||
in_uint8s(s, 6); /* unknown: f8 3d 15 00 04 f6 */
|
||||
in_uint16_le(s, tokenlen);
|
||||
|
||||
if (tokenlen != LICENCE_TOKEN_SIZE)
|
||||
{
|
||||
/* error("token len %d\n", tokenlen); */
|
||||
return 0;
|
||||
}
|
||||
|
||||
in_uint8p(s, *token, tokenlen);
|
||||
in_uint8p(s, *signature, LICENCE_SIGNATURE_SIZE);
|
||||
return s_check_end(s);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Process an authentication request packet */
|
||||
static void APP_CC
|
||||
rdp_lic_process_authreq(struct rdp_lic* self, struct stream* s)
|
||||
rdp_lic_process_authreq(struct rdp_lic *self, struct stream *s)
|
||||
{
|
||||
char* in_token;
|
||||
char* in_sig;
|
||||
char out_token[LICENCE_TOKEN_SIZE];
|
||||
char decrypt_token[LICENCE_TOKEN_SIZE];
|
||||
char hwid[LICENCE_HWID_SIZE];
|
||||
char crypt_hwid[LICENCE_HWID_SIZE];
|
||||
char sealed_buffer[LICENCE_TOKEN_SIZE + LICENCE_HWID_SIZE];
|
||||
char out_sig[LICENCE_SIGNATURE_SIZE];
|
||||
void* crypt_key;
|
||||
char *in_token;
|
||||
char *in_sig;
|
||||
char out_token[LICENCE_TOKEN_SIZE];
|
||||
char decrypt_token[LICENCE_TOKEN_SIZE];
|
||||
char hwid[LICENCE_HWID_SIZE];
|
||||
char crypt_hwid[LICENCE_HWID_SIZE];
|
||||
char sealed_buffer[LICENCE_TOKEN_SIZE + LICENCE_HWID_SIZE];
|
||||
char out_sig[LICENCE_SIGNATURE_SIZE];
|
||||
void *crypt_key;
|
||||
|
||||
in_token = 0;
|
||||
in_sig = 0;
|
||||
/* Parse incoming packet and save the encrypted token */
|
||||
rdp_lic_parse_authreq(self, s, &in_token, &in_sig);
|
||||
g_memcpy(out_token, in_token, LICENCE_TOKEN_SIZE);
|
||||
/* Decrypt the token. It should read TEST in Unicode. */
|
||||
crypt_key = ssl_rc4_info_create();
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
g_memcpy(decrypt_token, in_token, LICENCE_TOKEN_SIZE);
|
||||
ssl_rc4_crypt(crypt_key, decrypt_token, LICENCE_TOKEN_SIZE);
|
||||
/* Generate a signature for a buffer of token and HWID */
|
||||
rdp_lic_generate_hwid(self, hwid);
|
||||
g_memcpy(sealed_buffer, decrypt_token, LICENCE_TOKEN_SIZE);
|
||||
g_memcpy(sealed_buffer + LICENCE_TOKEN_SIZE, hwid, LICENCE_HWID_SIZE);
|
||||
rdp_sec_sign(out_sig, 16, self->licence_sign_key, 16, sealed_buffer,
|
||||
sizeof(sealed_buffer));
|
||||
/* Now encrypt the HWID */
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
g_memcpy(crypt_hwid, hwid, LICENCE_HWID_SIZE);
|
||||
ssl_rc4_crypt(crypt_key, crypt_hwid, LICENCE_HWID_SIZE);
|
||||
rdp_lic_send_authresp(self, out_token, crypt_hwid, out_sig);
|
||||
ssl_rc4_info_delete(crypt_key);
|
||||
in_token = 0;
|
||||
in_sig = 0;
|
||||
/* Parse incoming packet and save the encrypted token */
|
||||
rdp_lic_parse_authreq(self, s, &in_token, &in_sig);
|
||||
g_memcpy(out_token, in_token, LICENCE_TOKEN_SIZE);
|
||||
/* Decrypt the token. It should read TEST in Unicode. */
|
||||
crypt_key = ssl_rc4_info_create();
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
g_memcpy(decrypt_token, in_token, LICENCE_TOKEN_SIZE);
|
||||
ssl_rc4_crypt(crypt_key, decrypt_token, LICENCE_TOKEN_SIZE);
|
||||
/* Generate a signature for a buffer of token and HWID */
|
||||
rdp_lic_generate_hwid(self, hwid);
|
||||
g_memcpy(sealed_buffer, decrypt_token, LICENCE_TOKEN_SIZE);
|
||||
g_memcpy(sealed_buffer + LICENCE_TOKEN_SIZE, hwid, LICENCE_HWID_SIZE);
|
||||
rdp_sec_sign(out_sig, 16, self->licence_sign_key, 16, sealed_buffer,
|
||||
sizeof(sealed_buffer));
|
||||
/* Now encrypt the HWID */
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
g_memcpy(crypt_hwid, hwid, LICENCE_HWID_SIZE);
|
||||
ssl_rc4_crypt(crypt_key, crypt_hwid, LICENCE_HWID_SIZE);
|
||||
rdp_lic_send_authresp(self, out_token, crypt_hwid, out_sig);
|
||||
ssl_rc4_info_delete(crypt_key);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Process an licence issue packet */
|
||||
static void APP_CC
|
||||
rdp_lic_process_issue(struct rdp_lic* self, struct stream* s)
|
||||
rdp_lic_process_issue(struct rdp_lic *self, struct stream *s)
|
||||
{
|
||||
void* crypt_key;
|
||||
int length;
|
||||
int check;
|
||||
int i;
|
||||
void *crypt_key;
|
||||
int length;
|
||||
int check;
|
||||
int i;
|
||||
|
||||
in_uint8s(s, 2); /* 3d 45 - unknown */
|
||||
in_uint16_le(s, length);
|
||||
|
||||
in_uint8s(s, 2); /* 3d 45 - unknown */
|
||||
in_uint16_le(s, length);
|
||||
if (!s_check_rem(s, length))
|
||||
{
|
||||
return;
|
||||
}
|
||||
crypt_key = ssl_rc4_info_create();
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
ssl_rc4_crypt(crypt_key, s->p, length);
|
||||
ssl_rc4_info_delete(crypt_key);
|
||||
in_uint16_le(s, check);
|
||||
if (check != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
self->licence_issued = 1;
|
||||
in_uint8s(s, 2); /* pad */
|
||||
/* advance to fourth string */
|
||||
length = 0;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
in_uint8s(s, length);
|
||||
in_uint32_le(s, length);
|
||||
if (!s_check_rem(s, length))
|
||||
{
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* todo save_licence(s->p, length); */
|
||||
|
||||
crypt_key = ssl_rc4_info_create();
|
||||
ssl_rc4_set_key(crypt_key, self->licence_key, 16);
|
||||
ssl_rc4_crypt(crypt_key, s->p, length);
|
||||
ssl_rc4_info_delete(crypt_key);
|
||||
in_uint16_le(s, check);
|
||||
|
||||
if (check != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
self->licence_issued = 1;
|
||||
in_uint8s(s, 2); /* pad */
|
||||
/* advance to fourth string */
|
||||
length = 0;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
in_uint8s(s, length);
|
||||
in_uint32_le(s, length);
|
||||
|
||||
if (!s_check_rem(s, length))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* todo save_licence(s->p, length); */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* Process a licence packet */
|
||||
void APP_CC
|
||||
rdp_lic_process(struct rdp_lic* self, struct stream* s)
|
||||
rdp_lic_process(struct rdp_lic *self, struct stream *s)
|
||||
{
|
||||
int tag;
|
||||
int tag;
|
||||
|
||||
in_uint8(s, tag);
|
||||
in_uint8s(s, 3); /* version, length */
|
||||
switch (tag)
|
||||
{
|
||||
case LICENCE_TAG_DEMAND:
|
||||
rdp_lic_process_demand(self, s);
|
||||
break;
|
||||
case LICENCE_TAG_AUTHREQ:
|
||||
rdp_lic_process_authreq(self, s);
|
||||
break;
|
||||
case LICENCE_TAG_ISSUE:
|
||||
rdp_lic_process_issue(self, s);
|
||||
break;
|
||||
case LICENCE_TAG_REISSUE:
|
||||
case LICENCE_TAG_RESULT:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
/* todo unimpl("licence tag 0x%x\n", tag); */
|
||||
}
|
||||
in_uint8(s, tag);
|
||||
in_uint8s(s, 3); /* version, length */
|
||||
|
||||
switch (tag)
|
||||
{
|
||||
case LICENCE_TAG_DEMAND:
|
||||
rdp_lic_process_demand(self, s);
|
||||
break;
|
||||
case LICENCE_TAG_AUTHREQ:
|
||||
rdp_lic_process_authreq(self, s);
|
||||
break;
|
||||
case LICENCE_TAG_ISSUE:
|
||||
rdp_lic_process_issue(self, s);
|
||||
break;
|
||||
case LICENCE_TAG_REISSUE:
|
||||
case LICENCE_TAG_RESULT:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
/* todo unimpl("licence tag 0x%x\n", tag); */
|
||||
}
|
||||
}
|
||||
|
||||
+593
-527
File diff suppressed because it is too large
Load Diff
+1454
-1294
File diff suppressed because it is too large
Load Diff
+904
-826
File diff suppressed because it is too large
Load Diff
+562
-504
File diff suppressed because it is too large
Load Diff
+146
-136
@@ -1,178 +1,188 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
|
||||
librdp tcp layer
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* librdp tcp layer
|
||||
*/
|
||||
|
||||
#include "rdp.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct rdp_tcp* APP_CC
|
||||
rdp_tcp_create(struct rdp_iso* owner)
|
||||
struct rdp_tcp *APP_CC
|
||||
rdp_tcp_create(struct rdp_iso *owner)
|
||||
{
|
||||
struct rdp_tcp* self;
|
||||
struct rdp_tcp *self;
|
||||
|
||||
self = (struct rdp_tcp*)g_malloc(sizeof(struct rdp_tcp), 1);
|
||||
self->iso_layer = owner;
|
||||
return self;
|
||||
self = (struct rdp_tcp *)g_malloc(sizeof(struct rdp_tcp), 1);
|
||||
self->iso_layer = owner;
|
||||
return self;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void APP_CC
|
||||
rdp_tcp_delete(struct rdp_tcp* self)
|
||||
rdp_tcp_delete(struct rdp_tcp *self)
|
||||
{
|
||||
g_free(self);
|
||||
g_free(self);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* get out stream ready for data */
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_init(struct rdp_tcp* self, struct stream* s)
|
||||
rdp_tcp_init(struct rdp_tcp *self, struct stream *s)
|
||||
{
|
||||
init_stream(s, 8192);
|
||||
return 0;
|
||||
init_stream(s, 8192);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_recv(struct rdp_tcp* self, struct stream* s, int len)
|
||||
rdp_tcp_recv(struct rdp_tcp *self, struct stream *s, int len)
|
||||
{
|
||||
int rcvd;
|
||||
int rcvd;
|
||||
|
||||
DEBUG((" in rdp_tcp_recv gota get %d bytes on sck %d",
|
||||
len, self->sck));
|
||||
if (self->sck_closed)
|
||||
{
|
||||
DEBUG((" out rdp_tcp_recv error sck closed"));
|
||||
return 1;
|
||||
}
|
||||
init_stream(s, len);
|
||||
while (len > 0)
|
||||
{
|
||||
rcvd = g_tcp_recv(self->sck, s->end, len, 0);
|
||||
if (rcvd == -1)
|
||||
DEBUG((" in rdp_tcp_recv gota get %d bytes on sck %d",
|
||||
len, self->sck));
|
||||
|
||||
if (self->sck_closed)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
g_tcp_can_recv(self->sck, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_recv error unknown"));
|
||||
DEBUG((" out rdp_tcp_recv error sck closed"));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (rcvd == 0)
|
||||
|
||||
init_stream(s, len);
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_recv error connection dropped"));
|
||||
return 1;
|
||||
rcvd = g_tcp_recv(self->sck, s->end, len, 0);
|
||||
|
||||
if (rcvd == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
g_tcp_can_recv(self->sck, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_recv error unknown"));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (rcvd == 0)
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_recv error connection dropped"));
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
s->end += rcvd;
|
||||
len -= rcvd;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_send(struct rdp_tcp *self, struct stream *s)
|
||||
{
|
||||
int len;
|
||||
int total;
|
||||
int sent;
|
||||
|
||||
if (self->sck_closed)
|
||||
{
|
||||
DEBUG((" out rdp_tcp_send error sck closed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
len = s->end - s->data;
|
||||
DEBUG((" in rdp_tcp_send gota send %d bytes on sck %d", len,
|
||||
self->sck));
|
||||
total = 0;
|
||||
|
||||
while (total < len)
|
||||
{
|
||||
sent = g_tcp_send(self->sck, s->data + total, len - total, 0);
|
||||
|
||||
if (sent == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
g_tcp_can_send(self->sck, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_send error unknown"));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (sent == 0)
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_send error connection dropped"));
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
total = total + sent;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_connect(struct rdp_tcp *self, char *ip, char *port)
|
||||
{
|
||||
DEBUG((" in rdp_tcp_connect ip %s port %s", ip, port));
|
||||
self->sck = g_tcp_socket();
|
||||
|
||||
if (g_tcp_connect(self->sck, ip, port) == 0)
|
||||
{
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
}
|
||||
else
|
||||
{
|
||||
s->end += rcvd;
|
||||
len -= rcvd;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_send(struct rdp_tcp* self, struct stream* s)
|
||||
{
|
||||
int len;
|
||||
int total;
|
||||
int sent;
|
||||
|
||||
if (self->sck_closed)
|
||||
{
|
||||
DEBUG((" out rdp_tcp_send error sck closed"));
|
||||
return 1;
|
||||
}
|
||||
len = s->end - s->data;
|
||||
DEBUG((" in rdp_tcp_send gota send %d bytes on sck %d", len,
|
||||
self->sck));
|
||||
total = 0;
|
||||
while (total < len)
|
||||
{
|
||||
sent = g_tcp_send(self->sck, s->data + total, len - total, 0);
|
||||
if (sent == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(self->sck))
|
||||
{
|
||||
g_tcp_can_send(self->sck, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_send error unknown"));
|
||||
DEBUG((" out rdp_tcp_connect error g_tcp_connect failed"));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (sent == 0)
|
||||
{
|
||||
self->sck_closed = 1;
|
||||
DEBUG((" out rdp_tcp_send error connection dropped"));
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
total = total + sent;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
DEBUG((" out rdp_tcp_connect"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_connect(struct rdp_tcp* self, char* ip, char* port)
|
||||
rdp_tcp_disconnect(struct rdp_tcp *self)
|
||||
{
|
||||
DEBUG((" in rdp_tcp_connect ip %s port %s", ip, port));
|
||||
self->sck = g_tcp_socket();
|
||||
if (g_tcp_connect(self->sck, ip, port) == 0)
|
||||
{
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG((" out rdp_tcp_connect error g_tcp_connect failed"));
|
||||
return 1;
|
||||
}
|
||||
DEBUG((" out rdp_tcp_connect"));
|
||||
return 0;
|
||||
}
|
||||
if (self->sck != 0)
|
||||
{
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error */
|
||||
int APP_CC
|
||||
rdp_tcp_disconnect(struct rdp_tcp* self)
|
||||
{
|
||||
if (self->sck != 0)
|
||||
{
|
||||
g_tcp_close(self->sck);
|
||||
}
|
||||
self->sck = 0;
|
||||
return 0;
|
||||
self->sck = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1
-1
@@ -35,4 +35,4 @@ make install
|
||||
|
||||
see file-loc.txt to see what files are installed where
|
||||
|
||||
Jay
|
||||
Jay Sorg
|
||||
|
||||
+102
-103
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -27,102 +26,102 @@
|
||||
|
||||
#include "sesman.h"
|
||||
|
||||
extern struct config_sesman* g_cfg; /* in sesman.c */
|
||||
extern struct config_sesman *g_cfg; /* in sesman.c */
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
access_login_allowed(char* user)
|
||||
access_login_allowed(char *user)
|
||||
{
|
||||
int gid;
|
||||
int ok;
|
||||
int gid;
|
||||
int ok;
|
||||
|
||||
if ((0 == g_strncmp(user, "root", 5)) && (0 == g_cfg->sec.allow_root))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING,
|
||||
"ROOT login attempted, but root login is disabled");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 == g_cfg->sec.ts_users_enable)
|
||||
{
|
||||
LOG_DBG("Terminal Server Users group is disabled, allowing authentication",
|
||||
1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_getuser_info(user, &gid, 0, 0, 0, 0))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "Cannot read user info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_cfg->sec.ts_users == gid)
|
||||
{
|
||||
LOG_DBG("ts_users is user's primary group");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_check_user_in_group(user, g_cfg->sec.ts_users, &ok))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "Cannot read group info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ok)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "login denied for user %s", user);
|
||||
|
||||
if ((0 == g_strncmp(user, "root", 5)) && (0 == g_cfg->sec.allow_root))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING,
|
||||
"ROOT login attempted, but root login is disabled");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 == g_cfg->sec.ts_users_enable)
|
||||
{
|
||||
LOG_DBG("Terminal Server Users group is disabled, allowing authentication",
|
||||
1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_getuser_info(user, &gid, 0, 0, 0, 0))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "Cannot read user info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_cfg->sec.ts_users == gid)
|
||||
{
|
||||
LOG_DBG("ts_users is user's primary group");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_check_user_in_group(user, g_cfg->sec.ts_users, &ok))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "Cannot read group info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ok)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "login denied for user %s", user);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
access_login_mng_allowed(char* user)
|
||||
access_login_mng_allowed(char *user)
|
||||
{
|
||||
int gid;
|
||||
int ok;
|
||||
int gid;
|
||||
int ok;
|
||||
|
||||
if ((0 == g_strncmp(user, "root", 5)) && (0 == g_cfg->sec.allow_root))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING,
|
||||
"[MNG] ROOT login attempted, but root login is disabled");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 == g_cfg->sec.ts_admins_enable)
|
||||
{
|
||||
LOG_DBG("[MNG] Terminal Server Admin group is disabled,"
|
||||
"allowing authentication", 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_getuser_info(user, &gid, 0, 0, 0, 0))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "[MNG] Cannot read user info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_cfg->sec.ts_admins == gid)
|
||||
{
|
||||
LOG_DBG("[MNG] ts_users is user's primary group");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_check_user_in_group(user, g_cfg->sec.ts_admins, &ok))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "[MNG] Cannot read group info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ok)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "[MNG] login denied for user %s", user);
|
||||
|
||||
if ((0 == g_strncmp(user, "root", 5)) && (0 == g_cfg->sec.allow_root))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING,
|
||||
"[MNG] ROOT login attempted, but root login is disabled");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (0 == g_cfg->sec.ts_admins_enable)
|
||||
{
|
||||
LOG_DBG("[MNG] Terminal Server Admin group is disabled,"
|
||||
"allowing authentication",1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_getuser_info(user, &gid, 0, 0, 0, 0))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "[MNG] Cannot read user info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_cfg->sec.ts_admins == gid)
|
||||
{
|
||||
LOG_DBG("[MNG] ts_users is user's primary group");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != g_check_user_in_group(user, g_cfg->sec.ts_admins, &ok))
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "[MNG] Cannot read group info! - login denied");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ok)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "[MNG] login denied for user %s", user);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+17
-18
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+17
-18
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+915
-807
File diff suppressed because it is too large
Load Diff
+1113
-994
File diff suppressed because it is too large
Load Diff
@@ -26,34 +26,34 @@ extern int g_rdpdr_chan_id; /* in chansrv.c */
|
||||
int APP_CC
|
||||
dev_redir_init(void)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
dev_redir_deinit(void)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
dev_redir_data_in(struct stream* s, int chan_id, int chan_flags, int length,
|
||||
dev_redir_data_in(struct stream *s, int chan_id, int chan_flags, int length,
|
||||
int total_length)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
dev_redir_get_wait_objs(tbus* objs, int* count, int* timeout)
|
||||
dev_redir_get_wait_objs(tbus *objs, int *count, int *timeout)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
dev_redir_check_wait_objs(void)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
+439
-415
File diff suppressed because it is too large
Load Diff
+399
-369
@@ -28,100 +28,100 @@ static int g_training_sent_time = 0;
|
||||
static int g_cBlockNo = 0;
|
||||
|
||||
#if defined(XRDP_SIMPLESOUND)
|
||||
static void* DEFAULT_CC
|
||||
read_raw_audio_data(void* arg);
|
||||
static void *DEFAULT_CC
|
||||
read_raw_audio_data(void *arg);
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
sound_send_server_formats(void)
|
||||
{
|
||||
struct stream* s;
|
||||
int bytes;
|
||||
char* size_ptr;
|
||||
struct stream *s;
|
||||
int bytes;
|
||||
char *size_ptr;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
make_stream(s);
|
||||
init_stream(s, 8182);
|
||||
out_uint16_le(s, SNDC_FORMATS);
|
||||
size_ptr = s->p;
|
||||
out_uint16_le(s, 0); /* size, set later */
|
||||
out_uint32_le(s, 0); /* dwFlags */
|
||||
out_uint32_le(s, 0); /* dwVolume */
|
||||
out_uint32_le(s, 0); /* dwPitch */
|
||||
out_uint16_le(s, 0); /* wDGramPort */
|
||||
out_uint16_le(s, 1); /* wNumberOfFormats */
|
||||
out_uint8(s, g_cBlockNo); /* cLastBlockConfirmed */
|
||||
out_uint16_le(s, 2); /* wVersion */
|
||||
out_uint8(s, 0); /* bPad */
|
||||
make_stream(s);
|
||||
init_stream(s, 8182);
|
||||
out_uint16_le(s, SNDC_FORMATS);
|
||||
size_ptr = s->p;
|
||||
out_uint16_le(s, 0); /* size, set later */
|
||||
out_uint32_le(s, 0); /* dwFlags */
|
||||
out_uint32_le(s, 0); /* dwVolume */
|
||||
out_uint32_le(s, 0); /* dwPitch */
|
||||
out_uint16_le(s, 0); /* wDGramPort */
|
||||
out_uint16_le(s, 1); /* wNumberOfFormats */
|
||||
out_uint8(s, g_cBlockNo); /* cLastBlockConfirmed */
|
||||
out_uint16_le(s, 2); /* wVersion */
|
||||
out_uint8(s, 0); /* bPad */
|
||||
|
||||
/* sndFormats */
|
||||
/*
|
||||
wFormatTag 2 byte offset 0
|
||||
nChannels 2 byte offset 2
|
||||
nSamplesPerSec 4 byte offset 4
|
||||
nAvgBytesPerSec 4 byte offset 8
|
||||
nBlockAlign 2 byte offset 12
|
||||
wBitsPerSample 2 byte offset 14
|
||||
cbSize 2 byte offset 16
|
||||
data variable offset 18
|
||||
*/
|
||||
/* sndFormats */
|
||||
/*
|
||||
wFormatTag 2 byte offset 0
|
||||
nChannels 2 byte offset 2
|
||||
nSamplesPerSec 4 byte offset 4
|
||||
nAvgBytesPerSec 4 byte offset 8
|
||||
nBlockAlign 2 byte offset 12
|
||||
wBitsPerSample 2 byte offset 14
|
||||
cbSize 2 byte offset 16
|
||||
data variable offset 18
|
||||
*/
|
||||
|
||||
/* examples
|
||||
01 00 02 00 44 ac 00 00 10 b1 02 00 04 00 10 00 ....D...........
|
||||
00 00
|
||||
01 00 02 00 22 56 00 00 88 58 01 00 04 00 10 00 ...."V...X......
|
||||
00 00
|
||||
*/
|
||||
/* examples
|
||||
01 00 02 00 44 ac 00 00 10 b1 02 00 04 00 10 00 ....D...........
|
||||
00 00
|
||||
01 00 02 00 22 56 00 00 88 58 01 00 04 00 10 00 ...."V...X......
|
||||
00 00
|
||||
*/
|
||||
|
||||
out_uint16_le(s, 1); // wFormatTag - WAVE_FORMAT_PCM
|
||||
out_uint16_le(s, 2); // num of channels
|
||||
out_uint32_le(s, 44100); // samples per sec
|
||||
out_uint32_le(s, 176400); // avg bytes per sec
|
||||
out_uint16_le(s, 4); // block align
|
||||
out_uint16_le(s, 16); // bits per sample
|
||||
out_uint16_le(s, 0); // size
|
||||
out_uint16_le(s, 1); // wFormatTag - WAVE_FORMAT_PCM
|
||||
out_uint16_le(s, 2); // num of channels
|
||||
out_uint32_le(s, 44100); // samples per sec
|
||||
out_uint32_le(s, 176400); // avg bytes per sec
|
||||
out_uint16_le(s, 4); // block align
|
||||
out_uint16_le(s, 16); // bits per sample
|
||||
out_uint16_le(s, 0); // size
|
||||
|
||||
s_mark_end(s);
|
||||
bytes = (int)((s->end - s->data) - 4);
|
||||
size_ptr[0] = bytes;
|
||||
size_ptr[1] = bytes >> 8;
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
s_mark_end(s);
|
||||
bytes = (int)((s->end - s->data) - 4);
|
||||
size_ptr[0] = bytes;
|
||||
size_ptr[1] = bytes >> 8;
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
sound_send_training(void)
|
||||
{
|
||||
struct stream* s;
|
||||
int bytes;
|
||||
int time;
|
||||
char* size_ptr;
|
||||
struct stream *s;
|
||||
int bytes;
|
||||
int time;
|
||||
char *size_ptr;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
make_stream(s);
|
||||
init_stream(s, 8182);
|
||||
out_uint16_le(s, SNDC_TRAINING);
|
||||
size_ptr = s->p;
|
||||
out_uint16_le(s, 0); /* size, set later */
|
||||
time = g_time2();
|
||||
g_training_sent_time = time;
|
||||
out_uint16_le(s, time);
|
||||
out_uint16_le(s, 1024);
|
||||
out_uint8s(s, (1024 - 4));
|
||||
s_mark_end(s);
|
||||
bytes = (int)((s->end - s->data) - 4);
|
||||
size_ptr[0] = bytes;
|
||||
size_ptr[1] = bytes >> 8;
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
make_stream(s);
|
||||
init_stream(s, 8182);
|
||||
out_uint16_le(s, SNDC_TRAINING);
|
||||
size_ptr = s->p;
|
||||
out_uint16_le(s, 0); /* size, set later */
|
||||
time = g_time2();
|
||||
g_training_sent_time = time;
|
||||
out_uint16_le(s, time);
|
||||
out_uint16_le(s, 1024);
|
||||
out_uint8s(s, (1024 - 4));
|
||||
s_mark_end(s);
|
||||
bytes = (int)((s->end - s->data) - 4);
|
||||
size_ptr[0] = bytes;
|
||||
size_ptr[1] = bytes >> 8;
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -132,318 +132,339 @@ sound_send_training(void)
|
||||
*/
|
||||
|
||||
static int APP_CC
|
||||
sound_process_formats(struct stream* s, int size)
|
||||
sound_process_formats(struct stream *s, int size)
|
||||
{
|
||||
int num_formats;
|
||||
int num_formats;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
LOG(0, ("sound_process_formats:"));
|
||||
if (size < 16)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
in_uint8s(s, 14);
|
||||
in_uint16_le(s, num_formats);
|
||||
if (num_formats > 0)
|
||||
{
|
||||
sound_send_training();
|
||||
}
|
||||
return 0;
|
||||
LOG(0, ("sound_process_formats:"));
|
||||
|
||||
if (size < 16)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
in_uint8s(s, 14);
|
||||
in_uint16_le(s, num_formats);
|
||||
|
||||
if (num_formats > 0)
|
||||
{
|
||||
sound_send_training();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
sound_send_wave_data(char* data, int data_bytes)
|
||||
sound_send_wave_data(char *data, int data_bytes)
|
||||
{
|
||||
struct stream* s;
|
||||
int bytes;
|
||||
int time;
|
||||
char* size_ptr;
|
||||
struct stream *s;
|
||||
int bytes;
|
||||
int time;
|
||||
char *size_ptr;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
if ((data_bytes < 4) || (data_bytes > 32 * 1024))
|
||||
{
|
||||
LOG(0, ("sound_send_wave_data: bad data_bytes %d", data_bytes));
|
||||
}
|
||||
if ((data_bytes < 4) || (data_bytes > 32 * 1024))
|
||||
{
|
||||
LOG(0, ("sound_send_wave_data: bad data_bytes %d", data_bytes));
|
||||
}
|
||||
|
||||
/* part one of 2 PDU wave info */
|
||||
/* part one of 2 PDU wave info */
|
||||
|
||||
LOG(10, ("sound_send_wave_data: sending %d bytes", data_bytes));
|
||||
LOG(10, ("sound_send_wave_data: sending %d bytes", data_bytes));
|
||||
|
||||
make_stream(s);
|
||||
init_stream(s, data_bytes);
|
||||
out_uint16_le(s, SNDC_WAVE);
|
||||
size_ptr = s->p;
|
||||
out_uint16_le(s, 0); /* size, set later */
|
||||
time = g_time2();
|
||||
out_uint16_le(s, time);
|
||||
out_uint16_le(s, 0); /* wFormatNo */
|
||||
g_cBlockNo++;
|
||||
out_uint8(s, g_cBlockNo);
|
||||
make_stream(s);
|
||||
init_stream(s, data_bytes);
|
||||
out_uint16_le(s, SNDC_WAVE);
|
||||
size_ptr = s->p;
|
||||
out_uint16_le(s, 0); /* size, set later */
|
||||
time = g_time2();
|
||||
out_uint16_le(s, time);
|
||||
out_uint16_le(s, 0); /* wFormatNo */
|
||||
g_cBlockNo++;
|
||||
out_uint8(s, g_cBlockNo);
|
||||
|
||||
LOG(10, ("sound_send_wave_data: sending time %d, g_cBlockNo %d",
|
||||
time & 0xffff, g_cBlockNo & 0xff));
|
||||
LOG(10, ("sound_send_wave_data: sending time %d, g_cBlockNo %d",
|
||||
time & 0xffff, g_cBlockNo & 0xff));
|
||||
|
||||
out_uint8s(s, 3);
|
||||
out_uint8a(s, data, 4);
|
||||
s_mark_end(s);
|
||||
bytes = (int)((s->end - s->data) - 4);
|
||||
bytes += data_bytes;
|
||||
bytes -= 4;
|
||||
size_ptr[0] = bytes;
|
||||
size_ptr[1] = bytes >> 8;
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
out_uint8s(s, 3);
|
||||
out_uint8a(s, data, 4);
|
||||
s_mark_end(s);
|
||||
bytes = (int)((s->end - s->data) - 4);
|
||||
bytes += data_bytes;
|
||||
bytes -= 4;
|
||||
size_ptr[0] = bytes;
|
||||
size_ptr[1] = bytes >> 8;
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
|
||||
/* part two of 2 PDU wave info */
|
||||
init_stream(s, data_bytes);
|
||||
out_uint32_le(s, 0);
|
||||
out_uint8a(s, data + 4, data_bytes - 4);
|
||||
s_mark_end(s);
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
/* part two of 2 PDU wave info */
|
||||
init_stream(s, data_bytes);
|
||||
out_uint32_le(s, 0);
|
||||
out_uint8a(s, data + 4, data_bytes - 4);
|
||||
s_mark_end(s);
|
||||
bytes = (int)(s->end - s->data);
|
||||
send_channel_data(g_rdpsnd_chan_id, s->data, bytes);
|
||||
free_stream(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
sound_process_training(struct stream* s, int size)
|
||||
sound_process_training(struct stream *s, int size)
|
||||
{
|
||||
int time_diff;
|
||||
int time_diff;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
time_diff = g_time2() - g_training_sent_time;
|
||||
LOG(0, ("sound_process_training: round trip time %u", time_diff));
|
||||
return 0;
|
||||
time_diff = g_time2() - g_training_sent_time;
|
||||
LOG(0, ("sound_process_training: round trip time %u", time_diff));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
sound_process_wave_confirm(struct stream* s, int size)
|
||||
sound_process_wave_confirm(struct stream *s, int size)
|
||||
{
|
||||
int wTimeStamp;
|
||||
int cConfirmedBlockNo;
|
||||
int wTimeStamp;
|
||||
int cConfirmedBlockNo;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
in_uint16_le(s, wTimeStamp);
|
||||
in_uint8(s, cConfirmedBlockNo);
|
||||
in_uint16_le(s, wTimeStamp);
|
||||
in_uint8(s, cConfirmedBlockNo);
|
||||
|
||||
LOG(10, ("sound_process_wave_confirm: wTimeStamp %d, cConfirmedBlockNo %d",
|
||||
wTimeStamp, cConfirmedBlockNo));
|
||||
LOG(10, ("sound_process_wave_confirm: wTimeStamp %d, cConfirmedBlockNo %d",
|
||||
wTimeStamp, cConfirmedBlockNo));
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int APP_CC
|
||||
process_pcm_message(int id, int size, struct stream* s)
|
||||
process_pcm_message(int id, int size, struct stream *s)
|
||||
{
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
sound_send_wave_data(s->p, size);
|
||||
return 0;
|
||||
sound_send_wave_data(s->p, size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* data coming in from audio source, eg pulse, alsa */
|
||||
static int DEFAULT_CC
|
||||
sound_trans_audio_data_in(struct trans* trans)
|
||||
sound_trans_audio_data_in(struct trans *trans)
|
||||
{
|
||||
struct stream *s;
|
||||
int id;
|
||||
int size;
|
||||
int error;
|
||||
struct stream *s;
|
||||
int id;
|
||||
int size;
|
||||
int error;
|
||||
|
||||
if (trans == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (trans != g_audio_c_trans)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
s = trans_get_in_s(trans);
|
||||
in_uint32_le(s, id);
|
||||
in_uint32_le(s, size);
|
||||
if ((id != 0) || (size > 32 * 1024 + 8) || (size < 1))
|
||||
{
|
||||
LOG(0, ("sound_trans_audio_data_in: bad message id %d size %d", id, size));
|
||||
return 1;
|
||||
}
|
||||
error = trans_force_read(trans, size - 8);
|
||||
if (error == 0)
|
||||
{
|
||||
/* here, the entire message block is read in, process it */
|
||||
error = process_pcm_message(id, size - 8, s);
|
||||
}
|
||||
return error;
|
||||
if (trans == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (trans != g_audio_c_trans)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
s = trans_get_in_s(trans);
|
||||
in_uint32_le(s, id);
|
||||
in_uint32_le(s, size);
|
||||
|
||||
if ((id != 0) || (size > 32 * 1024 + 8) || (size < 1))
|
||||
{
|
||||
LOG(0, ("sound_trans_audio_data_in: bad message id %d size %d", id, size));
|
||||
return 1;
|
||||
}
|
||||
|
||||
error = trans_force_read(trans, size - 8);
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
/* here, the entire message block is read in, process it */
|
||||
error = process_pcm_message(id, size - 8, s);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int DEFAULT_CC
|
||||
sound_trans_audio_conn_in(struct trans *trans, struct trans *new_trans)
|
||||
{
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
if (trans == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (trans != g_audio_l_trans)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (g_audio_c_trans != 0) /* if already set, error */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (new_trans == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
g_audio_c_trans = new_trans;
|
||||
g_audio_c_trans->trans_data_in = sound_trans_audio_data_in;
|
||||
g_audio_c_trans->header_size = 8;
|
||||
trans_delete(g_audio_l_trans);
|
||||
g_audio_l_trans = 0;
|
||||
return 0;
|
||||
if (trans == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (trans != g_audio_l_trans)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (g_audio_c_trans != 0) /* if already set, error */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (new_trans == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_audio_c_trans = new_trans;
|
||||
g_audio_c_trans->trans_data_in = sound_trans_audio_data_in;
|
||||
g_audio_c_trans->header_size = 8;
|
||||
trans_delete(g_audio_l_trans);
|
||||
g_audio_l_trans = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
sound_init(void)
|
||||
{
|
||||
char port[256];
|
||||
int error;
|
||||
char port[256];
|
||||
int error;
|
||||
|
||||
print_got_here();
|
||||
LOG(0, ("sound_init:"));
|
||||
print_got_here();
|
||||
LOG(0, ("sound_init:"));
|
||||
|
||||
sound_send_server_formats();
|
||||
g_audio_l_trans = trans_create(2, 33 * 1024, 8192);
|
||||
g_snprintf(port, 255, "/tmp/xrdp_chansrv_audio_socket_%d", g_display_num);
|
||||
g_audio_l_trans->trans_conn_in = sound_trans_audio_conn_in;
|
||||
error = trans_listen(g_audio_l_trans, port);
|
||||
if (error != 0)
|
||||
{
|
||||
LOG(0, ("sound_init: trans_listen failed"));
|
||||
}
|
||||
sound_send_server_formats();
|
||||
g_audio_l_trans = trans_create(2, 33 * 1024, 8192);
|
||||
g_snprintf(port, 255, "/tmp/xrdp_chansrv_audio_socket_%d", g_display_num);
|
||||
g_audio_l_trans->trans_conn_in = sound_trans_audio_conn_in;
|
||||
error = trans_listen(g_audio_l_trans, port);
|
||||
|
||||
if (error != 0)
|
||||
{
|
||||
LOG(0, ("sound_init: trans_listen failed"));
|
||||
}
|
||||
|
||||
#if defined(XRDP_SIMPLESOUND)
|
||||
|
||||
/* start thread to read raw audio data from pulseaudio device */
|
||||
tc_thread_create(read_raw_audio_data, 0);
|
||||
/* start thread to read raw audio data from pulseaudio device */
|
||||
tc_thread_create(read_raw_audio_data, 0);
|
||||
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
sound_deinit(void)
|
||||
{
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
if (g_audio_l_trans != 0)
|
||||
{
|
||||
trans_delete(g_audio_l_trans);
|
||||
g_audio_l_trans = 0;
|
||||
}
|
||||
if (g_audio_c_trans != 0)
|
||||
{
|
||||
trans_delete(g_audio_c_trans);
|
||||
g_audio_l_trans = 0;
|
||||
}
|
||||
if (g_audio_l_trans != 0)
|
||||
{
|
||||
trans_delete(g_audio_l_trans);
|
||||
g_audio_l_trans = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (g_audio_c_trans != 0)
|
||||
{
|
||||
trans_delete(g_audio_c_trans);
|
||||
g_audio_l_trans = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* data in from client ( clinet -> xrdp -> chansrv ) */
|
||||
int APP_CC
|
||||
sound_data_in(struct stream* s, int chan_id, int chan_flags, int length,
|
||||
sound_data_in(struct stream *s, int chan_id, int chan_flags, int length,
|
||||
int total_length)
|
||||
{
|
||||
int code;
|
||||
int size;
|
||||
int code;
|
||||
int size;
|
||||
|
||||
print_got_here();
|
||||
print_got_here();
|
||||
|
||||
in_uint8(s, code);
|
||||
in_uint8s(s, 1);
|
||||
in_uint16_le(s, size);
|
||||
switch (code)
|
||||
{
|
||||
case SNDC_WAVECONFIRM:
|
||||
sound_process_wave_confirm(s, size);
|
||||
break;
|
||||
in_uint8(s, code);
|
||||
in_uint8s(s, 1);
|
||||
in_uint16_le(s, size);
|
||||
|
||||
case SNDC_TRAINING:
|
||||
sound_process_training(s, size);
|
||||
break;
|
||||
switch (code)
|
||||
{
|
||||
case SNDC_WAVECONFIRM:
|
||||
sound_process_wave_confirm(s, size);
|
||||
break;
|
||||
|
||||
case SNDC_FORMATS:
|
||||
sound_process_formats(s, size);
|
||||
break;
|
||||
case SNDC_TRAINING:
|
||||
sound_process_training(s, size);
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG(0, ("sound_data_in: unknown code %d size %d", code, size));
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
case SNDC_FORMATS:
|
||||
sound_process_formats(s, size);
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG(0, ("sound_data_in: unknown code %d size %d", code, size));
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
sound_get_wait_objs(tbus* objs, int* count, int* timeout)
|
||||
sound_get_wait_objs(tbus *objs, int *count, int *timeout)
|
||||
{
|
||||
int lcount;
|
||||
int lcount;
|
||||
|
||||
lcount = *count;
|
||||
if (g_audio_l_trans != 0)
|
||||
{
|
||||
objs[lcount] = g_audio_l_trans->sck;
|
||||
lcount++;
|
||||
}
|
||||
if (g_audio_c_trans != 0)
|
||||
{
|
||||
objs[lcount] = g_audio_c_trans->sck;
|
||||
lcount++;
|
||||
}
|
||||
*count = lcount;
|
||||
return 0;
|
||||
lcount = *count;
|
||||
|
||||
if (g_audio_l_trans != 0)
|
||||
{
|
||||
objs[lcount] = g_audio_l_trans->sck;
|
||||
lcount++;
|
||||
}
|
||||
|
||||
if (g_audio_c_trans != 0)
|
||||
{
|
||||
objs[lcount] = g_audio_c_trans->sck;
|
||||
lcount++;
|
||||
}
|
||||
|
||||
*count = lcount;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
sound_check_wait_objs(void)
|
||||
{
|
||||
if (g_audio_l_trans != 0)
|
||||
{
|
||||
trans_check_wait_objs(g_audio_l_trans);
|
||||
}
|
||||
if (g_audio_l_trans != 0)
|
||||
{
|
||||
trans_check_wait_objs(g_audio_l_trans);
|
||||
}
|
||||
|
||||
if (g_audio_c_trans != 0)
|
||||
{
|
||||
trans_check_wait_objs(g_audio_c_trans);
|
||||
}
|
||||
if (g_audio_c_trans != 0)
|
||||
{
|
||||
trans_check_wait_objs(g_audio_c_trans);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(XRDP_SIMPLESOUND)
|
||||
|
||||
static int DEFAULT_CC
|
||||
sttrans_data_in(struct trans* self)
|
||||
sttrans_data_in(struct trans *self)
|
||||
{
|
||||
LOG(0, ("sttrans_data_in:\n"));
|
||||
return 0;
|
||||
LOG(0, ("sttrans_data_in:\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -451,103 +472,112 @@ sttrans_data_in(struct trans* self)
|
||||
* to a unix domain socket on which trans server is listening
|
||||
*/
|
||||
|
||||
static void* DEFAULT_CC
|
||||
read_raw_audio_data(void* arg)
|
||||
static void *DEFAULT_CC
|
||||
read_raw_audio_data(void *arg)
|
||||
{
|
||||
pa_sample_spec samp_spec;
|
||||
pa_simple* simple = NULL;
|
||||
uint32_t bytes_read;
|
||||
char* cptr;
|
||||
int i;
|
||||
int error;
|
||||
struct trans* strans;
|
||||
char path[256];
|
||||
struct stream* outs;
|
||||
pa_sample_spec samp_spec;
|
||||
pa_simple *simple = NULL;
|
||||
uint32_t bytes_read;
|
||||
char *cptr;
|
||||
int i;
|
||||
int error;
|
||||
struct trans *strans;
|
||||
char path[256];
|
||||
struct stream *outs;
|
||||
|
||||
strans = trans_create(TRANS_MODE_UNIX, 8192, 8192);
|
||||
if (strans == 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: trans_create failed\n"));
|
||||
return 0;
|
||||
}
|
||||
strans->trans_data_in = sttrans_data_in;
|
||||
g_snprintf(path, 255, "/tmp/xrdp_chansrv_audio_socket_%d", g_display_num);
|
||||
if (trans_connect(strans, "", path, 100) != 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: trans_connect failed\n"));
|
||||
trans_delete(strans);
|
||||
return 0;
|
||||
}
|
||||
strans = trans_create(TRANS_MODE_UNIX, 8192, 8192);
|
||||
|
||||
/* setup audio format */
|
||||
samp_spec.format = PA_SAMPLE_S16LE;
|
||||
samp_spec.rate = 44100;
|
||||
samp_spec.channels = 2;
|
||||
|
||||
/* if we are root, then for first 8 seconds connection to pulseaudo server
|
||||
fails; if we are non-root, then connection succeeds on first attempt;
|
||||
for now we have changed code to be non-root, but this may change in the
|
||||
future - so pretend we are root and try connecting to pulseaudio server
|
||||
for upto one minute */
|
||||
for (i = 0; i < 60; i++)
|
||||
{
|
||||
simple = pa_simple_new(NULL, "xrdp", PA_STREAM_RECORD, NULL,
|
||||
"record", &samp_spec, NULL, NULL, &error);
|
||||
if (simple)
|
||||
if (strans == 0)
|
||||
{
|
||||
/* connected to pulseaudio server */
|
||||
LOG(0, ("read_raw_audio_data: connected to pulseaudio server\n"));
|
||||
break;
|
||||
LOG(0, ("read_raw_audio_data: trans_create failed\n"));
|
||||
return 0;
|
||||
}
|
||||
LOG(0, ("read_raw_audio_data: ERROR creating PulseAudio async interface\n"));
|
||||
LOG(0, ("read_raw_audio_data: %s\n", pa_strerror(error)));
|
||||
g_sleep(1000);
|
||||
}
|
||||
|
||||
if (i == 60)
|
||||
{
|
||||
/* failed to connect to audio server */
|
||||
strans->trans_data_in = sttrans_data_in;
|
||||
g_snprintf(path, 255, "/tmp/xrdp_chansrv_audio_socket_%d", g_display_num);
|
||||
|
||||
if (trans_connect(strans, "", path, 100) != 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: trans_connect failed\n"));
|
||||
trans_delete(strans);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* setup audio format */
|
||||
samp_spec.format = PA_SAMPLE_S16LE;
|
||||
samp_spec.rate = 44100;
|
||||
samp_spec.channels = 2;
|
||||
|
||||
/* if we are root, then for first 8 seconds connection to pulseaudo server
|
||||
fails; if we are non-root, then connection succeeds on first attempt;
|
||||
for now we have changed code to be non-root, but this may change in the
|
||||
future - so pretend we are root and try connecting to pulseaudio server
|
||||
for upto one minute */
|
||||
for (i = 0; i < 60; i++)
|
||||
{
|
||||
simple = pa_simple_new(NULL, "xrdp", PA_STREAM_RECORD, NULL,
|
||||
"record", &samp_spec, NULL, NULL, &error);
|
||||
|
||||
if (simple)
|
||||
{
|
||||
/* connected to pulseaudio server */
|
||||
LOG(0, ("read_raw_audio_data: connected to pulseaudio server\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
LOG(0, ("read_raw_audio_data: ERROR creating PulseAudio async interface\n"));
|
||||
LOG(0, ("read_raw_audio_data: %s\n", pa_strerror(error)));
|
||||
g_sleep(1000);
|
||||
}
|
||||
|
||||
if (i == 60)
|
||||
{
|
||||
/* failed to connect to audio server */
|
||||
trans_delete(strans);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* insert header just once */
|
||||
outs = trans_get_out_s(strans, 8192);
|
||||
out_uint32_le(outs, 0);
|
||||
out_uint32_le(outs, AUDIO_BUF_SIZE + 8);
|
||||
cptr = outs->p;
|
||||
out_uint8s(outs, AUDIO_BUF_SIZE);
|
||||
s_mark_end(outs);
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* read a block of raw audio data... */
|
||||
g_memset(cptr, 0, 4);
|
||||
bytes_read = pa_simple_read(simple, cptr, AUDIO_BUF_SIZE, &error);
|
||||
|
||||
if (bytes_read < 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: ERROR reading from pulseaudio stream\n"));
|
||||
LOG(0, ("read_raw_audio_data: %s\n", pa_strerror(error)));
|
||||
break;
|
||||
}
|
||||
|
||||
/* bug workaround:
|
||||
even when there is no audio data, pulseaudio is returning without
|
||||
errors but the data itself is zero; we use this zero data to
|
||||
determine that there is no audio data present */
|
||||
if (*cptr == 0 && *(cptr + 1) == 0 && *(cptr + 2) == 0 && *(cptr + 3) == 0)
|
||||
{
|
||||
g_sleep(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (trans_force_write_s(strans, outs) != 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: ERROR writing audio data to server\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pa_simple_free(simple);
|
||||
trans_delete(strans);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* insert header just once */
|
||||
outs = trans_get_out_s(strans, 8192);
|
||||
out_uint32_le(outs, 0);
|
||||
out_uint32_le(outs, AUDIO_BUF_SIZE + 8);
|
||||
cptr = outs->p;
|
||||
out_uint8s(outs, AUDIO_BUF_SIZE);
|
||||
s_mark_end(outs);
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* read a block of raw audio data... */
|
||||
g_memset(cptr, 0, 4);
|
||||
bytes_read = pa_simple_read(simple, cptr, AUDIO_BUF_SIZE, &error);
|
||||
if (bytes_read < 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: ERROR reading from pulseaudio stream\n"));
|
||||
LOG(0, ("read_raw_audio_data: %s\n", pa_strerror(error)));
|
||||
break;
|
||||
}
|
||||
/* bug workaround:
|
||||
even when there is no audio data, pulseaudio is returning without
|
||||
errors but the data itself is zero; we use this zero data to
|
||||
determine that there is no audio data present */
|
||||
if (*cptr == 0 && *(cptr + 1) == 0 && *(cptr + 2) == 0 && *(cptr + 3) == 0)
|
||||
{
|
||||
g_sleep(10);
|
||||
continue;
|
||||
}
|
||||
if (trans_force_write_s(strans, outs) != 0)
|
||||
{
|
||||
LOG(0, ("read_raw_audio_data: ERROR writing audio data to server\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
pa_simple_free(simple);
|
||||
trans_delete(strans);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
+108
-98
@@ -31,10 +31,10 @@ extern int g_waiting_for_data_response_time; /* in clipboard.c */
|
||||
|
||||
extern int g_rail_up; /* in rail.c */
|
||||
|
||||
Display* g_display = 0;
|
||||
Display *g_display = 0;
|
||||
int g_x_socket = 0;
|
||||
tbus g_x_wait_obj = 0;
|
||||
Screen* g_screen = 0;
|
||||
Screen *g_screen = 0;
|
||||
int g_screen_num = 0;
|
||||
Window g_root_window = 0;
|
||||
Atom g_wm_delete_window_atom = 0;
|
||||
@@ -42,15 +42,15 @@ Atom g_wm_protocols_atom = 0;
|
||||
|
||||
/*****************************************************************************/
|
||||
static int DEFAULT_CC
|
||||
xcommon_error_handler(Display* dis, XErrorEvent* xer)
|
||||
xcommon_error_handler(Display *dis, XErrorEvent *xer)
|
||||
{
|
||||
char text[256];
|
||||
char text[256];
|
||||
|
||||
XGetErrorText(dis, xer->error_code, text, 255);
|
||||
LOGM((LOG_LEVEL_ERROR, "X error [%s](%d) opcodes %d/%d "
|
||||
"resource 0x%lx", text, xer->error_code,
|
||||
xer->request_code, xer->minor_code, xer->resourceid));
|
||||
return 0;
|
||||
XGetErrorText(dis, xer->error_code, text, 255);
|
||||
LOGM((LOG_LEVEL_ERROR, "X error [%s](%d) opcodes %d/%d "
|
||||
"resource 0x%lx", text, xer->error_code,
|
||||
xer->request_code, xer->minor_code, xer->resourceid));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -58,9 +58,9 @@ xcommon_error_handler(Display* dis, XErrorEvent* xer)
|
||||
Do any cleanup that needs to be done on exit, like removing temporary files.
|
||||
Don't worry about memory leaks */
|
||||
static int DEFAULT_CC
|
||||
xcommon_fatal_handler(Display* dis)
|
||||
xcommon_fatal_handler(Display *dis)
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -71,7 +71,7 @@ xcommon_fatal_handler(Display* dis)
|
||||
int APP_CC
|
||||
xcommon_get_local_time(void)
|
||||
{
|
||||
return g_time3();
|
||||
return g_time3();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -79,42 +79,45 @@ xcommon_get_local_time(void)
|
||||
int APP_CC
|
||||
xcommon_init(void)
|
||||
{
|
||||
if (g_display != 0)
|
||||
{
|
||||
LOG(10, ("xcommon_init: xcommon_init already called"));
|
||||
if (g_display != 0)
|
||||
{
|
||||
LOG(10, ("xcommon_init: xcommon_init already called"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
g_display = XOpenDisplay(0);
|
||||
|
||||
if (g_display == 0)
|
||||
{
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_init: error, XOpenDisplay failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
LOG(0, ("xcommon_init: connected to display ok"));
|
||||
|
||||
/* setting the error handlers can cause problem when shutting down
|
||||
chansrv on some xlibs */
|
||||
XSetErrorHandler(xcommon_error_handler);
|
||||
//XSetIOErrorHandler(xcommon_fatal_handler);
|
||||
|
||||
g_x_socket = XConnectionNumber(g_display);
|
||||
|
||||
if (g_x_socket == 0)
|
||||
{
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_init: XConnectionNumber failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_x_wait_obj = g_create_wait_obj_from_socket(g_x_socket, 0);
|
||||
g_screen_num = DefaultScreen(g_display);
|
||||
g_screen = ScreenOfDisplay(g_display, g_screen_num);
|
||||
|
||||
g_root_window = RootWindowOfScreen(g_screen);
|
||||
|
||||
g_wm_delete_window_atom = XInternAtom(g_display, "WM_DELETE_WINDOW", 0);
|
||||
g_wm_protocols_atom = XInternAtom(g_display, "WM_PROTOCOLS", 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
g_display = XOpenDisplay(0);
|
||||
if (g_display == 0)
|
||||
{
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_init: error, XOpenDisplay failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
LOG(0, ("xcommon_init: connected to display ok"));
|
||||
|
||||
/* setting the error handlers can cause problem when shutting down
|
||||
chansrv on some xlibs */
|
||||
XSetErrorHandler(xcommon_error_handler);
|
||||
//XSetIOErrorHandler(xcommon_fatal_handler);
|
||||
|
||||
g_x_socket = XConnectionNumber(g_display);
|
||||
if (g_x_socket == 0)
|
||||
{
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_init: XConnectionNumber failed"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_x_wait_obj = g_create_wait_obj_from_socket(g_x_socket, 0);
|
||||
g_screen_num = DefaultScreen(g_display);
|
||||
g_screen = ScreenOfDisplay(g_display, g_screen_num);
|
||||
|
||||
g_root_window = RootWindowOfScreen(g_screen);
|
||||
|
||||
g_wm_delete_window_atom = XInternAtom(g_display, "WM_DELETE_WINDOW", 0);
|
||||
g_wm_protocols_atom = XInternAtom(g_display, "WM_PROTOCOLS", 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -122,66 +125,73 @@ xcommon_init(void)
|
||||
this is called to get any wait objects for the main loop
|
||||
timeout can be nil */
|
||||
int APP_CC
|
||||
xcommon_get_wait_objs(tbus* objs, int* count, int* timeout)
|
||||
xcommon_get_wait_objs(tbus *objs, int *count, int *timeout)
|
||||
{
|
||||
int lcount;
|
||||
int lcount;
|
||||
|
||||
if (((!g_clip_up) && (!g_rail_up)) || (objs == 0) || (count == 0))
|
||||
{
|
||||
LOG(10, ("xcommon_get_wait_objs: nothing to do"));
|
||||
if (((!g_clip_up) && (!g_rail_up)) || (objs == 0) || (count == 0))
|
||||
{
|
||||
LOG(10, ("xcommon_get_wait_objs: nothing to do"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
lcount = *count;
|
||||
objs[lcount] = g_x_wait_obj;
|
||||
lcount++;
|
||||
*count = lcount;
|
||||
return 0;
|
||||
}
|
||||
lcount = *count;
|
||||
objs[lcount] = g_x_wait_obj;
|
||||
lcount++;
|
||||
*count = lcount;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
xcommon_check_wait_objs(void)
|
||||
{
|
||||
XEvent xevent;
|
||||
int time_diff;
|
||||
int clip_rv;
|
||||
int rail_rv;
|
||||
XEvent xevent;
|
||||
int time_diff;
|
||||
int clip_rv;
|
||||
int rail_rv;
|
||||
|
||||
if ((!g_clip_up) && (!g_rail_up))
|
||||
{
|
||||
LOG(10, ("xcommon_check_wait_objs: nothing to do"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_is_wait_obj_set(g_x_wait_obj))
|
||||
{
|
||||
if (XPending(g_display) < 1)
|
||||
{
|
||||
/* something is wrong, should not get here */
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_check_wait_objs: sck closed"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_waiting_for_data_response)
|
||||
{
|
||||
time_diff = xcommon_get_local_time() -
|
||||
g_waiting_for_data_response_time;
|
||||
|
||||
if (time_diff > 10000)
|
||||
{
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_check_wait_objs: warning, "
|
||||
"waiting for data response too long"));
|
||||
}
|
||||
}
|
||||
|
||||
while (XPending(g_display) > 0)
|
||||
{
|
||||
g_memset(&xevent, 0, sizeof(xevent));
|
||||
XNextEvent(g_display, &xevent);
|
||||
|
||||
clip_rv = clipboard_xevent(&xevent);
|
||||
rail_rv = rail_xevent(&xevent);
|
||||
|
||||
if ((clip_rv == 1) && (rail_rv == 1))
|
||||
{
|
||||
LOG(10, ("xcommon_check_wait_objs unknown xevent type %d", xevent.type));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((!g_clip_up) && (!g_rail_up))
|
||||
{
|
||||
LOG(10, ("xcommon_check_wait_objs: nothing to do"));
|
||||
return 0;
|
||||
}
|
||||
if (g_is_wait_obj_set(g_x_wait_obj))
|
||||
{
|
||||
if (XPending(g_display) < 1)
|
||||
{
|
||||
/* something is wrong, should not get here */
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_check_wait_objs: sck closed"));
|
||||
return 0;
|
||||
}
|
||||
if (g_waiting_for_data_response)
|
||||
{
|
||||
time_diff = xcommon_get_local_time() -
|
||||
g_waiting_for_data_response_time;
|
||||
if (time_diff > 10000)
|
||||
{
|
||||
LOGM((LOG_LEVEL_ERROR, "xcommon_check_wait_objs: warning, "
|
||||
"waiting for data response too long"));
|
||||
}
|
||||
}
|
||||
while (XPending(g_display) > 0)
|
||||
{
|
||||
g_memset(&xevent, 0, sizeof(xevent));
|
||||
XNextEvent(g_display, &xevent);
|
||||
|
||||
clip_rv = clipboard_xevent(&xevent);
|
||||
rail_rv = rail_xevent(&xevent);
|
||||
if ((clip_rv == 1) && (rail_rv == 1))
|
||||
{
|
||||
LOG(10, ("xcommon_check_wait_objs unknown xevent type %d", xevent.type));
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
+301
-279
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -31,146 +30,153 @@
|
||||
#include "sesman.h"
|
||||
#include "log.h"
|
||||
|
||||
extern struct config_sesman* g_cfg; /* in sesman.c */
|
||||
extern struct config_sesman *g_cfg; /* in sesman.c */
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
config_read(struct config_sesman* cfg)
|
||||
config_read(struct config_sesman *cfg)
|
||||
{
|
||||
int fd;
|
||||
struct list* sec;
|
||||
struct list* param_n;
|
||||
struct list* param_v;
|
||||
char cfg_file[256];
|
||||
int fd;
|
||||
struct list *sec;
|
||||
struct list *param_n;
|
||||
struct list *param_v;
|
||||
char cfg_file[256];
|
||||
|
||||
g_snprintf(cfg_file, 255, "%s/sesman.ini", XRDP_CFG_PATH);
|
||||
fd = g_file_open(cfg_file);
|
||||
if (-1 == fd)
|
||||
{
|
||||
//if (g_cfg->log.fd >= 0)
|
||||
//{
|
||||
/* logging is already active */
|
||||
log_message(LOG_LEVEL_ALWAYS, "error opening %s in \
|
||||
g_snprintf(cfg_file, 255, "%s/sesman.ini", XRDP_CFG_PATH);
|
||||
fd = g_file_open(cfg_file);
|
||||
|
||||
if (-1 == fd)
|
||||
{
|
||||
//if (g_cfg->log.fd >= 0)
|
||||
//{
|
||||
/* logging is already active */
|
||||
log_message(LOG_LEVEL_ALWAYS, "error opening %s in \
|
||||
config_read", cfg_file);
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
g_printf("error opening %s in config_read", cfg_file);
|
||||
//}
|
||||
return 1;
|
||||
}
|
||||
g_memset(cfg, 0, sizeof(struct config_sesman));
|
||||
sec = list_create();
|
||||
sec->auto_free = 1;
|
||||
file_read_sections(fd, sec);
|
||||
param_n = list_create();
|
||||
param_n->auto_free = 1;
|
||||
param_v = list_create();
|
||||
param_v->auto_free = 1;
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
g_printf("error opening %s in config_read", cfg_file);
|
||||
//}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* read global config */
|
||||
config_read_globals(fd, cfg, param_n, param_v);
|
||||
g_memset(cfg, 0, sizeof(struct config_sesman));
|
||||
sec = list_create();
|
||||
sec->auto_free = 1;
|
||||
file_read_sections(fd, sec);
|
||||
param_n = list_create();
|
||||
param_n->auto_free = 1;
|
||||
param_v = list_create();
|
||||
param_v->auto_free = 1;
|
||||
|
||||
/* read Xvnc/X11rdp parameter list */
|
||||
config_read_vnc_params(fd, cfg, param_n, param_v);
|
||||
config_read_rdp_params(fd, cfg, param_n, param_v);
|
||||
/* read global config */
|
||||
config_read_globals(fd, cfg, param_n, param_v);
|
||||
|
||||
/* read logging config */
|
||||
// config_read_logging(fd, &(cfg->log), param_n, param_v);
|
||||
/* read Xvnc/X11rdp parameter list */
|
||||
config_read_vnc_params(fd, cfg, param_n, param_v);
|
||||
config_read_rdp_params(fd, cfg, param_n, param_v);
|
||||
|
||||
/* read security config */
|
||||
config_read_security(fd, &(cfg->sec), param_n, param_v);
|
||||
/* read logging config */
|
||||
// config_read_logging(fd, &(cfg->log), param_n, param_v);
|
||||
|
||||
/* read session config */
|
||||
config_read_sessions(fd, &(cfg->sess), param_n, param_v);
|
||||
/* read security config */
|
||||
config_read_security(fd, &(cfg->sec), param_n, param_v);
|
||||
|
||||
/* cleanup */
|
||||
list_delete(sec);
|
||||
list_delete(param_v);
|
||||
list_delete(param_n);
|
||||
g_file_close(fd);
|
||||
return 0;
|
||||
/* read session config */
|
||||
config_read_sessions(fd, &(cfg->sess), param_n, param_v);
|
||||
|
||||
/* cleanup */
|
||||
list_delete(sec);
|
||||
list_delete(param_v);
|
||||
list_delete(param_n);
|
||||
g_file_close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
config_read_globals(int file, struct config_sesman* cf, struct list* param_n,
|
||||
struct list* param_v)
|
||||
config_read_globals(int file, struct config_sesman *cf, struct list *param_n,
|
||||
struct list *param_v)
|
||||
{
|
||||
int i;
|
||||
char* buf;
|
||||
int i;
|
||||
char *buf;
|
||||
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
|
||||
/* resetting the struct */
|
||||
cf->listen_address[0] = '\0';
|
||||
cf->listen_port[0] = '\0';
|
||||
cf->enable_user_wm = 0;
|
||||
cf->user_wm[0] = '\0';
|
||||
cf->default_wm[0] = '\0';
|
||||
cf->auth_file_path = 0;
|
||||
|
||||
file_read_section(file, SESMAN_CFG_GLOBALS, param_n, param_v);
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
buf = (char*)list_get_item(param_n, i);
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_DEFWM))
|
||||
{
|
||||
g_strncpy(cf->default_wm, (char*)list_get_item(param_v, i), 31);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_USERWM))
|
||||
{
|
||||
g_strncpy(cf->user_wm, (char*)list_get_item(param_v, i), 31);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_ENABLE_USERWM))
|
||||
{
|
||||
cf->enable_user_wm = text2bool((char*)list_get_item(param_v, i));
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_PORT))
|
||||
{
|
||||
g_strncpy(cf->listen_port, (char*)list_get_item(param_v, i), 15);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_ADDRESS))
|
||||
{
|
||||
g_strncpy(cf->listen_address, (char*)list_get_item(param_v, i), 31);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_AUTH_FILE_PATH))
|
||||
{
|
||||
cf->auth_file_path = g_strdup((char*)list_get_item(param_v, i));
|
||||
}
|
||||
}
|
||||
|
||||
/* checking for missing required parameters */
|
||||
if ('\0' == cf->listen_address[0])
|
||||
{
|
||||
g_strncpy(cf->listen_address, "0.0.0.0", 8);
|
||||
}
|
||||
if ('\0' == cf->listen_port[0])
|
||||
{
|
||||
g_strncpy(cf->listen_port, "3350", 5);
|
||||
}
|
||||
if ('\0' == cf->user_wm[0])
|
||||
{
|
||||
/* resetting the struct */
|
||||
cf->listen_address[0] = '\0';
|
||||
cf->listen_port[0] = '\0';
|
||||
cf->enable_user_wm = 0;
|
||||
}
|
||||
if ('\0' == cf->default_wm[0])
|
||||
{
|
||||
g_strncpy(cf->default_wm, "startwm.sh", 11);
|
||||
}
|
||||
cf->user_wm[0] = '\0';
|
||||
cf->default_wm[0] = '\0';
|
||||
cf->auth_file_path = 0;
|
||||
|
||||
/* showing read config */
|
||||
g_printf("sesman config:\r\n");
|
||||
g_printf("\tListenAddress: %s\r\n", cf->listen_address);
|
||||
g_printf("\tListenPort: %s\r\n", cf->listen_port);
|
||||
g_printf("\tEnableUserWindowManager: %i\r\n", cf->enable_user_wm);
|
||||
g_printf("\tUserWindowManager: %s\r\n", cf->user_wm);
|
||||
g_printf("\tDefaultWindowManager: %s\r\n", cf->default_wm);
|
||||
g_printf("\tAuthFilePath: %s\r\n", ((cf->auth_file_path) ? (cf->auth_file_path) : ("disabled")));
|
||||
file_read_section(file, SESMAN_CFG_GLOBALS, param_n, param_v);
|
||||
|
||||
return 0;
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
buf = (char *)list_get_item(param_n, i);
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_DEFWM))
|
||||
{
|
||||
g_strncpy(cf->default_wm, (char *)list_get_item(param_v, i), 31);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_USERWM))
|
||||
{
|
||||
g_strncpy(cf->user_wm, (char *)list_get_item(param_v, i), 31);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_ENABLE_USERWM))
|
||||
{
|
||||
cf->enable_user_wm = text2bool((char *)list_get_item(param_v, i));
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_PORT))
|
||||
{
|
||||
g_strncpy(cf->listen_port, (char *)list_get_item(param_v, i), 15);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_ADDRESS))
|
||||
{
|
||||
g_strncpy(cf->listen_address, (char *)list_get_item(param_v, i), 31);
|
||||
}
|
||||
else if (0 == g_strcasecmp(buf, SESMAN_CFG_AUTH_FILE_PATH))
|
||||
{
|
||||
cf->auth_file_path = g_strdup((char *)list_get_item(param_v, i));
|
||||
}
|
||||
}
|
||||
|
||||
/* checking for missing required parameters */
|
||||
if ('\0' == cf->listen_address[0])
|
||||
{
|
||||
g_strncpy(cf->listen_address, "0.0.0.0", 8);
|
||||
}
|
||||
|
||||
if ('\0' == cf->listen_port[0])
|
||||
{
|
||||
g_strncpy(cf->listen_port, "3350", 5);
|
||||
}
|
||||
|
||||
if ('\0' == cf->user_wm[0])
|
||||
{
|
||||
cf->enable_user_wm = 0;
|
||||
}
|
||||
|
||||
if ('\0' == cf->default_wm[0])
|
||||
{
|
||||
g_strncpy(cf->default_wm, "startwm.sh", 11);
|
||||
}
|
||||
|
||||
/* showing read config */
|
||||
g_printf("sesman config:\r\n");
|
||||
g_printf("\tListenAddress: %s\r\n", cf->listen_address);
|
||||
g_printf("\tListenPort: %s\r\n", cf->listen_port);
|
||||
g_printf("\tEnableUserWindowManager: %i\r\n", cf->enable_user_wm);
|
||||
g_printf("\tUserWindowManager: %s\r\n", cf->user_wm);
|
||||
g_printf("\tDefaultWindowManager: %s\r\n", cf->default_wm);
|
||||
g_printf("\tAuthFilePath: %s\r\n", ((cf->auth_file_path) ? (cf->auth_file_path) : ("disabled")));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -184,7 +190,7 @@ config_read_logging(int file, struct log_config* lc, struct list* param_n,
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
|
||||
// setting defaults
|
||||
// setting defaults
|
||||
lc->program_name = g_strdup("sesman");
|
||||
lc->log_file = 0;
|
||||
lc->fd = 0;
|
||||
@@ -230,185 +236,201 @@ config_read_logging(int file, struct log_config* lc, struct list* param_n,
|
||||
*/
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
config_read_security(int file, struct config_security* sc,
|
||||
struct list* param_n,
|
||||
struct list* param_v)
|
||||
config_read_security(int file, struct config_security *sc,
|
||||
struct list *param_n,
|
||||
struct list *param_v)
|
||||
{
|
||||
int i;
|
||||
int gid;
|
||||
char* buf;
|
||||
int i;
|
||||
int gid;
|
||||
char *buf;
|
||||
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
|
||||
/* setting defaults */
|
||||
sc->allow_root = 0;
|
||||
sc->login_retry = 3;
|
||||
sc->ts_users_enable = 0;
|
||||
sc->ts_admins_enable = 0;
|
||||
/* setting defaults */
|
||||
sc->allow_root = 0;
|
||||
sc->login_retry = 3;
|
||||
sc->ts_users_enable = 0;
|
||||
sc->ts_admins_enable = 0;
|
||||
|
||||
file_read_section(file, SESMAN_CFG_SECURITY, param_n, param_v);
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
buf = (char*)list_get_item(param_n, i);
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_ALLOW_ROOT))
|
||||
file_read_section(file, SESMAN_CFG_SECURITY, param_n, param_v);
|
||||
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
sc->allow_root = text2bool((char*)list_get_item(param_v, i));
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_LOGIN_RETRY))
|
||||
{
|
||||
sc->login_retry = g_atoi((char*)list_get_item(param_v, i));
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_USR_GROUP))
|
||||
{
|
||||
if (g_getgroup_info((char*)list_get_item(param_v, i), &gid) == 0)
|
||||
{
|
||||
sc->ts_users_enable = 1;
|
||||
sc->ts_users = gid;
|
||||
}
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_ADM_GROUP))
|
||||
{
|
||||
if (g_getgroup_info((char*)list_get_item(param_v, i), &gid) == 0)
|
||||
{
|
||||
sc->ts_admins_enable = 1;
|
||||
sc->ts_admins = gid;
|
||||
}
|
||||
}
|
||||
}
|
||||
buf = (char *)list_get_item(param_n, i);
|
||||
|
||||
/* printing security config */
|
||||
g_printf("security configuration:\r\n");
|
||||
g_printf("\tAllowRootLogin: %i\r\n",sc->allow_root);
|
||||
g_printf("\tMaxLoginRetry: %i\r\n",sc->login_retry);
|
||||
if (sc->ts_users_enable)
|
||||
{
|
||||
g_printf("\tTSUsersGroup: %i\r\n", sc->ts_users);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_printf("\tNo TSUsersGroup defined\r\n");
|
||||
}
|
||||
if (sc->ts_admins_enable)
|
||||
{
|
||||
g_printf("\tTSAdminsGroup: %i\r\n", sc->ts_admins);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_printf("\tNo TSAdminsGroup defined\r\n");
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_ALLOW_ROOT))
|
||||
{
|
||||
sc->allow_root = text2bool((char *)list_get_item(param_v, i));
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_LOGIN_RETRY))
|
||||
{
|
||||
sc->login_retry = g_atoi((char *)list_get_item(param_v, i));
|
||||
}
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_USR_GROUP))
|
||||
{
|
||||
if (g_getgroup_info((char *)list_get_item(param_v, i), &gid) == 0)
|
||||
{
|
||||
sc->ts_users_enable = 1;
|
||||
sc->ts_users = gid;
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SEC_ADM_GROUP))
|
||||
{
|
||||
if (g_getgroup_info((char *)list_get_item(param_v, i), &gid) == 0)
|
||||
{
|
||||
sc->ts_admins_enable = 1;
|
||||
sc->ts_admins = gid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* printing security config */
|
||||
g_printf("security configuration:\r\n");
|
||||
g_printf("\tAllowRootLogin: %i\r\n", sc->allow_root);
|
||||
g_printf("\tMaxLoginRetry: %i\r\n", sc->login_retry);
|
||||
|
||||
if (sc->ts_users_enable)
|
||||
{
|
||||
g_printf("\tTSUsersGroup: %i\r\n", sc->ts_users);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_printf("\tNo TSUsersGroup defined\r\n");
|
||||
}
|
||||
|
||||
if (sc->ts_admins_enable)
|
||||
{
|
||||
g_printf("\tTSAdminsGroup: %i\r\n", sc->ts_admins);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_printf("\tNo TSAdminsGroup defined\r\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
config_read_sessions(int file, struct config_sessions* se, struct list* param_n,
|
||||
struct list* param_v)
|
||||
config_read_sessions(int file, struct config_sessions *se, struct list *param_n,
|
||||
struct list *param_v)
|
||||
{
|
||||
int i;
|
||||
char* buf;
|
||||
int i;
|
||||
char *buf;
|
||||
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
|
||||
/* setting defaults */
|
||||
se->x11_display_offset=10;
|
||||
se->max_sessions=0;
|
||||
se->max_idle_time=0;
|
||||
se->max_disc_time=0;
|
||||
se->kill_disconnected=0;
|
||||
/* setting defaults */
|
||||
se->x11_display_offset = 10;
|
||||
se->max_sessions = 0;
|
||||
se->max_idle_time = 0;
|
||||
se->max_disc_time = 0;
|
||||
se->kill_disconnected = 0;
|
||||
|
||||
file_read_section(file, SESMAN_CFG_SESSIONS, param_n, param_v);
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
buf = (char*)list_get_item(param_n, i);
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_X11DISPLAYOFFSET))
|
||||
{
|
||||
se->x11_display_offset = g_atoi((char*)list_get_item(param_v, i));
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_MAX))
|
||||
{
|
||||
se->max_sessions = g_atoi((char*)list_get_item(param_v, i));
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_KILL_DISC))
|
||||
{
|
||||
se->kill_disconnected = text2bool((char*)list_get_item(param_v, i));
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_IDLE_LIMIT))
|
||||
{
|
||||
se->max_idle_time=g_atoi((char*)list_get_item(param_v, i));
|
||||
}
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_DISC_LIMIT))
|
||||
{
|
||||
se->max_disc_time=g_atoi((char*)list_get_item(param_v, i));
|
||||
}
|
||||
}
|
||||
file_read_section(file, SESMAN_CFG_SESSIONS, param_n, param_v);
|
||||
|
||||
/* printing security config */
|
||||
g_printf("session configuration:\r\n");
|
||||
g_printf("\tMaxSessions: %i\r\n", se->max_sessions);
|
||||
g_printf("\tX11DisplayOffset: %i\r\n", se->x11_display_offset);
|
||||
g_printf("\tKillDisconnected: %i\r\n", se->kill_disconnected);
|
||||
g_printf("\tIdleTimeLimit: %i\r\n", se->max_idle_time);
|
||||
g_printf("\tDisconnectedTimeLimit: %i\r\n", se->max_idle_time);
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
buf = (char *)list_get_item(param_n, i);
|
||||
|
||||
return 0;
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_X11DISPLAYOFFSET))
|
||||
{
|
||||
se->x11_display_offset = g_atoi((char *)list_get_item(param_v, i));
|
||||
}
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_MAX))
|
||||
{
|
||||
se->max_sessions = g_atoi((char *)list_get_item(param_v, i));
|
||||
}
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_KILL_DISC))
|
||||
{
|
||||
se->kill_disconnected = text2bool((char *)list_get_item(param_v, i));
|
||||
}
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_IDLE_LIMIT))
|
||||
{
|
||||
se->max_idle_time = g_atoi((char *)list_get_item(param_v, i));
|
||||
}
|
||||
|
||||
if (0 == g_strcasecmp(buf, SESMAN_CFG_SESS_DISC_LIMIT))
|
||||
{
|
||||
se->max_disc_time = g_atoi((char *)list_get_item(param_v, i));
|
||||
}
|
||||
}
|
||||
|
||||
/* printing security config */
|
||||
g_printf("session configuration:\r\n");
|
||||
g_printf("\tMaxSessions: %i\r\n", se->max_sessions);
|
||||
g_printf("\tX11DisplayOffset: %i\r\n", se->x11_display_offset);
|
||||
g_printf("\tKillDisconnected: %i\r\n", se->kill_disconnected);
|
||||
g_printf("\tIdleTimeLimit: %i\r\n", se->max_idle_time);
|
||||
g_printf("\tDisconnectedTimeLimit: %i\r\n", se->max_idle_time);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
config_read_rdp_params(int file, struct config_sesman* cs, struct list* param_n,
|
||||
struct list* param_v)
|
||||
config_read_rdp_params(int file, struct config_sesman *cs, struct list *param_n,
|
||||
struct list *param_v)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
|
||||
cs->rdp_params=list_create();
|
||||
cs->rdp_params = list_create();
|
||||
|
||||
file_read_section(file, SESMAN_CFG_RDP_PARAMS, param_n, param_v);
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
list_add_item(cs->rdp_params, (long)g_strdup((char*)list_get_item(param_v, i)));
|
||||
}
|
||||
file_read_section(file, SESMAN_CFG_RDP_PARAMS, param_n, param_v);
|
||||
|
||||
/* printing security config */
|
||||
g_printf("X11rdp parameters:\r\n");
|
||||
for (i = 0; i < cs->rdp_params->count; i++)
|
||||
{
|
||||
g_printf("\tParameter %02d %s\r\n", i, (char*)list_get_item(cs->rdp_params, i));
|
||||
}
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
list_add_item(cs->rdp_params, (long)g_strdup((char *)list_get_item(param_v, i)));
|
||||
}
|
||||
|
||||
return 0;
|
||||
/* printing security config */
|
||||
g_printf("X11rdp parameters:\r\n");
|
||||
|
||||
for (i = 0; i < cs->rdp_params->count; i++)
|
||||
{
|
||||
g_printf("\tParameter %02d %s\r\n", i, (char *)list_get_item(cs->rdp_params, i));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
config_read_vnc_params(int file, struct config_sesman* cs, struct list* param_n,
|
||||
struct list* param_v)
|
||||
config_read_vnc_params(int file, struct config_sesman *cs, struct list *param_n,
|
||||
struct list *param_v)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
list_clear(param_v);
|
||||
list_clear(param_n);
|
||||
|
||||
cs->vnc_params=list_create();
|
||||
cs->vnc_params = list_create();
|
||||
|
||||
file_read_section(file, SESMAN_CFG_VNC_PARAMS, param_n, param_v);
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
list_add_item(cs->vnc_params, (long)g_strdup((char*)list_get_item(param_v, i)));
|
||||
}
|
||||
file_read_section(file, SESMAN_CFG_VNC_PARAMS, param_n, param_v);
|
||||
|
||||
/* printing security config */
|
||||
g_printf("Xvnc parameters:\r\n");
|
||||
for (i = 0; i < cs->vnc_params->count; i++)
|
||||
{
|
||||
g_printf("\tParameter %02d %s\r\n", i, (char*)list_get_item(cs->vnc_params, i));
|
||||
}
|
||||
for (i = 0; i < param_n->count; i++)
|
||||
{
|
||||
list_add_item(cs->vnc_params, (long)g_strdup((char *)list_get_item(param_v, i)));
|
||||
}
|
||||
|
||||
return 0;
|
||||
/* printing security config */
|
||||
g_printf("Xvnc parameters:\r\n");
|
||||
|
||||
for (i = 0; i < cs->vnc_params->count; i++)
|
||||
{
|
||||
g_printf("\tParameter %02d %s\r\n", i, (char *)list_get_item(cs->vnc_params, i));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+17
-19
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -296,4 +295,3 @@ config_read_vnc_params(int file, struct config_sesman* cs, struct list* param_n,
|
||||
struct list* param_v);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+101
-92
@@ -1,28 +1,27 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file env.c
|
||||
* @brief User environment handling code
|
||||
* @author Jay Sorg
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sesman.h"
|
||||
@@ -31,95 +30,105 @@
|
||||
#include "grp.h"
|
||||
|
||||
extern unsigned char g_fixedkey[8]; /* in sesman.c */
|
||||
extern struct config_sesman* g_cfg; /* in sesman.c */
|
||||
extern struct config_sesman *g_cfg; /* in sesman.c */
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
env_check_password_file(char* filename, char* password)
|
||||
env_check_password_file(char *filename, char *password)
|
||||
{
|
||||
char encryptedPasswd[16];
|
||||
int fd;
|
||||
char encryptedPasswd[16];
|
||||
int fd;
|
||||
|
||||
g_memset(encryptedPasswd, 0, 16);
|
||||
g_strncpy(encryptedPasswd, password, 8);
|
||||
rfbDesKey(g_fixedkey, 0);
|
||||
rfbDes((unsigned char*)encryptedPasswd, (unsigned char*)encryptedPasswd);
|
||||
fd = g_file_open(filename);
|
||||
if (fd == -1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING,
|
||||
"can't read vnc password file - %s",
|
||||
filename);
|
||||
return 1;
|
||||
}
|
||||
g_file_write(fd, encryptedPasswd, 8);
|
||||
g_file_close(fd);
|
||||
return 0;
|
||||
g_memset(encryptedPasswd, 0, 16);
|
||||
g_strncpy(encryptedPasswd, password, 8);
|
||||
rfbDesKey(g_fixedkey, 0);
|
||||
rfbDes((unsigned char *)encryptedPasswd, (unsigned char *)encryptedPasswd);
|
||||
fd = g_file_open(filename);
|
||||
|
||||
if (fd == -1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING,
|
||||
"can't read vnc password file - %s",
|
||||
filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_file_write(fd, encryptedPasswd, 8);
|
||||
g_file_close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
env_set_user(char* username, char* passwd_file, int display)
|
||||
env_set_user(char *username, char *passwd_file, int display)
|
||||
{
|
||||
int error;
|
||||
int pw_uid;
|
||||
int pw_gid;
|
||||
int uid;
|
||||
char pw_shell[256];
|
||||
char pw_dir[256];
|
||||
char pw_gecos[256];
|
||||
char text[256];
|
||||
int error;
|
||||
int pw_uid;
|
||||
int pw_gid;
|
||||
int uid;
|
||||
char pw_shell[256];
|
||||
char pw_dir[256];
|
||||
char pw_gecos[256];
|
||||
char text[256];
|
||||
|
||||
error = g_getuser_info(username, &pw_gid, &pw_uid, pw_shell, pw_dir,
|
||||
pw_gecos);
|
||||
|
||||
error = g_getuser_info(username, &pw_gid, &pw_uid, pw_shell, pw_dir,
|
||||
pw_gecos);
|
||||
if (error == 0)
|
||||
{
|
||||
g_rm_temp_dir();
|
||||
error = g_setgid(pw_gid);
|
||||
if (error == 0)
|
||||
{
|
||||
error = g_initgroups(username, pw_gid);
|
||||
}
|
||||
if (error == 0)
|
||||
{
|
||||
uid = pw_uid;
|
||||
error = g_setuid(uid);
|
||||
}
|
||||
g_mk_temp_dir(0);
|
||||
if (error == 0)
|
||||
{
|
||||
g_clearenv();
|
||||
g_setenv("SHELL", pw_shell, 1);
|
||||
g_setenv("PATH", "/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin", 1);
|
||||
g_setenv("USER", username, 1);
|
||||
g_sprintf(text, "%d", uid);
|
||||
g_setenv("UID", text, 1);
|
||||
g_setenv("HOME", pw_dir, 1);
|
||||
g_set_current_dir(pw_dir);
|
||||
g_sprintf(text, ":%d.0", display);
|
||||
g_setenv("DISPLAY", text, 1);
|
||||
if (passwd_file != 0)
|
||||
{
|
||||
if (0 == g_cfg->auth_file_path)
|
||||
g_rm_temp_dir();
|
||||
error = g_setgid(pw_gid);
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
/* if no auth_file_path is set, then we go for
|
||||
$HOME/.vnc/sesman_username_passwd */
|
||||
g_mkdir(".vnc");
|
||||
g_sprintf(passwd_file, "%s/.vnc/sesman_%s_passwd", pw_dir, username);
|
||||
error = g_initgroups(username, pw_gid);
|
||||
}
|
||||
else
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
/* we use auth_file_path as requested */
|
||||
g_sprintf(passwd_file, g_cfg->auth_file_path, username);
|
||||
uid = pw_uid;
|
||||
error = g_setuid(uid);
|
||||
}
|
||||
|
||||
g_mk_temp_dir(0);
|
||||
|
||||
if (error == 0)
|
||||
{
|
||||
g_clearenv();
|
||||
g_setenv("SHELL", pw_shell, 1);
|
||||
g_setenv("PATH", "/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin", 1);
|
||||
g_setenv("USER", username, 1);
|
||||
g_sprintf(text, "%d", uid);
|
||||
g_setenv("UID", text, 1);
|
||||
g_setenv("HOME", pw_dir, 1);
|
||||
g_set_current_dir(pw_dir);
|
||||
g_sprintf(text, ":%d.0", display);
|
||||
g_setenv("DISPLAY", text, 1);
|
||||
|
||||
if (passwd_file != 0)
|
||||
{
|
||||
if (0 == g_cfg->auth_file_path)
|
||||
{
|
||||
/* if no auth_file_path is set, then we go for
|
||||
$HOME/.vnc/sesman_username_passwd */
|
||||
g_mkdir(".vnc");
|
||||
g_sprintf(passwd_file, "%s/.vnc/sesman_%s_passwd", pw_dir, username);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* we use auth_file_path as requested */
|
||||
g_sprintf(passwd_file, g_cfg->auth_file_path, username);
|
||||
}
|
||||
|
||||
LOG_DBG("pass file: %s", passwd_file);
|
||||
}
|
||||
}
|
||||
LOG_DBG("pass file: %s", passwd_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR,
|
||||
"error getting user info for user %s", username);
|
||||
}
|
||||
return error;
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR,
|
||||
"error getting user info for user %s", username);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
+19
-21
@@ -1,28 +1,27 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file env.h
|
||||
* @brief User environment handling code declarations
|
||||
* @author Jay Sorg
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ENV_H
|
||||
@@ -42,7 +41,7 @@ env_check_password_file(char* filename, char* password);
|
||||
/**
|
||||
*
|
||||
* @brief Sets user environment ($PATH, $HOME, $UID, and others)
|
||||
* @param username Username
|
||||
* @param username Username
|
||||
* @param passwd_file VNC password file
|
||||
* @param display The session display
|
||||
* @return 0 on success, g_getuser_info() error codes on error
|
||||
@@ -52,4 +51,3 @@ int DEFAULT_CC
|
||||
env_set_user(char* username, char* passwd_file, int display);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+17
-18
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -29,32 +28,32 @@
|
||||
|
||||
//extern struct log_config* s_log;
|
||||
|
||||
struct SCP_CONNECTION*
|
||||
struct SCP_CONNECTION *
|
||||
scp_connection_create(int sck)
|
||||
{
|
||||
struct SCP_CONNECTION* conn;
|
||||
struct SCP_CONNECTION *conn;
|
||||
|
||||
conn = g_malloc(sizeof(struct SCP_CONNECTION), 0);
|
||||
conn = g_malloc(sizeof(struct SCP_CONNECTION), 0);
|
||||
|
||||
if (0 == conn)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[connection:%d] connection create: malloc error", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
if (0 == conn)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[connection:%d] connection create: malloc error", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
conn->in_sck=sck;
|
||||
make_stream(conn->in_s);
|
||||
init_stream(conn->in_s, 8196);
|
||||
make_stream(conn->out_s);
|
||||
init_stream(conn->out_s, 8196);
|
||||
conn->in_sck = sck;
|
||||
make_stream(conn->in_s);
|
||||
init_stream(conn->in_s, 8196);
|
||||
make_stream(conn->out_s);
|
||||
init_stream(conn->out_s, 8196);
|
||||
|
||||
return conn;
|
||||
return conn;
|
||||
}
|
||||
|
||||
void
|
||||
scp_connection_destroy(struct SCP_CONNECTION* c)
|
||||
scp_connection_destroy(struct SCP_CONNECTION *c)
|
||||
{
|
||||
free_stream(c->in_s);
|
||||
free_stream(c->out_s);
|
||||
g_free(c);
|
||||
free_stream(c->in_s);
|
||||
free_stream(c->out_s);
|
||||
g_free(c);
|
||||
}
|
||||
|
||||
@@ -1,28 +1,27 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file libscp_connection.h
|
||||
* @brief SCP_CONNECTION handling code
|
||||
* @author Simone Fedele
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LIBSCP_CONNECTION_H
|
||||
@@ -37,7 +36,7 @@
|
||||
*
|
||||
* @return a struct SCP_CONNECTION* object on success, NULL otherwise
|
||||
*
|
||||
*/
|
||||
*/
|
||||
struct SCP_CONNECTION*
|
||||
scp_connection_create(int sck);
|
||||
|
||||
@@ -45,10 +44,9 @@ scp_connection_create(int sck);
|
||||
*
|
||||
* @brief destroys a struct SCP_CONNECTION* object
|
||||
* @param c the object to be destroyed
|
||||
*
|
||||
*
|
||||
*/
|
||||
void
|
||||
scp_connection_destroy(struct SCP_CONNECTION* c);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+27
-29
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -33,19 +32,18 @@
|
||||
int DEFAULT_CC
|
||||
scp_init()
|
||||
{
|
||||
/*
|
||||
if (0 == log)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
if (0 == log)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
|
||||
//s_log = log;
|
||||
//s_log = log;
|
||||
|
||||
scp_lock_init();
|
||||
scp_lock_init();
|
||||
|
||||
log_message(LOG_LEVEL_WARNING, "[init:%d] libscp initialized", __LINE__);
|
||||
log_message(LOG_LEVEL_WARNING, "[init:%d] libscp initialized", __LINE__);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+19
-21
@@ -1,28 +1,27 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file libscp_init.h
|
||||
* @brief libscp initialization code header
|
||||
* @author Simone Fedele
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LIBSCP_INIT_H
|
||||
@@ -41,8 +40,7 @@
|
||||
* It this memory needs to be g_free()d
|
||||
*
|
||||
*/
|
||||
int DEFAULT_CC
|
||||
int DEFAULT_CC
|
||||
scp_init();
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+95
-93
@@ -1,25 +1,23 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
|
||||
session manager
|
||||
linux only
|
||||
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* session manager
|
||||
* linux only
|
||||
*/
|
||||
|
||||
#include "libscp_lock.h"
|
||||
|
||||
@@ -37,110 +35,114 @@ int lock_fork_waiting_count; /* threads suspended until the fork finish
|
||||
void DEFAULT_CC
|
||||
scp_lock_init(void)
|
||||
{
|
||||
/* initializing fork lock */
|
||||
pthread_mutexattr_init(&lock_fork_attr);
|
||||
pthread_mutex_init(&lock_fork, &lock_fork_attr);
|
||||
sem_init(&lock_fork_req, 0, 0);
|
||||
sem_init(&lock_fork_wait, 0, 0);
|
||||
/* initializing fork lock */
|
||||
pthread_mutexattr_init(&lock_fork_attr);
|
||||
pthread_mutex_init(&lock_fork, &lock_fork_attr);
|
||||
sem_init(&lock_fork_req, 0, 0);
|
||||
sem_init(&lock_fork_wait, 0, 0);
|
||||
|
||||
/* here we don't use locking because lock_init() should be called BEFORE */
|
||||
/* any thread is created */
|
||||
lock_fork_blockers_count=0;
|
||||
lock_fork_waiting_count=0;
|
||||
lock_fork_forkers_count=0;
|
||||
/* here we don't use locking because lock_init() should be called BEFORE */
|
||||
/* any thread is created */
|
||||
lock_fork_blockers_count = 0;
|
||||
lock_fork_waiting_count = 0;
|
||||
lock_fork_forkers_count = 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void DEFAULT_CC
|
||||
scp_lock_fork_request(void)
|
||||
{
|
||||
/* lock mutex */
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
if (lock_fork_blockers_count == 0)
|
||||
{
|
||||
/* if noone is blocking fork(), then we're allowed to fork */
|
||||
sem_post(&lock_fork_req);
|
||||
}
|
||||
lock_fork_forkers_count++;
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
/* lock mutex */
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
|
||||
/* we wait to be allowed to fork() */
|
||||
sem_wait(&lock_fork_req);
|
||||
if (lock_fork_blockers_count == 0)
|
||||
{
|
||||
/* if noone is blocking fork(), then we're allowed to fork */
|
||||
sem_post(&lock_fork_req);
|
||||
}
|
||||
|
||||
lock_fork_forkers_count++;
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
|
||||
/* we wait to be allowed to fork() */
|
||||
sem_wait(&lock_fork_req);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void DEFAULT_CC
|
||||
scp_lock_fork_release(void)
|
||||
{
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
lock_fork_forkers_count--;
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
lock_fork_forkers_count--;
|
||||
|
||||
/* if there's someone else that want to fork, we let him fork() */
|
||||
if (lock_fork_forkers_count > 0)
|
||||
{
|
||||
sem_post(&lock_fork_req);
|
||||
}
|
||||
/* if there's someone else that want to fork, we let him fork() */
|
||||
if (lock_fork_forkers_count > 0)
|
||||
{
|
||||
sem_post(&lock_fork_req);
|
||||
}
|
||||
|
||||
for (;lock_fork_waiting_count > 0; lock_fork_waiting_count--)
|
||||
{
|
||||
/* waking up the other processes */
|
||||
sem_post(&lock_fork_wait);
|
||||
}
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
for (; lock_fork_waiting_count > 0; lock_fork_waiting_count--)
|
||||
{
|
||||
/* waking up the other processes */
|
||||
sem_post(&lock_fork_wait);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
void DEFAULT_CC
|
||||
scp_lock_fork_critical_section_end(int blocking)
|
||||
{
|
||||
//LOG_DBG("lock_fork_critical_secection_end()",0);
|
||||
/* lock mutex */
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
//LOG_DBG("lock_fork_critical_secection_end()",0);
|
||||
/* lock mutex */
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
|
||||
if (blocking == LIBSCP_LOCK_FORK_BLOCKER)
|
||||
{
|
||||
lock_fork_blockers_count--;
|
||||
}
|
||||
if (blocking == LIBSCP_LOCK_FORK_BLOCKER)
|
||||
{
|
||||
lock_fork_blockers_count--;
|
||||
}
|
||||
|
||||
/* if there's someone who wants to fork and we're the last blocking */
|
||||
/* then we let him go */
|
||||
if ((lock_fork_blockers_count == 0) && (lock_fork_forkers_count>0))
|
||||
{
|
||||
sem_post(&lock_fork_req);
|
||||
}
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
/* if there's someone who wants to fork and we're the last blocking */
|
||||
/* then we let him go */
|
||||
if ((lock_fork_blockers_count == 0) && (lock_fork_forkers_count > 0))
|
||||
{
|
||||
sem_post(&lock_fork_req);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int DEFAULT_CC
|
||||
scp_lock_fork_critical_section_start(void)
|
||||
{
|
||||
//LOG_DBG("lock_fork_critical_secection_start()",0);
|
||||
do
|
||||
{
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
|
||||
/* someone requested to fork */
|
||||
if (lock_fork_forkers_count > 0)
|
||||
//LOG_DBG("lock_fork_critical_secection_start()",0);
|
||||
do
|
||||
{
|
||||
lock_fork_waiting_count++;
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
pthread_mutex_lock(&lock_fork);
|
||||
|
||||
/* we wait until the fork finishes */
|
||||
sem_wait(&lock_fork_wait);
|
||||
/* someone requested to fork */
|
||||
if (lock_fork_forkers_count > 0)
|
||||
{
|
||||
lock_fork_waiting_count++;
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
|
||||
/* we wait until the fork finishes */
|
||||
sem_wait(&lock_fork_wait);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no fork, so we can go on... */
|
||||
lock_fork_blockers_count++;
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
|
||||
return LIBSCP_LOCK_FORK_BLOCKER;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no fork, so we can go on... */
|
||||
lock_fork_blockers_count++;
|
||||
pthread_mutex_unlock(&lock_fork);
|
||||
while (1);
|
||||
|
||||
return LIBSCP_LOCK_FORK_BLOCKER;
|
||||
}
|
||||
} while (1);
|
||||
|
||||
/* we'll never get here */
|
||||
return LIBSCP_LOCK_FORK_WAITING;
|
||||
/* we'll never get here */
|
||||
return LIBSCP_LOCK_FORK_WAITING;
|
||||
}
|
||||
|
||||
|
||||
+17
-19
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef LIBSCP_LOCK_H
|
||||
#define LIBSCP_LOCK_H
|
||||
@@ -72,4 +71,3 @@ void DEFAULT_CC
|
||||
scp_lock_fork_critical_section_end(int blocking);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+368
-323
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -34,379 +33,425 @@
|
||||
//extern struct log_config* s_log;
|
||||
|
||||
/*******************************************************************/
|
||||
struct SCP_SESSION*
|
||||
struct SCP_SESSION *
|
||||
scp_session_create()
|
||||
{
|
||||
struct SCP_SESSION* s;
|
||||
struct SCP_SESSION *s;
|
||||
|
||||
s = (struct SCP_SESSION *)g_malloc(sizeof(struct SCP_SESSION), 1);
|
||||
|
||||
if (0 == s)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] session create: malloc error", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_type(struct SCP_SESSION *s, tui8 type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case SCP_SESSION_TYPE_XVNC:
|
||||
s->type = SCP_SESSION_TYPE_XVNC;
|
||||
break;
|
||||
case SCP_SESSION_TYPE_XRDP:
|
||||
s->type = SCP_SESSION_TYPE_XRDP;
|
||||
break;
|
||||
case SCP_GW_AUTHENTICATION:
|
||||
s->type = SCP_GW_AUTHENTICATION;
|
||||
break;
|
||||
case SCP_SESSION_TYPE_MANAGE:
|
||||
s->type = SCP_SESSION_TYPE_MANAGE;
|
||||
s->mng = (struct SCP_MNG_DATA *)g_malloc(sizeof(struct SCP_MNG_DATA), 1);
|
||||
|
||||
if (NULL == s->mng)
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "[session:%d] set_type: internal error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_type: unknown type", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
s = (struct SCP_SESSION*)g_malloc(sizeof(struct SCP_SESSION), 1);
|
||||
if (0 == s)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] session create: malloc error", __LINE__);
|
||||
return 0;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_type(struct SCP_SESSION* s, tui8 type)
|
||||
scp_session_set_version(struct SCP_SESSION *s, tui32 version)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case SCP_SESSION_TYPE_XVNC:
|
||||
s->type = SCP_SESSION_TYPE_XVNC;
|
||||
break;
|
||||
case SCP_SESSION_TYPE_XRDP:
|
||||
s->type = SCP_SESSION_TYPE_XRDP;
|
||||
break;
|
||||
case SCP_GW_AUTHENTICATION:
|
||||
s->type = SCP_GW_AUTHENTICATION;
|
||||
break;
|
||||
case SCP_SESSION_TYPE_MANAGE:
|
||||
s->type = SCP_SESSION_TYPE_MANAGE;
|
||||
s->mng = (struct SCP_MNG_DATA*)g_malloc(sizeof(struct SCP_MNG_DATA), 1);
|
||||
if (NULL == s->mng)
|
||||
{
|
||||
log_message(LOG_LEVEL_ERROR, "[session:%d] set_type: internal error", __LINE__);
|
||||
switch (version)
|
||||
{
|
||||
case 0:
|
||||
s->version = 0;
|
||||
break;
|
||||
case 1:
|
||||
s->version = 1;
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_version: unknown version", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_height(struct SCP_SESSION *s, tui16 h)
|
||||
{
|
||||
s->height = h;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_width(struct SCP_SESSION *s, tui16 w)
|
||||
{
|
||||
s->width = w;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_bpp(struct SCP_SESSION *s, tui8 bpp)
|
||||
{
|
||||
switch (bpp)
|
||||
{
|
||||
case 8:
|
||||
case 15:
|
||||
case 16:
|
||||
case 24:
|
||||
s->bpp = bpp;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_rsr(struct SCP_SESSION *s, tui8 rsr)
|
||||
{
|
||||
if (s->rsr)
|
||||
{
|
||||
s->rsr = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
s->rsr = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_locale(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_locale: null locale", __LINE__);
|
||||
s->locale[0] = '\0';
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_type: unknown type", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
g_strncpy(s->locale, str, 17);
|
||||
s->locale[17] = '\0';
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_version(struct SCP_SESSION* s, tui32 version)
|
||||
scp_session_set_username(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
switch (version)
|
||||
{
|
||||
case 0:
|
||||
s->version = 0;
|
||||
break;
|
||||
case 1:
|
||||
s->version = 1;
|
||||
break;
|
||||
default:
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_version: unknown version", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_username: null username", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->username)
|
||||
{
|
||||
g_free(s->username);
|
||||
}
|
||||
|
||||
s->username = g_strdup(str);
|
||||
|
||||
if (0 == s->username)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_username: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_height(struct SCP_SESSION* s, tui16 h)
|
||||
scp_session_set_password(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
s->height = h;
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_password: null password", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->password)
|
||||
{
|
||||
g_free(s->password);
|
||||
}
|
||||
|
||||
s->password = g_strdup(str);
|
||||
|
||||
if (0 == s->password)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_password: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_width(struct SCP_SESSION* s, tui16 w)
|
||||
scp_session_set_domain(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
s->width = w;
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_domain: null domain", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->domain)
|
||||
{
|
||||
g_free(s->domain);
|
||||
}
|
||||
|
||||
s->domain = g_strdup(str);
|
||||
|
||||
if (0 == s->domain)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_domain: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_bpp(struct SCP_SESSION* s, tui8 bpp)
|
||||
scp_session_set_program(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
switch (bpp)
|
||||
{
|
||||
case 8:
|
||||
case 15:
|
||||
case 16:
|
||||
case 24:
|
||||
s->bpp = bpp;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_program: null program", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->program)
|
||||
{
|
||||
g_free(s->program);
|
||||
}
|
||||
|
||||
s->program = g_strdup(str);
|
||||
|
||||
if (0 == s->program)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_program: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_rsr(struct SCP_SESSION* s, tui8 rsr)
|
||||
scp_session_set_directory(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
if (s->rsr)
|
||||
{
|
||||
s->rsr = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
s->rsr = 0;
|
||||
}
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_directory: null directory", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->directory)
|
||||
{
|
||||
g_free(s->directory);
|
||||
}
|
||||
|
||||
s->directory = g_strdup(str);
|
||||
|
||||
if (0 == s->directory)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_directory: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_locale(struct SCP_SESSION* s, char* str)
|
||||
scp_session_set_client_ip(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_locale: null locale", __LINE__);
|
||||
s->locale[0]='\0';
|
||||
return 1;
|
||||
}
|
||||
g_strncpy(s->locale, str, 17);
|
||||
s->locale[17]='\0';
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_client_ip: null ip", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->client_ip)
|
||||
{
|
||||
g_free(s->client_ip);
|
||||
}
|
||||
|
||||
s->client_ip = g_strdup(str);
|
||||
|
||||
if (0 == s->client_ip)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_client_ip: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_username(struct SCP_SESSION* s, char* str)
|
||||
scp_session_set_hostname(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_username: null username", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->username)
|
||||
{
|
||||
g_free(s->username);
|
||||
}
|
||||
s->username = g_strdup(str);
|
||||
if (0 == s->username)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_username: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_hostname: null hostname", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->hostname)
|
||||
{
|
||||
g_free(s->hostname);
|
||||
}
|
||||
|
||||
s->hostname = g_strdup(str);
|
||||
|
||||
if (0 == s->hostname)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_hostname: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_password(struct SCP_SESSION* s, char* str)
|
||||
scp_session_set_errstr(struct SCP_SESSION *s, char *str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_password: null password", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->password)
|
||||
{
|
||||
g_free(s->password);
|
||||
}
|
||||
s->password = g_strdup(str);
|
||||
if (0 == s->password)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_password: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_errstr: null string", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (0 != s->errstr)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
|
||||
s->errstr = g_strdup(str);
|
||||
|
||||
if (0 == s->errstr)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_errstr: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_domain(struct SCP_SESSION* s, char* str)
|
||||
scp_session_set_display(struct SCP_SESSION *s, SCP_DISPLAY display)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_domain: null domain", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->domain)
|
||||
{
|
||||
g_free(s->domain);
|
||||
}
|
||||
s->domain = g_strdup(str);
|
||||
if (0 == s->domain)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_domain: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
s->display = display;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_program(struct SCP_SESSION* s, char* str)
|
||||
scp_session_set_addr(struct SCP_SESSION *s, int type, void *addr)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_program: null program", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->program)
|
||||
{
|
||||
g_free(s->program);
|
||||
}
|
||||
s->program = g_strdup(str);
|
||||
if (0 == s->program)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_program: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_directory(struct SCP_SESSION* s, char* str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_directory: null directory", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->directory)
|
||||
{
|
||||
g_free(s->directory);
|
||||
}
|
||||
s->directory = g_strdup(str);
|
||||
if (0 == s->directory)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_directory: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_client_ip(struct SCP_SESSION* s, char* str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_client_ip: null ip", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->client_ip)
|
||||
{
|
||||
g_free(s->client_ip);
|
||||
}
|
||||
s->client_ip = g_strdup(str);
|
||||
if (0 == s->client_ip)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_client_ip: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_hostname(struct SCP_SESSION* s, char* str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_hostname: null hostname", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->hostname)
|
||||
{
|
||||
g_free(s->hostname);
|
||||
}
|
||||
s->hostname = g_strdup(str);
|
||||
if (0 == s->hostname)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_hostname: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_errstr(struct SCP_SESSION* s, char* str)
|
||||
{
|
||||
if (0 == str)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_errstr: null string", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
if (0 != s->errstr)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
s->errstr = g_strdup(str);
|
||||
if (0 == s->errstr)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_errstr: strdup error", __LINE__);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_display(struct SCP_SESSION* s, SCP_DISPLAY display)
|
||||
{
|
||||
s->display = display;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
int
|
||||
scp_session_set_addr(struct SCP_SESSION* s, int type, void* addr)
|
||||
{
|
||||
struct in_addr ip4;
|
||||
struct in_addr ip4;
|
||||
#ifdef IN6ADDR_ANY_INIT
|
||||
struct in6_addr ip6;
|
||||
struct in6_addr ip6;
|
||||
#endif
|
||||
int ret;
|
||||
int ret;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SCP_ADDRESS_TYPE_IPV4:
|
||||
/* convert from char to 32bit*/
|
||||
ret = inet_pton(AF_INET, addr, &ip4);
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_addr: invalid address", __LINE__);
|
||||
inet_pton(AF_INET, "127.0.0.1", &ip4);
|
||||
g_memcpy(&(s->ipv4addr), &(ip4.s_addr), 4);
|
||||
return 1;
|
||||
}
|
||||
g_memcpy(&(s->ipv4addr), &(ip4.s_addr), 4);
|
||||
break;
|
||||
case SCP_ADDRESS_TYPE_IPV4_BIN:
|
||||
g_memcpy(&(s->ipv4addr), addr, 4);
|
||||
break;
|
||||
switch (type)
|
||||
{
|
||||
case SCP_ADDRESS_TYPE_IPV4:
|
||||
/* convert from char to 32bit*/
|
||||
ret = inet_pton(AF_INET, addr, &ip4);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_addr: invalid address", __LINE__);
|
||||
inet_pton(AF_INET, "127.0.0.1", &ip4);
|
||||
g_memcpy(&(s->ipv4addr), &(ip4.s_addr), 4);
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_memcpy(&(s->ipv4addr), &(ip4.s_addr), 4);
|
||||
break;
|
||||
case SCP_ADDRESS_TYPE_IPV4_BIN:
|
||||
g_memcpy(&(s->ipv4addr), addr, 4);
|
||||
break;
|
||||
#ifdef IN6ADDR_ANY_INIT
|
||||
case SCP_ADDRESS_TYPE_IPV6:
|
||||
/* convert from char to 128bit*/
|
||||
ret = inet_pton(AF_INET6, addr, &ip6);
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_addr: invalid address", __LINE__);
|
||||
inet_pton(AF_INET, "::1", &ip6);
|
||||
g_memcpy(s->ipv6addr, &(ip6.s6_addr), 16);
|
||||
return 1;
|
||||
}
|
||||
g_memcpy(s->ipv6addr, &(ip6.s6_addr), 16);
|
||||
break;
|
||||
case SCP_ADDRESS_TYPE_IPV6_BIN:
|
||||
g_memcpy(s->ipv6addr, addr, 16);
|
||||
break;
|
||||
case SCP_ADDRESS_TYPE_IPV6:
|
||||
/* convert from char to 128bit*/
|
||||
ret = inet_pton(AF_INET6, addr, &ip6);
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[session:%d] set_addr: invalid address", __LINE__);
|
||||
inet_pton(AF_INET, "::1", &ip6);
|
||||
g_memcpy(s->ipv6addr, &(ip6.s6_addr), 16);
|
||||
return 1;
|
||||
}
|
||||
|
||||
g_memcpy(s->ipv6addr, &(ip6.s6_addr), 16);
|
||||
break;
|
||||
case SCP_ADDRESS_TYPE_IPV6_BIN:
|
||||
g_memcpy(s->ipv6addr, addr, 16);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
void
|
||||
scp_session_destroy(struct SCP_SESSION* s)
|
||||
scp_session_destroy(struct SCP_SESSION *s)
|
||||
{
|
||||
g_free(s->username);
|
||||
g_free(s->password);
|
||||
g_free(s->hostname);
|
||||
g_free(s->domain);
|
||||
g_free(s->program);
|
||||
g_free(s->directory);
|
||||
g_free(s->client_ip);
|
||||
g_free(s->errstr);
|
||||
g_free(s->mng);
|
||||
g_free(s);
|
||||
g_free(s->username);
|
||||
g_free(s->password);
|
||||
g_free(s->hostname);
|
||||
g_free(s->domain);
|
||||
g_free(s->program);
|
||||
g_free(s->directory);
|
||||
g_free(s->client_ip);
|
||||
g_free(s->errstr);
|
||||
g_free(s->mng);
|
||||
g_free(s);
|
||||
}
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+91
-91
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -33,102 +32,103 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
extern struct log_config* s_log;
|
||||
extern struct log_config *s_log;
|
||||
|
||||
/*****************************************************************************/
|
||||
int DEFAULT_CC
|
||||
scp_tcp_force_recv(int sck, char* data, int len)
|
||||
scp_tcp_force_recv(int sck, char *data, int len)
|
||||
{
|
||||
int rcvd;
|
||||
int block;
|
||||
int rcvd;
|
||||
int block;
|
||||
|
||||
LOG_DBG("scp_tcp_force_recv()");
|
||||
block = scp_lock_fork_critical_section_start();
|
||||
LOG_DBG("scp_tcp_force_recv()");
|
||||
block = scp_lock_fork_critical_section_start();
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
rcvd = g_tcp_recv(sck, data, len, 0);
|
||||
if (rcvd == -1)
|
||||
while (len > 0)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(sck))
|
||||
{
|
||||
g_sleep(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (rcvd == 0)
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
data += rcvd;
|
||||
len -= rcvd;
|
||||
}
|
||||
}
|
||||
rcvd = g_tcp_recv(sck, data, len, 0);
|
||||
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
if (rcvd == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(sck))
|
||||
{
|
||||
g_sleep(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (rcvd == 0)
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
data += rcvd;
|
||||
len -= rcvd;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int DEFAULT_CC
|
||||
scp_tcp_force_send(int sck, char* data, int len)
|
||||
scp_tcp_force_send(int sck, char *data, int len)
|
||||
{
|
||||
int sent;
|
||||
int block;
|
||||
int sent;
|
||||
int block;
|
||||
|
||||
LOG_DBG("scp_tcp_force_send()");
|
||||
block = scp_lock_fork_critical_section_start();
|
||||
LOG_DBG("scp_tcp_force_send()");
|
||||
block = scp_lock_fork_critical_section_start();
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
sent = g_tcp_send(sck, data, len, 0);
|
||||
if (sent == -1)
|
||||
while (len > 0)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(sck))
|
||||
{
|
||||
g_sleep(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (sent == 0)
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
data += sent;
|
||||
len -= sent;
|
||||
}
|
||||
}
|
||||
sent = g_tcp_send(sck, data, len, 0);
|
||||
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
if (sent == -1)
|
||||
{
|
||||
if (g_tcp_last_error_would_block(sck))
|
||||
{
|
||||
g_sleep(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (sent == 0)
|
||||
{
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
data += sent;
|
||||
len -= sent;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
scp_lock_fork_critical_section_end(block);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int DEFAULT_CC
|
||||
scp_tcp_bind(int sck, char* addr, char* port)
|
||||
scp_tcp_bind(int sck, char *addr, char *port)
|
||||
{
|
||||
struct sockaddr_in s;
|
||||
struct sockaddr_in s;
|
||||
|
||||
memset(&s, 0, sizeof(struct sockaddr_in));
|
||||
s.sin_family = AF_INET;
|
||||
s.sin_port = htons(atoi(port));
|
||||
s.sin_addr.s_addr = inet_addr(addr);
|
||||
return bind(sck, (struct sockaddr*)&s, sizeof(struct sockaddr_in));
|
||||
memset(&s, 0, sizeof(struct sockaddr_in));
|
||||
s.sin_family = AF_INET;
|
||||
s.sin_port = htons(atoi(port));
|
||||
s.sin_addr.s_addr = inet_addr(addr);
|
||||
return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_in));
|
||||
}
|
||||
|
||||
|
||||
+17
-18
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -43,7 +42,7 @@
|
||||
#define SCP_SESSION_TYPE_XRDP 0x01
|
||||
#define SCP_SESSION_TYPE_MANAGE 0x02
|
||||
/* SCP_GW_AUTHENTICATION can be used when XRDP + sesman act as a gateway
|
||||
* XRDP sends this command to let sesman verify if the user is allowed
|
||||
* XRDP sends this command to let sesman verify if the user is allowed
|
||||
* to use the gateway */
|
||||
#define SCP_GW_AUTHENTICATION 0x04
|
||||
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+345
-321
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -29,361 +28,386 @@
|
||||
|
||||
#include "os_calls.h"
|
||||
|
||||
extern struct log_config* s_log;
|
||||
extern struct log_config *s_log;
|
||||
|
||||
/* client API */
|
||||
/******************************************************************************/
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v0c_connect(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
scp_v0c_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 sz;
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 sz;
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
init_stream(c->out_s, c->in_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
init_stream(c->out_s, c->in_s->size);
|
||||
|
||||
LOG_DBG("[v0:%d] starting connection", __LINE__);
|
||||
g_tcp_set_non_blocking(c->in_sck);
|
||||
g_tcp_set_no_delay(c->in_sck);
|
||||
s_push_layer(c->out_s, channel_hdr, 8);
|
||||
LOG_DBG("[v0:%d] starting connection", __LINE__);
|
||||
g_tcp_set_non_blocking(c->in_sck);
|
||||
g_tcp_set_no_delay(c->in_sck);
|
||||
s_push_layer(c->out_s, channel_hdr, 8);
|
||||
|
||||
/* code */
|
||||
if (s->type == SCP_SESSION_TYPE_XVNC)
|
||||
{
|
||||
out_uint16_be(c->out_s, 0);
|
||||
}
|
||||
else if (s->type == SCP_SESSION_TYPE_XRDP)
|
||||
{
|
||||
out_uint16_be(c->out_s, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
sz = g_strlen(s->username);
|
||||
out_uint16_be(c->out_s, sz);
|
||||
out_uint8a(c->out_s, s->username, sz);
|
||||
/* code */
|
||||
if (s->type == SCP_SESSION_TYPE_XVNC)
|
||||
{
|
||||
out_uint16_be(c->out_s, 0);
|
||||
}
|
||||
else if (s->type == SCP_SESSION_TYPE_XRDP)
|
||||
{
|
||||
out_uint16_be(c->out_s, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
sz = g_strlen(s->password);
|
||||
out_uint16_be(c->out_s,sz);
|
||||
out_uint8a(c->out_s, s->password, sz);
|
||||
out_uint16_be(c->out_s, s->width);
|
||||
out_uint16_be(c->out_s, s->height);
|
||||
out_uint16_be(c->out_s, s->bpp);
|
||||
sz = g_strlen(s->username);
|
||||
out_uint16_be(c->out_s, sz);
|
||||
out_uint8a(c->out_s, s->username, sz);
|
||||
|
||||
s_mark_end(c->out_s);
|
||||
s_pop_layer(c->out_s, channel_hdr);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint16_be(c->out_s, sz);
|
||||
out_uint8a(c->out_s, s->password, sz);
|
||||
out_uint16_be(c->out_s, s->width);
|
||||
out_uint16_be(c->out_s, s->height);
|
||||
out_uint16_be(c->out_s, s->bpp);
|
||||
|
||||
/* version */
|
||||
out_uint32_be(c->out_s, 0);
|
||||
/* size */
|
||||
out_uint32_be(c->out_s, c->out_s->end - c->out_s->data);
|
||||
s_mark_end(c->out_s);
|
||||
s_pop_layer(c->out_s, channel_hdr);
|
||||
|
||||
if (0!=scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
/* version */
|
||||
out_uint32_be(c->out_s, 0);
|
||||
/* size */
|
||||
out_uint32_be(c->out_s, c->out_s->end - c->out_s->data);
|
||||
|
||||
if (0!=scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (0 != version)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
if (size < 14)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: packet size error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
/* getting payload */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0!=scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != version)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
/* check code */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
if (3 != sz)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
/* message payload */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
if (1 != sz)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: connection denied", __LINE__);
|
||||
return SCP_CLIENT_STATE_CONNECTION_DENIED;
|
||||
}
|
||||
if (size < 14)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: packet size error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, sz);
|
||||
s->display = sz;
|
||||
/* getting payload */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
LOG_DBG("[v0:%d] connection terminated", __LINE__);
|
||||
return SCP_CLIENT_STATE_END;
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
/* check code */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
|
||||
if (3 != sz)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
/* message payload */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
|
||||
if (1 != sz)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: connection denied", __LINE__);
|
||||
return SCP_CLIENT_STATE_CONNECTION_DENIED;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, sz);
|
||||
s->display = sz;
|
||||
|
||||
LOG_DBG("[v0:%d] connection terminated", __LINE__);
|
||||
return SCP_CLIENT_STATE_END;
|
||||
}
|
||||
|
||||
/* server API */
|
||||
/******************************************************************************/
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_accept(struct SCP_CONNECTION* c, struct SCP_SESSION** s, int skipVchk)
|
||||
scp_v0s_accept(struct SCP_CONNECTION *c, struct SCP_SESSION **s, int skipVchk)
|
||||
{
|
||||
tui32 version = 0;
|
||||
tui32 size;
|
||||
struct SCP_SESSION* session = 0;
|
||||
tui16 sz;
|
||||
tui32 code = 0;
|
||||
char buf[257];
|
||||
tui32 version = 0;
|
||||
tui32 size;
|
||||
struct SCP_SESSION *session = 0;
|
||||
tui16 sz;
|
||||
tui32 code = 0;
|
||||
char buf[257];
|
||||
|
||||
if (!skipVchk)
|
||||
{
|
||||
LOG_DBG("[v0:%d] starting connection", __LINE__);
|
||||
if (0 == scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
if (!skipVchk)
|
||||
{
|
||||
c->in_s->end = c->in_s->data + 8;
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_SERVER_STATE_VERSION_ERR;
|
||||
}
|
||||
LOG_DBG("[v0:%d] starting connection", __LINE__);
|
||||
|
||||
if (0 == scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
c->in_s->end = c->in_s->data + 8;
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
if (version != 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_SERVER_STATE_VERSION_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
init_stream(c->in_s, 8196);
|
||||
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
c->in_s->end = c->in_s->data + (size - 8);
|
||||
|
||||
in_uint16_be(c->in_s, code);
|
||||
|
||||
if (code == 0 || code == 10)
|
||||
{
|
||||
session = scp_session_create();
|
||||
|
||||
if (0 == session)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
scp_session_set_version(session, version);
|
||||
|
||||
if (code == 0)
|
||||
{
|
||||
scp_session_set_type(session, SCP_SESSION_TYPE_XVNC);
|
||||
}
|
||||
else
|
||||
{
|
||||
scp_session_set_type(session, SCP_SESSION_TYPE_XRDP);
|
||||
}
|
||||
|
||||
/* reading username */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
if (0 != scp_session_set_username(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting username", __LINE__);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* reading password */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
if (0 != scp_session_set_password(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting password", __LINE__);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* width */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
scp_session_set_width(session, sz);
|
||||
/* height */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
scp_session_set_height(session, sz);
|
||||
/* bpp */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
scp_session_set_bpp(session, (tui8)sz);
|
||||
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading domain */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_domain(session, buf);
|
||||
}
|
||||
}
|
||||
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading program */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_program(session, buf);
|
||||
}
|
||||
}
|
||||
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading directory */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_directory(session, buf);
|
||||
}
|
||||
}
|
||||
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading client IP address */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_client_ip(session, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (code == SCP_GW_AUTHENTICATION)
|
||||
{
|
||||
/* g_writeln("Command is SCP_GW_AUTHENTICATION"); */
|
||||
session = scp_session_create();
|
||||
|
||||
if (0 == session)
|
||||
{
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);*/
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
scp_session_set_version(session, version);
|
||||
scp_session_set_type(session, SCP_GW_AUTHENTICATION);
|
||||
/* reading username */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
/* g_writeln("Received user name: %s",buf); */
|
||||
if (0 != scp_session_set_username(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting username", __LINE__);*/
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* reading password */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
/* g_writeln("Received password: %s",buf); */
|
||||
if (0 != scp_session_set_password(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting password", __LINE__); */
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
init_stream(c->in_s, 8196);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
c->in_s->end = c->in_s->data + (size - 8);
|
||||
|
||||
in_uint16_be(c->in_s, code);
|
||||
|
||||
if (code == 0 || code == 10)
|
||||
{
|
||||
session = scp_session_create();
|
||||
if (0 == session)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
scp_session_set_version(session, version);
|
||||
if (code == 0)
|
||||
{
|
||||
scp_session_set_type(session, SCP_SESSION_TYPE_XVNC);
|
||||
}
|
||||
else
|
||||
{
|
||||
scp_session_set_type(session, SCP_SESSION_TYPE_XRDP);
|
||||
}
|
||||
|
||||
/* reading username */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz]='\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
if (0 != scp_session_set_username(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting username", __LINE__);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* reading password */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz]='\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
if (0 != scp_session_set_password(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting password", __LINE__);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* width */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
scp_session_set_width(session, sz);
|
||||
/* height */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
scp_session_set_height(session, sz);
|
||||
/* bpp */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
scp_session_set_bpp(session, (tui8)sz);
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading domain */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_domain(session, buf);
|
||||
}
|
||||
}
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading program */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_program(session, buf);
|
||||
}
|
||||
}
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading directory */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_directory(session, buf);
|
||||
}
|
||||
}
|
||||
if (s_check_rem(c->in_s, 2))
|
||||
{
|
||||
/* reading client IP address */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
if (sz > 0)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
buf[sz] = '\0';
|
||||
scp_session_set_client_ip(session, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (code == SCP_GW_AUTHENTICATION)
|
||||
{
|
||||
/* g_writeln("Command is SCP_GW_AUTHENTICATION"); */
|
||||
session = scp_session_create();
|
||||
if (0 == session)
|
||||
{
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);*/
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
scp_session_set_version(session, version);
|
||||
scp_session_set_type(session, SCP_GW_AUTHENTICATION);
|
||||
/* reading username */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz]='\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
/* g_writeln("Received user name: %s",buf); */
|
||||
if (0 != scp_session_set_username(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting username", __LINE__);*/
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* reading password */
|
||||
in_uint16_be(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
/* g_writeln("Received password: %s",buf); */
|
||||
if (0 != scp_session_set_password(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: error setting password", __LINE__); */
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
(*s)=session;
|
||||
return SCP_SERVER_STATE_OK;
|
||||
(*s) = session;
|
||||
return SCP_SERVER_STATE_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_allow_connection(struct SCP_CONNECTION* c, SCP_DISPLAY d)
|
||||
scp_v0s_allow_connection(struct SCP_CONNECTION *c, SCP_DISPLAY d)
|
||||
{
|
||||
out_uint32_be(c->out_s, 0); /* version */
|
||||
out_uint32_be(c->out_s, 14); /* size */
|
||||
out_uint16_be(c->out_s, 3); /* cmd */
|
||||
out_uint16_be(c->out_s, 1); /* data */
|
||||
out_uint16_be(c->out_s, d); /* data */
|
||||
s_mark_end(c->out_s);
|
||||
out_uint32_be(c->out_s, 0); /* version */
|
||||
out_uint32_be(c->out_s, 14); /* size */
|
||||
out_uint16_be(c->out_s, 3); /* cmd */
|
||||
out_uint16_be(c->out_s, 1); /* data */
|
||||
out_uint16_be(c->out_s, d); /* data */
|
||||
s_mark_end(c->out_s);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
LOG_DBG("[v0:%d] connection terminated (allowed)", __LINE__);
|
||||
return SCP_SERVER_STATE_OK;
|
||||
LOG_DBG("[v0:%d] connection terminated (allowed)", __LINE__);
|
||||
return SCP_SERVER_STATE_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_deny_connection(struct SCP_CONNECTION* c)
|
||||
scp_v0s_deny_connection(struct SCP_CONNECTION *c)
|
||||
{
|
||||
out_uint32_be(c->out_s, 0); /* version */
|
||||
out_uint32_be(c->out_s, 14); /* size */
|
||||
out_uint16_be(c->out_s, 3); /* cmd */
|
||||
out_uint16_be(c->out_s, 0); /* data = 0 - means NOT ok*/
|
||||
out_uint16_be(c->out_s, 0); /* reserved for display number*/
|
||||
s_mark_end(c->out_s);
|
||||
out_uint32_be(c->out_s, 0); /* version */
|
||||
out_uint32_be(c->out_s, 14); /* size */
|
||||
out_uint16_be(c->out_s, 3); /* cmd */
|
||||
out_uint16_be(c->out_s, 0); /* data = 0 - means NOT ok*/
|
||||
out_uint16_be(c->out_s, 0); /* reserved for display number*/
|
||||
s_mark_end(c->out_s);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
LOG_DBG("[v0:%d] connection terminated (denied)", __LINE__);
|
||||
return SCP_SERVER_STATE_OK;
|
||||
LOG_DBG("[v0:%d] connection terminated (denied)", __LINE__);
|
||||
return SCP_SERVER_STATE_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_replyauthentication(struct SCP_CONNECTION* c, unsigned short int value)
|
||||
scp_v0s_replyauthentication(struct SCP_CONNECTION *c, unsigned short int value)
|
||||
{
|
||||
out_uint32_be(c->out_s, 0); /* version */
|
||||
out_uint32_be(c->out_s, 14); /* size */
|
||||
/* cmd SCP_GW_AUTHENTICATION means authentication reply */
|
||||
out_uint16_be(c->out_s, SCP_GW_AUTHENTICATION);
|
||||
out_uint16_be(c->out_s, value); /* reply code */
|
||||
out_uint16_be(c->out_s, 0); /* dummy data */
|
||||
s_mark_end(c->out_s);
|
||||
out_uint32_be(c->out_s, 0); /* version */
|
||||
out_uint32_be(c->out_s, 14); /* size */
|
||||
/* cmd SCP_GW_AUTHENTICATION means authentication reply */
|
||||
out_uint16_be(c->out_s, SCP_GW_AUTHENTICATION);
|
||||
out_uint16_be(c->out_s, value); /* reply code */
|
||||
out_uint16_be(c->out_s, 0); /* dummy data */
|
||||
s_mark_end(c->out_s);
|
||||
|
||||
/* g_writeln("Total number of bytes that will be sent %d",c->out_s->end - c->out_s->data);*/
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__); */
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
/* g_writeln("Total number of bytes that will be sent %d",c->out_s->end - c->out_s->data);*/
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, c->out_s->end - c->out_s->data))
|
||||
{
|
||||
/* until syslog merge log_message(s_log, LOG_LEVEL_WARNING, "[v0:%d] connection aborted: network error", __LINE__); */
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
/* until syslog merge LOG_DBG(s_log, "[v0:%d] connection terminated (scp_v0s_deny_authentication)", __LINE__);*/
|
||||
return SCP_SERVER_STATE_OK;
|
||||
/* until syslog merge LOG_DBG(s_log, "[v0:%d] connection terminated (scp_v0s_deny_authentication)", __LINE__);*/
|
||||
return SCP_SERVER_STATE_OK;
|
||||
}
|
||||
|
||||
+22
-24
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -39,7 +38,7 @@
|
||||
* @param d display
|
||||
*
|
||||
*/
|
||||
enum SCP_CLIENT_STATES_E
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v0c_connect(struct SCP_CONNECTION* c, struct SCP_SESSION* s);
|
||||
|
||||
/* server API */
|
||||
@@ -52,7 +51,7 @@ scp_v0c_connect(struct SCP_CONNECTION* c, struct SCP_SESSION* s);
|
||||
* scp_vXs_accept() )
|
||||
*
|
||||
*/
|
||||
enum SCP_SERVER_STATES_E
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_accept(struct SCP_CONNECTION* c, struct SCP_SESSION** s, int skipVchk);
|
||||
|
||||
/**
|
||||
@@ -61,7 +60,7 @@ scp_v0s_accept(struct SCP_CONNECTION* c, struct SCP_SESSION** s, int skipVchk);
|
||||
* @param c connection descriptor
|
||||
*
|
||||
*/
|
||||
enum SCP_SERVER_STATES_E
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_allow_connection(struct SCP_CONNECTION* c, SCP_DISPLAY d);
|
||||
|
||||
/**
|
||||
@@ -70,17 +69,16 @@ scp_v0s_allow_connection(struct SCP_CONNECTION* c, SCP_DISPLAY d);
|
||||
* @param c connection descriptor
|
||||
*
|
||||
*/
|
||||
enum SCP_SERVER_STATES_E
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_deny_connection(struct SCP_CONNECTION* c);
|
||||
|
||||
/**
|
||||
* @brief send reply to an authentication request
|
||||
* @param c connection descriptor
|
||||
* @param value the reply code 0 means ok
|
||||
* @return
|
||||
* @return
|
||||
*/
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v0s_replyauthentication(struct SCP_CONNECTION* c, unsigned short int value);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+408
-375
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -31,443 +30,477 @@
|
||||
#include <stdio.h>
|
||||
|
||||
static enum SCP_CLIENT_STATES_E
|
||||
_scp_v1c_check_response(struct SCP_CONNECTION* c, struct SCP_SESSION* s);
|
||||
_scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s);
|
||||
|
||||
/* client API */
|
||||
/* 001 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_connect(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
scp_v1c_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui8 sz;
|
||||
tui32 size;
|
||||
tui8 sz;
|
||||
tui32 size;
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
size = 19 + 17 + 4 + g_strlen(s->hostname) + g_strlen(s->username) +
|
||||
g_strlen(s->password);
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
size = size + 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = size + 16;
|
||||
}
|
||||
size = 19 + 17 + 4 + g_strlen(s->hostname) + g_strlen(s->username) +
|
||||
g_strlen(s->password);
|
||||
|
||||
/* sending request */
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
size = size + 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = size + 16;
|
||||
}
|
||||
|
||||
/* header */
|
||||
out_uint32_be(c->out_s, 1); /* version */
|
||||
out_uint32_be(c->out_s, size);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT);
|
||||
out_uint16_be(c->out_s, 1);
|
||||
/* sending request */
|
||||
|
||||
/* body */
|
||||
out_uint8(c->out_s, s->type);
|
||||
out_uint16_be(c->out_s, s->height);
|
||||
out_uint16_be(c->out_s, s->width);
|
||||
out_uint8(c->out_s, s->bpp);
|
||||
out_uint8(c->out_s, s->rsr);
|
||||
out_uint8p(c->out_s, s->locale, 17);
|
||||
out_uint8(c->out_s, s->addr_type);
|
||||
/* header */
|
||||
out_uint32_be(c->out_s, 1); /* version */
|
||||
out_uint32_be(c->out_s, size);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT);
|
||||
out_uint16_be(c->out_s, 1);
|
||||
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
out_uint32_be(c->out_s, s->ipv4addr);
|
||||
}
|
||||
else if (s->addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
out_uint8p(c->out_s, s->ipv6addr, 16);
|
||||
}
|
||||
/* body */
|
||||
out_uint8(c->out_s, s->type);
|
||||
out_uint16_be(c->out_s, s->height);
|
||||
out_uint16_be(c->out_s, s->width);
|
||||
out_uint8(c->out_s, s->bpp);
|
||||
out_uint8(c->out_s, s->rsr);
|
||||
out_uint8p(c->out_s, s->locale, 17);
|
||||
out_uint8(c->out_s, s->addr_type);
|
||||
|
||||
sz = g_strlen(s->hostname);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->hostname, sz);
|
||||
sz = g_strlen(s->username);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->username, sz);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->password, sz);
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
out_uint32_be(c->out_s, s->ipv4addr);
|
||||
}
|
||||
else if (s->addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
out_uint8p(c->out_s, s->ipv6addr, 16);
|
||||
}
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
sz = g_strlen(s->hostname);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->hostname, sz);
|
||||
sz = g_strlen(s->username);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->username, sz);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->password, sz);
|
||||
|
||||
/* wait for response */
|
||||
return _scp_v1c_check_response(c, s);
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
/* wait for response */
|
||||
return _scp_v1c_check_response(c, s);
|
||||
}
|
||||
|
||||
/* 004 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_resend_credentials(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
scp_v1c_resend_credentials(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui8 sz;
|
||||
tui32 size;
|
||||
tui8 sz;
|
||||
tui32 size;
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
size = 12 + 2 + g_strlen(s->username) + g_strlen(s->password);
|
||||
size = 12 + 2 + g_strlen(s->username) + g_strlen(s->password);
|
||||
|
||||
/* sending request */
|
||||
/* header */
|
||||
out_uint32_be(c->out_s, 1); /* version */
|
||||
out_uint32_be(c->out_s, size);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT);
|
||||
out_uint16_be(c->out_s, 4);
|
||||
/* sending request */
|
||||
/* header */
|
||||
out_uint32_be(c->out_s, 1); /* version */
|
||||
out_uint32_be(c->out_s, size);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT);
|
||||
out_uint16_be(c->out_s, 4);
|
||||
|
||||
/* body */
|
||||
sz = g_strlen(s->username);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->username, sz);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->password, sz);
|
||||
/* body */
|
||||
sz = g_strlen(s->username);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->username, sz);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->password, sz);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
/* wait for response */
|
||||
return _scp_v1c_check_response(c, s);
|
||||
/* wait for response */
|
||||
return _scp_v1c_check_response(c, s);
|
||||
}
|
||||
|
||||
/* 021 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_pwd_change(struct SCP_CONNECTION* c, char* newpass);
|
||||
scp_v1c_pwd_change(struct SCP_CONNECTION *c, char *newpass);
|
||||
/* 022 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_pwd_change_cancel(struct SCP_CONNECTION* c);
|
||||
scp_v1c_pwd_change_cancel(struct SCP_CONNECTION *c);
|
||||
|
||||
/* 041 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_get_session_list(struct SCP_CONNECTION* c, int* scount,
|
||||
struct SCP_DISCONNECTED_SESSION** s)
|
||||
scp_v1c_get_session_list(struct SCP_CONNECTION *c, int *scount,
|
||||
struct SCP_DISCONNECTED_SESSION **s)
|
||||
{
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = 41;
|
||||
tui32 sescnt = 0; /* total session number */
|
||||
tui32 sestmp = 0; /* additional total session number */
|
||||
tui8 pktcnt = 0; /* packet session count */
|
||||
tui32 totalcnt = 0; /* session counter */
|
||||
tui8 continued = 0; /* continue flag */
|
||||
int firstpkt = 1; /* "first packet" flag */
|
||||
int idx;
|
||||
struct SCP_DISCONNECTED_SESSION* ds = 0;
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = 41;
|
||||
tui32 sescnt = 0; /* total session number */
|
||||
tui32 sestmp = 0; /* additional total session number */
|
||||
tui8 pktcnt = 0; /* packet session count */
|
||||
tui32 totalcnt = 0; /* session counter */
|
||||
tui8 continued = 0; /* continue flag */
|
||||
int firstpkt = 1; /* "first packet" flag */
|
||||
int idx;
|
||||
struct SCP_DISCONNECTED_SESSION *ds = 0;
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* we request session list */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
/* we request session list */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
/* then we wait for server response */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 1)
|
||||
do
|
||||
{
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
/* then we wait for server response */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
if (version != 1)
|
||||
{
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
if (size < 12)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_COMMAND_SET_DEFAULT)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != 42)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
if (firstpkt)
|
||||
{
|
||||
firstpkt = 0;
|
||||
in_uint32_be(c->in_s, sescnt);
|
||||
sestmp = sescnt;
|
||||
|
||||
ds = g_malloc(sizeof(struct SCP_DISCONNECTED_SESSION) * sescnt, 0);
|
||||
|
||||
if (ds == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint32_be(c->in_s, sestmp);
|
||||
}
|
||||
|
||||
in_uint8(c->in_s, continued);
|
||||
in_uint8(c->in_s, pktcnt);
|
||||
|
||||
for (idx = 0; idx < pktcnt; idx++)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).SID); /* session id */
|
||||
in_uint8(c->in_s, (ds[totalcnt]).type);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).height);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).width);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).bpp);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_days);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_hours);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_minutes);
|
||||
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).conn_year);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_month);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_day);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_hour);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_minute);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).addr_type);
|
||||
|
||||
if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).ipv4addr);
|
||||
}
|
||||
else if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->in_s, (ds[totalcnt]).ipv6addr, 16);
|
||||
}
|
||||
|
||||
totalcnt++;
|
||||
}
|
||||
}
|
||||
while (continued);
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
if (size < 12)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
printf("fine\n");
|
||||
/* return data... */
|
||||
(*scount) = sescnt;
|
||||
(*s) = ds;
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_COMMAND_SET_DEFAULT)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != 42)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
if (firstpkt)
|
||||
{
|
||||
firstpkt = 0;
|
||||
in_uint32_be(c->in_s, sescnt);
|
||||
sestmp = sescnt;
|
||||
|
||||
ds = g_malloc(sizeof(struct SCP_DISCONNECTED_SESSION) * sescnt, 0);
|
||||
if (ds == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint32_be(c->in_s, sestmp);
|
||||
}
|
||||
in_uint8(c->in_s, continued);
|
||||
in_uint8(c->in_s, pktcnt);
|
||||
|
||||
for (idx = 0; idx < pktcnt; idx++)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).SID); /* session id */
|
||||
in_uint8(c->in_s, (ds[totalcnt]).type);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).height);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).width);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).bpp);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_days);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_hours);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_minutes);
|
||||
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).conn_year);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_month);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_day);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_hour);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_minute);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).addr_type);
|
||||
if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).ipv4addr);
|
||||
}
|
||||
else if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->in_s, (ds[totalcnt]).ipv6addr, 16);
|
||||
}
|
||||
totalcnt++;
|
||||
}
|
||||
}
|
||||
while (continued);
|
||||
|
||||
printf("fine\n");
|
||||
/* return data... */
|
||||
(*scount) = sescnt;
|
||||
(*s) = ds;
|
||||
|
||||
return SCP_CLIENT_STATE_LIST_OK;
|
||||
return SCP_CLIENT_STATE_LIST_OK;
|
||||
}
|
||||
|
||||
/* 043 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_select_session(struct SCP_CONNECTION* c, struct SCP_SESSION* s,
|
||||
scp_v1c_select_session(struct SCP_CONNECTION *c, struct SCP_SESSION *s,
|
||||
SCP_SID sid)
|
||||
{
|
||||
tui32 version = 1;
|
||||
tui32 size = 16;
|
||||
tui16 cmd = 43;
|
||||
tui32 version = 1;
|
||||
tui32 size = 16;
|
||||
tui16 cmd = 43;
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* sending our selection */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
/* sending our selection */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
|
||||
out_uint32_be(c->out_s, sid);
|
||||
out_uint32_be(c->out_s, sid);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
/* waiting for response.... */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
/* waiting for response.... */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 1)
|
||||
{
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
if (size < 12)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (version != 1)
|
||||
{
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_COMMAND_SET_DEFAULT)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != 46)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
if (size < 12)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
|
||||
/* session display */
|
||||
in_uint16_be(c->in_s, (s->display));
|
||||
/*we don't need to return any data other than the display */
|
||||
/*because we already sent that */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
return SCP_CLIENT_STATE_OK;
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_COMMAND_SET_DEFAULT)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != 46)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
/* session display */
|
||||
in_uint16_be(c->in_s, (s->display));
|
||||
/*we don't need to return any data other than the display */
|
||||
/*because we already sent that */
|
||||
|
||||
return SCP_CLIENT_STATE_OK;
|
||||
}
|
||||
|
||||
/* 044 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_select_session_cancel(struct SCP_CONNECTION* c)
|
||||
scp_v1c_select_session_cancel(struct SCP_CONNECTION *c)
|
||||
{
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = 44;
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = 44;
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* sending our selection */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
/* sending our selection */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_DEFAULT); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
return SCP_CLIENT_STATE_END;
|
||||
return SCP_CLIENT_STATE_END;
|
||||
}
|
||||
|
||||
static enum SCP_CLIENT_STATES_E
|
||||
_scp_v1c_check_response(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
_scp_v1c_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 cmd;
|
||||
tui16 dim;
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 cmd;
|
||||
tui16 dim;
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 1)
|
||||
{
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (version != 1)
|
||||
{
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_COMMAND_SET_DEFAULT)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd == 2) /* connection denied */
|
||||
{
|
||||
in_uint16_be(c->in_s, dim);
|
||||
|
||||
if (s->errstr != 0)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
|
||||
s->errstr = g_malloc(dim + 1, 0);
|
||||
|
||||
if (s->errstr == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
in_uint8a(c->in_s, s->errstr, dim);
|
||||
(s->errstr)[dim] = '\0';
|
||||
|
||||
return SCP_CLIENT_STATE_CONNECTION_DENIED;
|
||||
}
|
||||
else if (cmd == 3) /* resend usr/pwd */
|
||||
{
|
||||
in_uint16_be(c->in_s, dim);
|
||||
|
||||
if (s->errstr != 0)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
|
||||
s->errstr = g_malloc(dim + 1, 0);
|
||||
|
||||
if (s->errstr == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
in_uint8a(c->in_s, s->errstr, dim);
|
||||
(s->errstr)[dim] = '\0';
|
||||
|
||||
return SCP_CLIENT_STATE_RESEND_CREDENTIALS;
|
||||
}
|
||||
else if (cmd == 20) /* password change */
|
||||
{
|
||||
in_uint16_be(c->in_s, dim);
|
||||
|
||||
if (s->errstr != 0)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
|
||||
s->errstr = g_malloc(dim + 1, 0);
|
||||
|
||||
if (s->errstr == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
in_uint8a(c->in_s, s->errstr, dim);
|
||||
(s->errstr)[dim] = '\0';
|
||||
|
||||
return SCP_CLIENT_STATE_PWD_CHANGE_REQ;
|
||||
}
|
||||
else if (cmd == 30) /* display */
|
||||
{
|
||||
in_uint16_be(c->in_s, s->display);
|
||||
|
||||
return SCP_CLIENT_STATE_OK;
|
||||
}
|
||||
//else if (cmd == 31) /* there's a disconnected session */
|
||||
//{
|
||||
// return SCP_CLIENT_STATE_RECONNECT_SINGLE;
|
||||
//}
|
||||
//else if (cmd == 33) /* display of a disconnected session */
|
||||
//{
|
||||
// return SCP_CLIENT_STATE_RECONNECT;
|
||||
//}
|
||||
else if (cmd == 40) /* session list */
|
||||
{
|
||||
return SCP_CLIENT_STATE_SESSION_LIST;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_COMMAND_SET_DEFAULT)
|
||||
{
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd == 2) /* connection denied */
|
||||
{
|
||||
in_uint16_be(c->in_s, dim);
|
||||
if (s->errstr != 0)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
s->errstr = g_malloc(dim + 1, 0);
|
||||
if (s->errstr == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
in_uint8a(c->in_s, s->errstr, dim);
|
||||
(s->errstr)[dim] = '\0';
|
||||
|
||||
return SCP_CLIENT_STATE_CONNECTION_DENIED;
|
||||
}
|
||||
else if (cmd == 3) /* resend usr/pwd */
|
||||
{
|
||||
in_uint16_be(c->in_s, dim);
|
||||
if (s->errstr != 0)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
s->errstr = g_malloc(dim + 1, 0);
|
||||
if (s->errstr == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
in_uint8a(c->in_s, s->errstr, dim);
|
||||
(s->errstr)[dim] = '\0';
|
||||
|
||||
return SCP_CLIENT_STATE_RESEND_CREDENTIALS;
|
||||
}
|
||||
else if (cmd == 20) /* password change */
|
||||
{
|
||||
in_uint16_be(c->in_s, dim);
|
||||
if (s->errstr != 0)
|
||||
{
|
||||
g_free(s->errstr);
|
||||
}
|
||||
s->errstr = g_malloc(dim + 1, 0);
|
||||
if (s->errstr == 0)
|
||||
{
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
in_uint8a(c->in_s, s->errstr, dim);
|
||||
(s->errstr)[dim] = '\0';
|
||||
|
||||
return SCP_CLIENT_STATE_PWD_CHANGE_REQ;
|
||||
}
|
||||
else if (cmd == 30) /* display */
|
||||
{
|
||||
in_uint16_be(c->in_s, s->display);
|
||||
|
||||
return SCP_CLIENT_STATE_OK;
|
||||
}
|
||||
//else if (cmd == 31) /* there's a disconnected session */
|
||||
//{
|
||||
// return SCP_CLIENT_STATE_RECONNECT_SINGLE;
|
||||
//}
|
||||
//else if (cmd == 33) /* display of a disconnected session */
|
||||
//{
|
||||
// return SCP_CLIENT_STATE_RECONNECT;
|
||||
//}
|
||||
else if (cmd == 40) /* session list */
|
||||
{
|
||||
return SCP_CLIENT_STATE_SESSION_LIST;
|
||||
}
|
||||
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
+17
-18
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+266
-249
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -33,215 +32,228 @@
|
||||
//extern struct log_config* s_log;
|
||||
|
||||
static enum SCP_CLIENT_STATES_E
|
||||
_scp_v1c_mng_check_response(struct SCP_CONNECTION* c, struct SCP_SESSION* s);
|
||||
_scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s);
|
||||
|
||||
/* client API */
|
||||
/* 001 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_mng_connect(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
scp_v1c_mng_connect(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui8 sz;
|
||||
tui32 size;
|
||||
tui8 sz;
|
||||
tui32 size;
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
size = 12 + 4 + g_strlen(s->hostname) + g_strlen(s->username) +
|
||||
g_strlen(s->password);
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
size = size + 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = size + 16;
|
||||
}
|
||||
size = 12 + 4 + g_strlen(s->hostname) + g_strlen(s->username) +
|
||||
g_strlen(s->password);
|
||||
|
||||
/* sending request */
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
size = size + 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = size + 16;
|
||||
}
|
||||
|
||||
/* header */
|
||||
out_uint32_be(c->out_s, 1); /* version */
|
||||
out_uint32_be(c->out_s, size);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN);
|
||||
/* sending request */
|
||||
|
||||
/* data */
|
||||
sz = g_strlen(s->username);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->username, sz);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->password, sz);
|
||||
/* header */
|
||||
out_uint32_be(c->out_s, 1); /* version */
|
||||
out_uint32_be(c->out_s, size);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN);
|
||||
|
||||
/* address */
|
||||
out_uint8(c->out_s, s->addr_type);
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
out_uint32_be(c->out_s, s->ipv4addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
out_uint8p(c->out_s, s->ipv6addr, 16);
|
||||
}
|
||||
/* data */
|
||||
sz = g_strlen(s->username);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->username, sz);
|
||||
sz = g_strlen(s->password);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->password, sz);
|
||||
|
||||
/* hostname */
|
||||
sz = g_strlen(s->hostname);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->hostname, sz);
|
||||
/* address */
|
||||
out_uint8(c->out_s, s->addr_type);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (s->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
out_uint32_be(c->out_s, s->ipv4addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
out_uint8p(c->out_s, s->ipv6addr, 16);
|
||||
}
|
||||
|
||||
/* wait for response */
|
||||
return _scp_v1c_mng_check_response(c, s);
|
||||
/* hostname */
|
||||
sz = g_strlen(s->hostname);
|
||||
out_uint8(c->out_s, sz);
|
||||
out_uint8p(c->out_s, s->hostname, sz);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
/* wait for response */
|
||||
return _scp_v1c_mng_check_response(c, s);
|
||||
}
|
||||
|
||||
/* 004 */
|
||||
enum SCP_CLIENT_STATES_E
|
||||
scp_v1c_mng_get_session_list(struct SCP_CONNECTION* c, int* scount,
|
||||
struct SCP_DISCONNECTED_SESSION** s)
|
||||
scp_v1c_mng_get_session_list(struct SCP_CONNECTION *c, int *scount,
|
||||
struct SCP_DISCONNECTED_SESSION **s)
|
||||
{
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = SCP_CMD_MNG_LIST_REQ; /* request session list */
|
||||
tui32 sescnt = 0; /* total session number */
|
||||
tui32 sestmp = 0; /* additional total session number */
|
||||
tui8 pktcnt = 0; /* packet session count */
|
||||
tui32 totalcnt = 0; /* session counter */
|
||||
tui8 continued = 0; /* continue flag */
|
||||
int firstpkt = 1; /* "first packet" flag */
|
||||
int idx;
|
||||
struct SCP_DISCONNECTED_SESSION* ds = 0;
|
||||
// tui8 addr[16];
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = SCP_CMD_MNG_LIST_REQ; /* request session list */
|
||||
tui32 sescnt = 0; /* total session number */
|
||||
tui32 sestmp = 0; /* additional total session number */
|
||||
tui8 pktcnt = 0; /* packet session count */
|
||||
tui32 totalcnt = 0; /* session counter */
|
||||
tui8 continued = 0; /* continue flag */
|
||||
int firstpkt = 1; /* "first packet" flag */
|
||||
int idx;
|
||||
struct SCP_DISCONNECTED_SESSION *ds = 0;
|
||||
// tui8 addr[16];
|
||||
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* we request session list */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
/* we request session list */
|
||||
out_uint32_be(c->out_s, version); /* version */
|
||||
out_uint32_be(c->out_s, size); /* size */
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE); /* cmdset */
|
||||
out_uint16_be(c->out_s, cmd); /* cmd */
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
/* then we wait for server response */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 1)
|
||||
do
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
/* then we wait for server response */
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
if (version != 1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
if (size < 12)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: size error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_COMMAND_SET_MANAGE)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_CMD_MNG_LIST) /* session list */
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
if (firstpkt)
|
||||
{
|
||||
firstpkt = 0;
|
||||
in_uint32_be(c->in_s, sescnt);
|
||||
sestmp = sescnt;
|
||||
|
||||
if (0 == sescnt)
|
||||
{
|
||||
/* return data... */
|
||||
(*scount) = sescnt;
|
||||
(*s) = NULL;
|
||||
|
||||
LOG_DBG("[v1c_mng] end list - no session on TS");
|
||||
return SCP_CLIENT_STATE_LIST_OK;
|
||||
}
|
||||
|
||||
ds = g_malloc(sizeof(struct SCP_DISCONNECTED_SESSION) * sescnt, 0);
|
||||
|
||||
if (ds == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: internal error", __LINE__);
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint32_be(c->in_s, sestmp);
|
||||
}
|
||||
|
||||
in_uint8(c->in_s, continued);
|
||||
in_uint8(c->in_s, pktcnt);
|
||||
|
||||
for (idx = 0; idx < pktcnt; idx++)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).SID); /* session id */
|
||||
in_uint8(c->in_s, (ds[totalcnt]).type);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).height);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).width);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).bpp);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_days);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_hours);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_minutes);
|
||||
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).conn_year);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_month);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_day);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_hour);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_minute);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).addr_type);
|
||||
|
||||
if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).ipv4addr);
|
||||
}
|
||||
|
||||
if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->in_s, (ds[totalcnt]).ipv6addr, 16);
|
||||
}
|
||||
|
||||
totalcnt++;
|
||||
}
|
||||
}
|
||||
while (continued);
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
if (size < 12)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: size error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SIZE_ERR;
|
||||
}
|
||||
/* return data... */
|
||||
(*scount) = sescnt;
|
||||
(*s) = ds;
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_COMMAND_SET_MANAGE)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_CMD_MNG_LIST) /* session list */
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
if (firstpkt)
|
||||
{
|
||||
firstpkt = 0;
|
||||
in_uint32_be(c->in_s, sescnt);
|
||||
sestmp = sescnt;
|
||||
|
||||
if (0 == sescnt)
|
||||
{
|
||||
/* return data... */
|
||||
(*scount) = sescnt;
|
||||
(*s) = NULL;
|
||||
|
||||
LOG_DBG("[v1c_mng] end list - no session on TS");
|
||||
return SCP_CLIENT_STATE_LIST_OK;
|
||||
}
|
||||
|
||||
ds = g_malloc(sizeof(struct SCP_DISCONNECTED_SESSION) * sescnt, 0);
|
||||
if (ds == 0)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: internal error", __LINE__);
|
||||
return SCP_CLIENT_STATE_INTERNAL_ERR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
in_uint32_be(c->in_s, sestmp);
|
||||
}
|
||||
in_uint8(c->in_s, continued);
|
||||
in_uint8(c->in_s, pktcnt);
|
||||
|
||||
for (idx = 0; idx < pktcnt; idx++)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).SID); /* session id */
|
||||
in_uint8(c->in_s, (ds[totalcnt]).type);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).height);
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).width);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).bpp);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_days);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_hours);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).idle_minutes);
|
||||
|
||||
in_uint16_be(c->in_s, (ds[totalcnt]).conn_year);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_month);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_day);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_hour);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).conn_minute);
|
||||
in_uint8(c->in_s, (ds[totalcnt]).addr_type);
|
||||
if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->in_s, (ds[totalcnt]).ipv4addr);
|
||||
}
|
||||
if ((ds[totalcnt]).addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->in_s, (ds[totalcnt]).ipv6addr, 16);
|
||||
}
|
||||
totalcnt++;
|
||||
}
|
||||
}
|
||||
while (continued);
|
||||
|
||||
/* return data... */
|
||||
(*scount) = sescnt;
|
||||
(*s) = ds;
|
||||
|
||||
LOG_DBG("[v1c_mng] end list");
|
||||
return SCP_CLIENT_STATE_LIST_OK;
|
||||
LOG_DBG("[v1c_mng] end list");
|
||||
return SCP_CLIENT_STATE_LIST_OK;
|
||||
}
|
||||
|
||||
/* 043 * /
|
||||
@@ -339,62 +351,67 @@ scp_v1c_select_session_cancel(struct SCP_CONNECTION* c)
|
||||
}*/
|
||||
|
||||
static enum SCP_CLIENT_STATES_E
|
||||
_scp_v1c_mng_check_response(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
_scp_v1c_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 cmd;
|
||||
tui8 dim;
|
||||
char buf[257];
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 cmd;
|
||||
tui8 dim;
|
||||
char buf[257];
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (version != 1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_CLIENT_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_COMMAND_SET_MANAGE)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_CLIENT_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_COMMAND_SET_MANAGE)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd == SCP_CMD_MNG_LOGIN_ALLOW) /* connection ok */
|
||||
{
|
||||
log_message(LOG_LEVEL_INFO, "[v1c_mng:%d] connection ok", __LINE__);
|
||||
return SCP_CLIENT_STATE_OK;
|
||||
}
|
||||
else if (cmd == SCP_CMD_MNG_LOGIN_DENY) /* connection denied */
|
||||
{
|
||||
in_uint8(c->in_s, dim);
|
||||
buf[dim] = '\0';
|
||||
in_uint8a(c->in_s, buf, dim);
|
||||
scp_session_set_errstr(s, buf);
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "[v1c_mng:%d] connection denied: %s", __LINE__ , s->errstr);
|
||||
return SCP_CLIENT_STATE_CONNECTION_DENIED;
|
||||
}
|
||||
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c-mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd == SCP_CMD_MNG_LOGIN_ALLOW) /* connection ok */
|
||||
{
|
||||
log_message(LOG_LEVEL_INFO, "[v1c_mng:%d] connection ok", __LINE__);
|
||||
return SCP_CLIENT_STATE_OK;
|
||||
}
|
||||
else if (cmd == SCP_CMD_MNG_LOGIN_DENY) /* connection denied */
|
||||
{
|
||||
in_uint8(c->in_s, dim);
|
||||
buf[dim]='\0';
|
||||
in_uint8a(c->in_s, buf, dim);
|
||||
scp_session_set_errstr(s, buf);
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "[v1c_mng:%d] connection denied: %s", __LINE__ , s->errstr);
|
||||
return SCP_CLIENT_STATE_CONNECTION_DENIED;
|
||||
}
|
||||
|
||||
log_message(LOG_LEVEL_WARNING, "[v1c-mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_CLIENT_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+602
-569
File diff suppressed because it is too large
Load Diff
+17
-18
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+276
-263
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -33,309 +32,323 @@
|
||||
//extern struct log_config* s_log;
|
||||
|
||||
static enum SCP_SERVER_STATES_E
|
||||
_scp_v1s_mng_check_response(struct SCP_CONNECTION* c, struct SCP_SESSION* s);
|
||||
_scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s);
|
||||
|
||||
/* server API */
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v1s_mng_accept(struct SCP_CONNECTION* c, struct SCP_SESSION** s)
|
||||
scp_v1s_mng_accept(struct SCP_CONNECTION *c, struct SCP_SESSION **s)
|
||||
{
|
||||
struct SCP_SESSION* session;
|
||||
tui32 ipaddr;
|
||||
tui16 cmd;
|
||||
tui8 sz;
|
||||
char buf[257];
|
||||
struct SCP_SESSION *session;
|
||||
tui32 ipaddr;
|
||||
tui16 cmd;
|
||||
tui8 sz;
|
||||
char buf[257];
|
||||
|
||||
/* reading command */
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != 1) /* manager login */
|
||||
{
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
/* reading command */
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
session = scp_session_create();
|
||||
if (0 == session)
|
||||
{
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
if (cmd != 1) /* manager login */
|
||||
{
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
scp_session_set_version(session, 1);
|
||||
scp_session_set_type(session, SCP_SESSION_TYPE_MANAGE);
|
||||
session = scp_session_create();
|
||||
|
||||
/* reading username */
|
||||
in_uint8(c->in_s, sz);
|
||||
buf[sz]='\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
if (0 != scp_session_set_username(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
if (0 == session)
|
||||
{
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* reading password */
|
||||
in_uint8(c->in_s, sz);
|
||||
buf[sz]='\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
if (0 != scp_session_set_password(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
scp_session_set_version(session, 1);
|
||||
scp_session_set_type(session, SCP_SESSION_TYPE_MANAGE);
|
||||
|
||||
/* reading remote address */
|
||||
in_uint8(c->in_s, sz);
|
||||
if (sz == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->in_s, ipaddr);
|
||||
scp_session_set_addr(session, SCP_ADDRESS_TYPE_IPV4_BIN, &ipaddr);
|
||||
}
|
||||
else if (sz == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, 16);
|
||||
scp_session_set_addr(session, SCP_ADDRESS_TYPE_IPV6_BIN, buf);
|
||||
}
|
||||
/* reading username */
|
||||
in_uint8(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
/* reading hostname */
|
||||
in_uint8(c->in_s, sz);
|
||||
buf[sz]='\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
if (0 != scp_session_set_hostname(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
if (0 != scp_session_set_username(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* returning the struct */
|
||||
(*s)=session;
|
||||
/* reading password */
|
||||
in_uint8(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
return SCP_SERVER_STATE_START_MANAGE;
|
||||
if (0 != scp_session_set_password(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* reading remote address */
|
||||
in_uint8(c->in_s, sz);
|
||||
|
||||
if (sz == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->in_s, ipaddr);
|
||||
scp_session_set_addr(session, SCP_ADDRESS_TYPE_IPV4_BIN, &ipaddr);
|
||||
}
|
||||
else if (sz == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->in_s, buf, 16);
|
||||
scp_session_set_addr(session, SCP_ADDRESS_TYPE_IPV6_BIN, buf);
|
||||
}
|
||||
|
||||
/* reading hostname */
|
||||
in_uint8(c->in_s, sz);
|
||||
buf[sz] = '\0';
|
||||
in_uint8a(c->in_s, buf, sz);
|
||||
|
||||
if (0 != scp_session_set_hostname(session, buf))
|
||||
{
|
||||
scp_session_destroy(session);
|
||||
return SCP_SERVER_STATE_INTERNAL_ERR;
|
||||
}
|
||||
|
||||
/* returning the struct */
|
||||
(*s) = session;
|
||||
|
||||
return SCP_SERVER_STATE_START_MANAGE;
|
||||
}
|
||||
|
||||
/* 002 */
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v1s_mng_allow_connection(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
scp_v1s_mng_allow_connection(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
init_stream(c->out_s,c->out_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
out_uint32_be(c->out_s, 1);
|
||||
/* packet size: 4 + 4 + 2 + 2 */
|
||||
/* version + size + cmdset + cmd */
|
||||
out_uint32_be(c->out_s, 12);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN_ALLOW);
|
||||
out_uint32_be(c->out_s, 1);
|
||||
/* packet size: 4 + 4 + 2 + 2 */
|
||||
/* version + size + cmdset + cmd */
|
||||
out_uint32_be(c->out_s, 12);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN_ALLOW);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, 12))
|
||||
{
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, 12))
|
||||
{
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
return _scp_v1s_mng_check_response(c, s);
|
||||
return _scp_v1s_mng_check_response(c, s);
|
||||
}
|
||||
|
||||
/* 003 */
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v1s_mng_deny_connection(struct SCP_CONNECTION* c, char* reason)
|
||||
scp_v1s_mng_deny_connection(struct SCP_CONNECTION *c, char *reason)
|
||||
{
|
||||
int rlen;
|
||||
int rlen;
|
||||
|
||||
init_stream(c->out_s,c->out_s->size);
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* forcing message not to exceed 64k */
|
||||
rlen = g_strlen(reason);
|
||||
if (rlen > 65535)
|
||||
{
|
||||
rlen = 65535;
|
||||
}
|
||||
/* forcing message not to exceed 64k */
|
||||
rlen = g_strlen(reason);
|
||||
|
||||
out_uint32_be(c->out_s, 1);
|
||||
/* packet size: 4 + 4 + 2 + 2 + 2 + strlen(reason)*/
|
||||
/* version + size + cmdset + cmd + msglen + msg */
|
||||
out_uint32_be(c->out_s, rlen+14);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN_DENY);
|
||||
out_uint16_be(c->out_s, rlen);
|
||||
out_uint8p(c->out_s, reason, rlen);
|
||||
if (rlen > 65535)
|
||||
{
|
||||
rlen = 65535;
|
||||
}
|
||||
|
||||
if (0!=scp_tcp_force_send(c->in_sck, c->out_s->data, rlen+14))
|
||||
{
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
out_uint32_be(c->out_s, 1);
|
||||
/* packet size: 4 + 4 + 2 + 2 + 2 + strlen(reason)*/
|
||||
/* version + size + cmdset + cmd + msglen + msg */
|
||||
out_uint32_be(c->out_s, rlen + 14);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, SCP_CMD_MNG_LOGIN_DENY);
|
||||
out_uint16_be(c->out_s, rlen);
|
||||
out_uint8p(c->out_s, reason, rlen);
|
||||
|
||||
return SCP_SERVER_STATE_END;
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, rlen + 14))
|
||||
{
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
return SCP_SERVER_STATE_END;
|
||||
}
|
||||
|
||||
/* 006 */
|
||||
enum SCP_SERVER_STATES_E
|
||||
scp_v1s_mng_list_sessions(struct SCP_CONNECTION* c, struct SCP_SESSION* s,
|
||||
int sescnt, struct SCP_DISCONNECTED_SESSION* ds)
|
||||
scp_v1s_mng_list_sessions(struct SCP_CONNECTION *c, struct SCP_SESSION *s,
|
||||
int sescnt, struct SCP_DISCONNECTED_SESSION *ds)
|
||||
{
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = SCP_CMD_MNG_LIST;
|
||||
int pktcnt;
|
||||
int idx;
|
||||
int sidx;
|
||||
int pidx;
|
||||
struct SCP_DISCONNECTED_SESSION* cds;
|
||||
tui32 version = 1;
|
||||
tui32 size = 12;
|
||||
tui16 cmd = SCP_CMD_MNG_LIST;
|
||||
int pktcnt;
|
||||
int idx;
|
||||
int sidx;
|
||||
int pidx;
|
||||
struct SCP_DISCONNECTED_SESSION *cds;
|
||||
|
||||
/* calculating the number of packets to send */
|
||||
pktcnt=sescnt/SCP_SERVER_MAX_LIST_SIZE;
|
||||
if ((sescnt%SCP_SERVER_MAX_LIST_SIZE)!=0)
|
||||
{
|
||||
pktcnt++;
|
||||
}
|
||||
/* calculating the number of packets to send */
|
||||
pktcnt = sescnt / SCP_SERVER_MAX_LIST_SIZE;
|
||||
|
||||
for (idx=0; idx<pktcnt; idx++)
|
||||
{
|
||||
/* ok, we send session session list */
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* size: ver+size+cmdset+cmd+sescnt+continue+count */
|
||||
size=4+4+2+2+4+1+1;
|
||||
|
||||
/* header */
|
||||
s_push_layer(c->out_s, channel_hdr, 8);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, cmd);
|
||||
|
||||
/* session count */
|
||||
out_uint32_be(c->out_s, sescnt);
|
||||
|
||||
/* setting the continue flag */
|
||||
if ((idx+1)*SCP_SERVER_MAX_LIST_SIZE >= sescnt)
|
||||
if ((sescnt % SCP_SERVER_MAX_LIST_SIZE) != 0)
|
||||
{
|
||||
out_uint8(c->out_s, 0);
|
||||
/* setting session count for this packet */
|
||||
pidx=sescnt-(idx*SCP_SERVER_MAX_LIST_SIZE);
|
||||
out_uint8(c->out_s, pidx);
|
||||
}
|
||||
else
|
||||
{
|
||||
out_uint8(c->out_s, 1);
|
||||
/* setting session count for this packet */
|
||||
pidx=SCP_SERVER_MAX_LIST_SIZE;
|
||||
out_uint8(c->out_s, pidx);
|
||||
pktcnt++;
|
||||
}
|
||||
|
||||
/* adding session descriptors */
|
||||
for (sidx=0; sidx<pidx; sidx++)
|
||||
for (idx = 0; idx < pktcnt; idx++)
|
||||
{
|
||||
/* shortcut to the current session to send */
|
||||
cds=ds+((idx)*SCP_SERVER_MAX_LIST_SIZE)+sidx;
|
||||
/* ok, we send session session list */
|
||||
init_stream(c->out_s, c->out_s->size);
|
||||
|
||||
/* session data */
|
||||
out_uint32_be(c->out_s, cds->SID); /* session id */
|
||||
out_uint8(c->out_s, cds->type);
|
||||
out_uint16_be(c->out_s, cds->height);
|
||||
out_uint16_be(c->out_s, cds->width);
|
||||
out_uint8(c->out_s, cds->bpp);
|
||||
out_uint8(c->out_s, cds->idle_days);
|
||||
out_uint8(c->out_s, cds->idle_hours);
|
||||
out_uint8(c->out_s, cds->idle_minutes);
|
||||
size += 13;
|
||||
/* size: ver+size+cmdset+cmd+sescnt+continue+count */
|
||||
size = 4 + 4 + 2 + 2 + 4 + 1 + 1;
|
||||
|
||||
out_uint16_be(c->out_s, cds->conn_year);
|
||||
out_uint8(c->out_s, cds->conn_month);
|
||||
out_uint8(c->out_s, cds->conn_day);
|
||||
out_uint8(c->out_s, cds->conn_hour);
|
||||
out_uint8(c->out_s, cds->conn_minute);
|
||||
out_uint8(c->out_s, cds->addr_type);
|
||||
size += 7;
|
||||
/* header */
|
||||
s_push_layer(c->out_s, channel_hdr, 8);
|
||||
out_uint16_be(c->out_s, SCP_COMMAND_SET_MANAGE);
|
||||
out_uint16_be(c->out_s, cmd);
|
||||
|
||||
if (cds->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->out_s, cds->ipv4addr);
|
||||
size += 4;
|
||||
}
|
||||
else if (cds->addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->out_s, cds->ipv6addr, 16);
|
||||
size += 16;
|
||||
}
|
||||
/* session count */
|
||||
out_uint32_be(c->out_s, sescnt);
|
||||
|
||||
/* setting the continue flag */
|
||||
if ((idx + 1)*SCP_SERVER_MAX_LIST_SIZE >= sescnt)
|
||||
{
|
||||
out_uint8(c->out_s, 0);
|
||||
/* setting session count for this packet */
|
||||
pidx = sescnt - (idx * SCP_SERVER_MAX_LIST_SIZE);
|
||||
out_uint8(c->out_s, pidx);
|
||||
}
|
||||
else
|
||||
{
|
||||
out_uint8(c->out_s, 1);
|
||||
/* setting session count for this packet */
|
||||
pidx = SCP_SERVER_MAX_LIST_SIZE;
|
||||
out_uint8(c->out_s, pidx);
|
||||
}
|
||||
|
||||
/* adding session descriptors */
|
||||
for (sidx = 0; sidx < pidx; sidx++)
|
||||
{
|
||||
/* shortcut to the current session to send */
|
||||
cds = ds + ((idx) * SCP_SERVER_MAX_LIST_SIZE) + sidx;
|
||||
|
||||
/* session data */
|
||||
out_uint32_be(c->out_s, cds->SID); /* session id */
|
||||
out_uint8(c->out_s, cds->type);
|
||||
out_uint16_be(c->out_s, cds->height);
|
||||
out_uint16_be(c->out_s, cds->width);
|
||||
out_uint8(c->out_s, cds->bpp);
|
||||
out_uint8(c->out_s, cds->idle_days);
|
||||
out_uint8(c->out_s, cds->idle_hours);
|
||||
out_uint8(c->out_s, cds->idle_minutes);
|
||||
size += 13;
|
||||
|
||||
out_uint16_be(c->out_s, cds->conn_year);
|
||||
out_uint8(c->out_s, cds->conn_month);
|
||||
out_uint8(c->out_s, cds->conn_day);
|
||||
out_uint8(c->out_s, cds->conn_hour);
|
||||
out_uint8(c->out_s, cds->conn_minute);
|
||||
out_uint8(c->out_s, cds->addr_type);
|
||||
size += 7;
|
||||
|
||||
if (cds->addr_type == SCP_ADDRESS_TYPE_IPV4)
|
||||
{
|
||||
in_uint32_be(c->out_s, cds->ipv4addr);
|
||||
size += 4;
|
||||
}
|
||||
else if (cds->addr_type == SCP_ADDRESS_TYPE_IPV6)
|
||||
{
|
||||
in_uint8a(c->out_s, cds->ipv6addr, 16);
|
||||
size += 16;
|
||||
}
|
||||
}
|
||||
|
||||
s_pop_layer(c->out_s, channel_hdr);
|
||||
out_uint32_be(c->out_s, version);
|
||||
out_uint32_be(c->out_s, size);
|
||||
|
||||
if (0 != scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
s_pop_layer(c->out_s, channel_hdr);
|
||||
out_uint32_be(c->out_s, version);
|
||||
out_uint32_be(c->out_s, size);
|
||||
|
||||
if (0!=scp_tcp_force_send(c->in_sck, c->out_s->data, size))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
return _scp_v1s_mng_check_response(c, s);
|
||||
return _scp_v1s_mng_check_response(c, s);
|
||||
}
|
||||
|
||||
static enum SCP_SERVER_STATES_E
|
||||
_scp_v1s_mng_check_response(struct SCP_CONNECTION* c, struct SCP_SESSION* s)
|
||||
_scp_v1s_mng_check_response(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
|
||||
{
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 cmd;
|
||||
// tui8 dim;
|
||||
// char buf[257];
|
||||
tui32 version;
|
||||
tui32 size;
|
||||
tui16 cmd;
|
||||
// tui8 dim;
|
||||
// char buf[257];
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
if (version != 1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_SERVER_STATE_VERSION_ERR;
|
||||
}
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
if (version != 1)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: version error", __LINE__);
|
||||
return SCP_SERVER_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, size);
|
||||
|
||||
init_stream(c->in_s, c->in_s->size);
|
||||
|
||||
/* read the rest of the packet */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, size - 8))
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: network error", __LINE__);
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd != SCP_COMMAND_SET_MANAGE)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
|
||||
if (cmd == SCP_CMD_MNG_LIST_REQ) /* request session list */
|
||||
{
|
||||
log_message(LOG_LEVEL_INFO, "[v1s_mng:%d] request session list", __LINE__);
|
||||
return SCP_SERVER_STATE_MNG_LISTREQ;
|
||||
}
|
||||
else if (cmd == SCP_CMD_MNG_ACTION) /* execute an action */
|
||||
{
|
||||
/*in_uint8(c->in_s, dim);
|
||||
buf[dim]='\0';
|
||||
in_uint8a(c->in_s, buf, dim);
|
||||
scp_session_set_errstr(s, buf);*/
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "[v1s_mng:%d] action request", __LINE__);
|
||||
return SCP_SERVER_STATE_MNG_ACTION;
|
||||
}
|
||||
|
||||
/* else if (cmd == 20) / * password change * /
|
||||
{
|
||||
in_uint16_be(c->in_s, s->display);
|
||||
|
||||
return SCP_SERVER_STATE_OK;
|
||||
}
|
||||
else if (cmd == 40) / * session list * /
|
||||
{
|
||||
return SCP_SERVER_STATE_SESSION_LIST;
|
||||
}*/
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd != SCP_COMMAND_SET_MANAGE)
|
||||
{
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
in_uint16_be(c->in_s, cmd);
|
||||
if (cmd == SCP_CMD_MNG_LIST_REQ) /* request session list */
|
||||
{
|
||||
log_message(LOG_LEVEL_INFO, "[v1s_mng:%d] request session list", __LINE__);
|
||||
return SCP_SERVER_STATE_MNG_LISTREQ;
|
||||
}
|
||||
else if (cmd == SCP_CMD_MNG_ACTION) /* execute an action */
|
||||
{
|
||||
/*in_uint8(c->in_s, dim);
|
||||
buf[dim]='\0';
|
||||
in_uint8a(c->in_s, buf, dim);
|
||||
scp_session_set_errstr(s, buf);*/
|
||||
|
||||
log_message(LOG_LEVEL_INFO, "[v1s_mng:%d] action request", __LINE__);
|
||||
return SCP_SERVER_STATE_MNG_ACTION;
|
||||
}
|
||||
/* else if (cmd == 20) / * password change * /
|
||||
{
|
||||
in_uint16_be(c->in_s, s->display);
|
||||
|
||||
return SCP_SERVER_STATE_OK;
|
||||
}
|
||||
else if (cmd == 40) / * session list * /
|
||||
{
|
||||
return SCP_SERVER_STATE_SESSION_LIST;
|
||||
}*/
|
||||
|
||||
log_message(LOG_LEVEL_WARNING, "[v1s_mng:%d] connection aborted: sequence error", __LINE__);
|
||||
return SCP_SERVER_STATE_SEQUENCE_ERR;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
+34
-35
@@ -1,21 +1,20 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -28,26 +27,26 @@
|
||||
#include "libscp_vX.h"
|
||||
|
||||
/* server API */
|
||||
enum SCP_SERVER_STATES_E scp_vXs_accept(struct SCP_CONNECTION* c, struct SCP_SESSION** s)
|
||||
enum SCP_SERVER_STATES_E scp_vXs_accept(struct SCP_CONNECTION *c, struct SCP_SESSION **s)
|
||||
{
|
||||
tui32 version;
|
||||
tui32 version;
|
||||
|
||||
/* reading version and packet size */
|
||||
if (0!=scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
/* reading version and packet size */
|
||||
if (0 != scp_tcp_force_recv(c->in_sck, c->in_s->data, 8))
|
||||
{
|
||||
return SCP_SERVER_STATE_NETWORK_ERR;
|
||||
}
|
||||
|
||||
in_uint32_be(c->in_s, version);
|
||||
in_uint32_be(c->in_s, version);
|
||||
|
||||
if (version == 0)
|
||||
{
|
||||
return scp_v0s_accept(c, s, 1);
|
||||
}
|
||||
else if (version == 1)
|
||||
{
|
||||
return scp_v1s_accept(c, s, 1);
|
||||
}
|
||||
if (version == 0)
|
||||
{
|
||||
return scp_v0s_accept(c, s, 1);
|
||||
}
|
||||
else if (version == 1)
|
||||
{
|
||||
return scp_v1s_accept(c, s, 1);
|
||||
}
|
||||
|
||||
return SCP_SERVER_STATE_VERSION_ERR;
|
||||
return SCP_SERVER_STATE_VERSION_ERR;
|
||||
}
|
||||
|
||||
+18
-19
@@ -1,28 +1,27 @@
|
||||
/*
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
xrdp: A Remote Desktop Protocol server.
|
||||
Copyright (C) Jay Sorg 2005-2010
|
||||
*/
|
||||
/**
|
||||
* xrdp: A Remote Desktop Protocol server.
|
||||
*
|
||||
* Copyright (C) Jay Sorg 2004-2012
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @file libscp_vX.h
|
||||
* @brief libscp version neutral code header
|
||||
* @author Simone Fedele
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LIBSCP_VX_H
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user