This diff has been collapsed as it changes many lines, (527 lines changed) Show them Hide them | |||||
@@ -0,0 +1,527 | |||||
|
1 | #!/bin/sh | |||
|
2 | # install - install a program, script, or datafile | |||
|
3 | ||||
|
4 | scriptversion=2011-01-19.21; # UTC | |||
|
5 | ||||
|
6 | # This originates from X11R5 (mit/util/scripts/install.sh), which was | |||
|
7 | # later released in X11R6 (xc/config/util/install.sh) with the | |||
|
8 | # following copyright and license. | |||
|
9 | # | |||
|
10 | # Copyright (C) 1994 X Consortium | |||
|
11 | # | |||
|
12 | # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
|
13 | # of this software and associated documentation files (the "Software"), to | |||
|
14 | # deal in the Software without restriction, including without limitation the | |||
|
15 | # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |||
|
16 | # sell copies of the Software, and to permit persons to whom the Software is | |||
|
17 | # furnished to do so, subject to the following conditions: | |||
|
18 | # | |||
|
19 | # The above copyright notice and this permission notice shall be included in | |||
|
20 | # all copies or substantial portions of the Software. | |||
|
21 | # | |||
|
22 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
|
23 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
|
24 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
|
25 | # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | |||
|
26 | # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- | |||
|
27 | # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
|
28 | # | |||
|
29 | # Except as contained in this notice, the name of the X Consortium shall not | |||
|
30 | # be used in advertising or otherwise to promote the sale, use or other deal- | |||
|
31 | # ings in this Software without prior written authorization from the X Consor- | |||
|
32 | # tium. | |||
|
33 | # | |||
|
34 | # | |||
|
35 | # FSF changes to this file are in the public domain. | |||
|
36 | # | |||
|
37 | # Calling this script install-sh is preferred over install.sh, to prevent | |||
|
38 | # `make' implicit rules from creating a file called install from it | |||
|
39 | # when there is no Makefile. | |||
|
40 | # | |||
|
41 | # This script is compatible with the BSD install script, but was written | |||
|
42 | # from scratch. | |||
|
43 | ||||
|
44 | nl=' | |||
|
45 | ' | |||
|
46 | IFS=" "" $nl" | |||
|
47 | ||||
|
48 | # set DOITPROG to echo to test this script | |||
|
49 | ||||
|
50 | # Don't use :- since 4.3BSD and earlier shells don't like it. | |||
|
51 | doit=${DOITPROG-} | |||
|
52 | if test -z "$doit"; then | |||
|
53 | doit_exec=exec | |||
|
54 | else | |||
|
55 | doit_exec=$doit | |||
|
56 | fi | |||
|
57 | ||||
|
58 | # Put in absolute file names if you don't have them in your path; | |||
|
59 | # or use environment vars. | |||
|
60 | ||||
|
61 | chgrpprog=${CHGRPPROG-chgrp} | |||
|
62 | chmodprog=${CHMODPROG-chmod} | |||
|
63 | chownprog=${CHOWNPROG-chown} | |||
|
64 | cmpprog=${CMPPROG-cmp} | |||
|
65 | cpprog=${CPPROG-cp} | |||
|
66 | mkdirprog=${MKDIRPROG-mkdir} | |||
|
67 | mvprog=${MVPROG-mv} | |||
|
68 | rmprog=${RMPROG-rm} | |||
|
69 | stripprog=${STRIPPROG-strip} | |||
|
70 | ||||
|
71 | posix_glob='?' | |||
|
72 | initialize_posix_glob=' | |||
|
73 | test "$posix_glob" != "?" || { | |||
|
74 | if (set -f) 2>/dev/null; then | |||
|
75 | posix_glob= | |||
|
76 | else | |||
|
77 | posix_glob=: | |||
|
78 | fi | |||
|
79 | } | |||
|
80 | ' | |||
|
81 | ||||
|
82 | posix_mkdir= | |||
|
83 | ||||
|
84 | # Desired mode of installed file. | |||
|
85 | mode=0755 | |||
|
86 | ||||
|
87 | chgrpcmd= | |||
|
88 | chmodcmd=$chmodprog | |||
|
89 | chowncmd= | |||
|
90 | mvcmd=$mvprog | |||
|
91 | rmcmd="$rmprog -f" | |||
|
92 | stripcmd= | |||
|
93 | ||||
|
94 | src= | |||
|
95 | dst= | |||
|
96 | dir_arg= | |||
|
97 | dst_arg= | |||
|
98 | ||||
|
99 | copy_on_change=false | |||
|
100 | no_target_directory= | |||
|
101 | ||||
|
102 | usage="\ | |||
|
103 | Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE | |||
|
104 | or: $0 [OPTION]... SRCFILES... DIRECTORY | |||
|
105 | or: $0 [OPTION]... -t DIRECTORY SRCFILES... | |||
|
106 | or: $0 [OPTION]... -d DIRECTORIES... | |||
|
107 | ||||
|
108 | In the 1st form, copy SRCFILE to DSTFILE. | |||
|
109 | In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. | |||
|
110 | In the 4th, create DIRECTORIES. | |||
|
111 | ||||
|
112 | Options: | |||
|
113 | --help display this help and exit. | |||
|
114 | --version display version info and exit. | |||
|
115 | ||||
|
116 | -c (ignored) | |||
|
117 | -C install only if different (preserve the last data modification time) | |||
|
118 | -d create directories instead of installing files. | |||
|
119 | -g GROUP $chgrpprog installed files to GROUP. | |||
|
120 | -m MODE $chmodprog installed files to MODE. | |||
|
121 | -o USER $chownprog installed files to USER. | |||
|
122 | -s $stripprog installed files. | |||
|
123 | -t DIRECTORY install into DIRECTORY. | |||
|
124 | -T report an error if DSTFILE is a directory. | |||
|
125 | ||||
|
126 | Environment variables override the default commands: | |||
|
127 | CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG | |||
|
128 | RMPROG STRIPPROG | |||
|
129 | " | |||
|
130 | ||||
|
131 | while test $# -ne 0; do | |||
|
132 | case $1 in | |||
|
133 | -c) ;; | |||
|
134 | ||||
|
135 | -C) copy_on_change=true;; | |||
|
136 | ||||
|
137 | -d) dir_arg=true;; | |||
|
138 | ||||
|
139 | -g) chgrpcmd="$chgrpprog $2" | |||
|
140 | shift;; | |||
|
141 | ||||
|
142 | --help) echo "$usage"; exit $?;; | |||
|
143 | ||||
|
144 | -m) mode=$2 | |||
|
145 | case $mode in | |||
|
146 | *' '* | *' '* | *' | |||
|
147 | '* | *'*'* | *'?'* | *'['*) | |||
|
148 | echo "$0: invalid mode: $mode" >&2 | |||
|
149 | exit 1;; | |||
|
150 | esac | |||
|
151 | shift;; | |||
|
152 | ||||
|
153 | -o) chowncmd="$chownprog $2" | |||
|
154 | shift;; | |||
|
155 | ||||
|
156 | -s) stripcmd=$stripprog;; | |||
|
157 | ||||
|
158 | -t) dst_arg=$2 | |||
|
159 | # Protect names problematic for `test' and other utilities. | |||
|
160 | case $dst_arg in | |||
|
161 | -* | [=\(\)!]) dst_arg=./$dst_arg;; | |||
|
162 | esac | |||
|
163 | shift;; | |||
|
164 | ||||
|
165 | -T) no_target_directory=true;; | |||
|
166 | ||||
|
167 | --version) echo "$0 $scriptversion"; exit $?;; | |||
|
168 | ||||
|
169 | --) shift | |||
|
170 | break;; | |||
|
171 | ||||
|
172 | -*) echo "$0: invalid option: $1" >&2 | |||
|
173 | exit 1;; | |||
|
174 | ||||
|
175 | *) break;; | |||
|
176 | esac | |||
|
177 | shift | |||
|
178 | done | |||
|
179 | ||||
|
180 | if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then | |||
|
181 | # When -d is used, all remaining arguments are directories to create. | |||
|
182 | # When -t is used, the destination is already specified. | |||
|
183 | # Otherwise, the last argument is the destination. Remove it from $@. | |||
|
184 | for arg | |||
|
185 | do | |||
|
186 | if test -n "$dst_arg"; then | |||
|
187 | # $@ is not empty: it contains at least $arg. | |||
|
188 | set fnord "$@" "$dst_arg" | |||
|
189 | shift # fnord | |||
|
190 | fi | |||
|
191 | shift # arg | |||
|
192 | dst_arg=$arg | |||
|
193 | # Protect names problematic for `test' and other utilities. | |||
|
194 | case $dst_arg in | |||
|
195 | -* | [=\(\)!]) dst_arg=./$dst_arg;; | |||
|
196 | esac | |||
|
197 | done | |||
|
198 | fi | |||
|
199 | ||||
|
200 | if test $# -eq 0; then | |||
|
201 | if test -z "$dir_arg"; then | |||
|
202 | echo "$0: no input file specified." >&2 | |||
|
203 | exit 1 | |||
|
204 | fi | |||
|
205 | # It's OK to call `install-sh -d' without argument. | |||
|
206 | # This can happen when creating conditional directories. | |||
|
207 | exit 0 | |||
|
208 | fi | |||
|
209 | ||||
|
210 | if test -z "$dir_arg"; then | |||
|
211 | do_exit='(exit $ret); exit $ret' | |||
|
212 | trap "ret=129; $do_exit" 1 | |||
|
213 | trap "ret=130; $do_exit" 2 | |||
|
214 | trap "ret=141; $do_exit" 13 | |||
|
215 | trap "ret=143; $do_exit" 15 | |||
|
216 | ||||
|
217 | # Set umask so as not to create temps with too-generous modes. | |||
|
218 | # However, 'strip' requires both read and write access to temps. | |||
|
219 | case $mode in | |||
|
220 | # Optimize common cases. | |||
|
221 | *644) cp_umask=133;; | |||
|
222 | *755) cp_umask=22;; | |||
|
223 | ||||
|
224 | *[0-7]) | |||
|
225 | if test -z "$stripcmd"; then | |||
|
226 | u_plus_rw= | |||
|
227 | else | |||
|
228 | u_plus_rw='% 200' | |||
|
229 | fi | |||
|
230 | cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; | |||
|
231 | *) | |||
|
232 | if test -z "$stripcmd"; then | |||
|
233 | u_plus_rw= | |||
|
234 | else | |||
|
235 | u_plus_rw=,u+rw | |||
|
236 | fi | |||
|
237 | cp_umask=$mode$u_plus_rw;; | |||
|
238 | esac | |||
|
239 | fi | |||
|
240 | ||||
|
241 | for src | |||
|
242 | do | |||
|
243 | # Protect names problematic for `test' and other utilities. | |||
|
244 | case $src in | |||
|
245 | -* | [=\(\)!]) src=./$src;; | |||
|
246 | esac | |||
|
247 | ||||
|
248 | if test -n "$dir_arg"; then | |||
|
249 | dst=$src | |||
|
250 | dstdir=$dst | |||
|
251 | test -d "$dstdir" | |||
|
252 | dstdir_status=$? | |||
|
253 | else | |||
|
254 | ||||
|
255 | # Waiting for this to be detected by the "$cpprog $src $dsttmp" command | |||
|
256 | # might cause directories to be created, which would be especially bad | |||
|
257 | # if $src (and thus $dsttmp) contains '*'. | |||
|
258 | if test ! -f "$src" && test ! -d "$src"; then | |||
|
259 | echo "$0: $src does not exist." >&2 | |||
|
260 | exit 1 | |||
|
261 | fi | |||
|
262 | ||||
|
263 | if test -z "$dst_arg"; then | |||
|
264 | echo "$0: no destination specified." >&2 | |||
|
265 | exit 1 | |||
|
266 | fi | |||
|
267 | dst=$dst_arg | |||
|
268 | ||||
|
269 | # If destination is a directory, append the input filename; won't work | |||
|
270 | # if double slashes aren't ignored. | |||
|
271 | if test -d "$dst"; then | |||
|
272 | if test -n "$no_target_directory"; then | |||
|
273 | echo "$0: $dst_arg: Is a directory" >&2 | |||
|
274 | exit 1 | |||
|
275 | fi | |||
|
276 | dstdir=$dst | |||
|
277 | dst=$dstdir/`basename "$src"` | |||
|
278 | dstdir_status=0 | |||
|
279 | else | |||
|
280 | # Prefer dirname, but fall back on a substitute if dirname fails. | |||
|
281 | dstdir=` | |||
|
282 | (dirname "$dst") 2>/dev/null || | |||
|
283 | expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ | |||
|
284 | X"$dst" : 'X\(//\)[^/]' \| \ | |||
|
285 | X"$dst" : 'X\(//\)$' \| \ | |||
|
286 | X"$dst" : 'X\(/\)' \| . 2>/dev/null || | |||
|
287 | echo X"$dst" | | |||
|
288 | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ | |||
|
289 | s//\1/ | |||
|
290 | q | |||
|
291 | } | |||
|
292 | /^X\(\/\/\)[^/].*/{ | |||
|
293 | s//\1/ | |||
|
294 | q | |||
|
295 | } | |||
|
296 | /^X\(\/\/\)$/{ | |||
|
297 | s//\1/ | |||
|
298 | q | |||
|
299 | } | |||
|
300 | /^X\(\/\).*/{ | |||
|
301 | s//\1/ | |||
|
302 | q | |||
|
303 | } | |||
|
304 | s/.*/./; q' | |||
|
305 | ` | |||
|
306 | ||||
|
307 | test -d "$dstdir" | |||
|
308 | dstdir_status=$? | |||
|
309 | fi | |||
|
310 | fi | |||
|
311 | ||||
|
312 | obsolete_mkdir_used=false | |||
|
313 | ||||
|
314 | if test $dstdir_status != 0; then | |||
|
315 | case $posix_mkdir in | |||
|
316 | '') | |||
|
317 | # Create intermediate dirs using mode 755 as modified by the umask. | |||
|
318 | # This is like FreeBSD 'install' as of 1997-10-28. | |||
|
319 | umask=`umask` | |||
|
320 | case $stripcmd.$umask in | |||
|
321 | # Optimize common cases. | |||
|
322 | *[2367][2367]) mkdir_umask=$umask;; | |||
|
323 | .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; | |||
|
324 | ||||
|
325 | *[0-7]) | |||
|
326 | mkdir_umask=`expr $umask + 22 \ | |||
|
327 | - $umask % 100 % 40 + $umask % 20 \ | |||
|
328 | - $umask % 10 % 4 + $umask % 2 | |||
|
329 | `;; | |||
|
330 | *) mkdir_umask=$umask,go-w;; | |||
|
331 | esac | |||
|
332 | ||||
|
333 | # With -d, create the new directory with the user-specified mode. | |||
|
334 | # Otherwise, rely on $mkdir_umask. | |||
|
335 | if test -n "$dir_arg"; then | |||
|
336 | mkdir_mode=-m$mode | |||
|
337 | else | |||
|
338 | mkdir_mode= | |||
|
339 | fi | |||
|
340 | ||||
|
341 | posix_mkdir=false | |||
|
342 | case $umask in | |||
|
343 | *[123567][0-7][0-7]) | |||
|
344 | # POSIX mkdir -p sets u+wx bits regardless of umask, which | |||
|
345 | # is incompatible with FreeBSD 'install' when (umask & 300) != 0. | |||
|
346 | ;; | |||
|
347 | *) | |||
|
348 | tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ | |||
|
349 | trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 | |||
|
350 | ||||
|
351 | if (umask $mkdir_umask && | |||
|
352 | exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 | |||
|
353 | then | |||
|
354 | if test -z "$dir_arg" || { | |||
|
355 | # Check for POSIX incompatibilities with -m. | |||
|
356 | # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or | |||
|
357 | # other-writeable bit of parent directory when it shouldn't. | |||
|
358 | # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. | |||
|
359 | ls_ld_tmpdir=`ls -ld "$tmpdir"` | |||
|
360 | case $ls_ld_tmpdir in | |||
|
361 | d????-?r-*) different_mode=700;; | |||
|
362 | d????-?--*) different_mode=755;; | |||
|
363 | *) false;; | |||
|
364 | esac && | |||
|
365 | $mkdirprog -m$different_mode -p -- "$tmpdir" && { | |||
|
366 | ls_ld_tmpdir_1=`ls -ld "$tmpdir"` | |||
|
367 | test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" | |||
|
368 | } | |||
|
369 | } | |||
|
370 | then posix_mkdir=: | |||
|
371 | fi | |||
|
372 | rmdir "$tmpdir/d" "$tmpdir" | |||
|
373 | else | |||
|
374 | # Remove any dirs left behind by ancient mkdir implementations. | |||
|
375 | rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null | |||
|
376 | fi | |||
|
377 | trap '' 0;; | |||
|
378 | esac;; | |||
|
379 | esac | |||
|
380 | ||||
|
381 | if | |||
|
382 | $posix_mkdir && ( | |||
|
383 | umask $mkdir_umask && | |||
|
384 | $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" | |||
|
385 | ) | |||
|
386 | then : | |||
|
387 | else | |||
|
388 | ||||
|
389 | # The umask is ridiculous, or mkdir does not conform to POSIX, | |||
|
390 | # or it failed possibly due to a race condition. Create the | |||
|
391 | # directory the slow way, step by step, checking for races as we go. | |||
|
392 | ||||
|
393 | case $dstdir in | |||
|
394 | /*) prefix='/';; | |||
|
395 | [-=\(\)!]*) prefix='./';; | |||
|
396 | *) prefix='';; | |||
|
397 | esac | |||
|
398 | ||||
|
399 | eval "$initialize_posix_glob" | |||
|
400 | ||||
|
401 | oIFS=$IFS | |||
|
402 | IFS=/ | |||
|
403 | $posix_glob set -f | |||
|
404 | set fnord $dstdir | |||
|
405 | shift | |||
|
406 | $posix_glob set +f | |||
|
407 | IFS=$oIFS | |||
|
408 | ||||
|
409 | prefixes= | |||
|
410 | ||||
|
411 | for d | |||
|
412 | do | |||
|
413 | test X"$d" = X && continue | |||
|
414 | ||||
|
415 | prefix=$prefix$d | |||
|
416 | if test -d "$prefix"; then | |||
|
417 | prefixes= | |||
|
418 | else | |||
|
419 | if $posix_mkdir; then | |||
|
420 | (umask=$mkdir_umask && | |||
|
421 | $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break | |||
|
422 | # Don't fail if two instances are running concurrently. | |||
|
423 | test -d "$prefix" || exit 1 | |||
|
424 | else | |||
|
425 | case $prefix in | |||
|
426 | *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; | |||
|
427 | *) qprefix=$prefix;; | |||
|
428 | esac | |||
|
429 | prefixes="$prefixes '$qprefix'" | |||
|
430 | fi | |||
|
431 | fi | |||
|
432 | prefix=$prefix/ | |||
|
433 | done | |||
|
434 | ||||
|
435 | if test -n "$prefixes"; then | |||
|
436 | # Don't fail if two instances are running concurrently. | |||
|
437 | (umask $mkdir_umask && | |||
|
438 | eval "\$doit_exec \$mkdirprog $prefixes") || | |||
|
439 | test -d "$dstdir" || exit 1 | |||
|
440 | obsolete_mkdir_used=true | |||
|
441 | fi | |||
|
442 | fi | |||
|
443 | fi | |||
|
444 | ||||
|
445 | if test -n "$dir_arg"; then | |||
|
446 | { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && | |||
|
447 | { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && | |||
|
448 | { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || | |||
|
449 | test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 | |||
|
450 | else | |||
|
451 | ||||
|
452 | # Make a couple of temp file names in the proper directory. | |||
|
453 | dsttmp=$dstdir/_inst.$$_ | |||
|
454 | rmtmp=$dstdir/_rm.$$_ | |||
|
455 | ||||
|
456 | # Trap to clean up those temp files at exit. | |||
|
457 | trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 | |||
|
458 | ||||
|
459 | # Copy the file name to the temp name. | |||
|
460 | (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && | |||
|
461 | ||||
|
462 | # and set any options; do chmod last to preserve setuid bits. | |||
|
463 | # | |||
|
464 | # If any of these fail, we abort the whole thing. If we want to | |||
|
465 | # ignore errors from any of these, just make sure not to ignore | |||
|
466 | # errors from the above "$doit $cpprog $src $dsttmp" command. | |||
|
467 | # | |||
|
468 | { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && | |||
|
469 | { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && | |||
|
470 | { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && | |||
|
471 | { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && | |||
|
472 | ||||
|
473 | # If -C, don't bother to copy if it wouldn't change the file. | |||
|
474 | if $copy_on_change && | |||
|
475 | old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && | |||
|
476 | new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && | |||
|
477 | ||||
|
478 | eval "$initialize_posix_glob" && | |||
|
479 | $posix_glob set -f && | |||
|
480 | set X $old && old=:$2:$4:$5:$6 && | |||
|
481 | set X $new && new=:$2:$4:$5:$6 && | |||
|
482 | $posix_glob set +f && | |||
|
483 | ||||
|
484 | test "$old" = "$new" && | |||
|
485 | $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 | |||
|
486 | then | |||
|
487 | rm -f "$dsttmp" | |||
|
488 | else | |||
|
489 | # Rename the file to the real destination. | |||
|
490 | $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || | |||
|
491 | ||||
|
492 | # The rename failed, perhaps because mv can't rename something else | |||
|
493 | # to itself, or perhaps because mv is so ancient that it does not | |||
|
494 | # support -f. | |||
|
495 | { | |||
|
496 | # Now remove or move aside any old file at destination location. | |||
|
497 | # We try this two ways since rm can't unlink itself on some | |||
|
498 | # systems and the destination file might be busy for other | |||
|
499 | # reasons. In this case, the final cleanup might fail but the new | |||
|
500 | # file should still install successfully. | |||
|
501 | { | |||
|
502 | test ! -f "$dst" || | |||
|
503 | $doit $rmcmd -f "$dst" 2>/dev/null || | |||
|
504 | { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && | |||
|
505 | { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } | |||
|
506 | } || | |||
|
507 | { echo "$0: cannot unlink or rename $dst" >&2 | |||
|
508 | (exit 1); exit 1 | |||
|
509 | } | |||
|
510 | } && | |||
|
511 | ||||
|
512 | # Now rename the file to the real destination. | |||
|
513 | $doit $mvcmd "$dsttmp" "$dst" | |||
|
514 | } | |||
|
515 | fi || exit 1 | |||
|
516 | ||||
|
517 | trap '' 0 | |||
|
518 | fi | |||
|
519 | done | |||
|
520 | ||||
|
521 | # Local variables: | |||
|
522 | # eval: (add-hook 'write-file-hooks 'time-stamp) | |||
|
523 | # time-stamp-start: "scriptversion=" | |||
|
524 | # time-stamp-format: "%:y-%02m-%02d.%02H" | |||
|
525 | # time-stamp-time-zone: "UTC" | |||
|
526 | # time-stamp-end: "; # UTC" | |||
|
527 | # End: |
@@ -1,30 +1,35 | |||||
1 | # -*- Autoconf -*- |
|
1 | # -*- Autoconf -*- | |
2 | # Process this file with autoconf to produce a configure script. |
|
2 | # Process this file with autoconf to produce a configure script. | |
3 | AC_PREREQ([2.67]) |
|
3 | AC_PREREQ([2.67]) | |
4 | AC_INIT([librs232],[2.1.0],[alexis.jeandet@lpp.polytechnique.fr],[rs232],[http://www.lpp.fr]) |
|
4 | AC_INIT([librs232],[2.1.0],[alexis.jeandet@lpp.polytechnique.fr],[rs232],[http://www.lpp.fr]) | |
5 | AM_INIT_AUTOMAKE([1.10 -Wall foreign]) |
|
5 | AM_INIT_AUTOMAKE([1.10 -Wall foreign]) | |
6 | AC_CONFIG_MACRO_DIR([m4]) |
|
6 | AC_CONFIG_MACRO_DIR([m4]) | |
7 | # Checks for programs. |
|
7 | # Checks for programs. | |
8 | AC_CONFIG_HEADERS([src/rs232config.h]) |
|
8 | AC_CONFIG_HEADERS([src/rs232config.h]) | |
9 |
|
9 | |||
10 | AC_PROG_CC |
|
10 | AC_PROG_CC | |
11 | AM_PROG_CC_STDC |
|
11 | AM_PROG_CC_STDC | |
|
12 | AC_PROG_INSTALL | |||
12 | AC_C_CONST |
|
13 | AC_C_CONST | |
13 | AC_LIBTOOL_WIN32_DLL |
|
14 | AC_LIBTOOL_WIN32_DLL | |
14 | AM_PROG_LIBTOOL |
|
15 | AM_PROG_LIBTOOL | |
|
16 | AC_PROG_LN_S | |||
|
17 | AC_PROG_MAKE_SET | |||
|
18 | AC_PROG_RANLIB | |||
|
19 | ||||
15 | #LT_INIT |
|
20 | #LT_INIT | |
16 | #AC_PROG_MAKE_SET |
|
21 | #AC_PROG_MAKE_SET | |
17 |
|
22 | |||
18 | # Checks for libraries. |
|
23 | # Checks for libraries. | |
19 |
|
24 | |||
20 | # Checks for header files. |
|
25 | # Checks for header files. | |
21 | AC_CHECK_HEADERS([stdio.h string.h fcntl.h errno.h unistd.h termios.h termio.h windows.h]) |
|
26 | AC_CHECK_HEADERS([stdio.h string.h fcntl.h errno.h unistd.h termios.h termio.h dirent.h windows.h]) | |
22 |
|
27 | |||
23 | AC_SUBST([RS232_SO_VERSION], [2:1:0]) |
|
28 | AC_SUBST([RS232_SO_VERSION], [2:1:0]) | |
24 | AC_SUBST([RS232_API_VERSION], [2.1]) |
|
29 | AC_SUBST([RS232_API_VERSION], [2.1]) | |
25 | # Checks for typedefs, structures, and compiler characteristics. |
|
30 | # Checks for typedefs, structures, and compiler characteristics. | |
26 |
|
31 | |||
27 | # Checks for library functions. |
|
32 | # Checks for library functions. | |
28 | AC_CONFIG_FILES([Makefile src/Makefile rs232-${RS232_API_VERSION}.pc:rs232.pc.in]) |
|
33 | AC_CONFIG_FILES([Makefile src/Makefile rs232-${RS232_API_VERSION}.pc:rs232.pc.in]) | |
29 |
|
34 | |||
30 | AC_OUTPUT |
|
35 | AC_OUTPUT |
@@ -1,11 +1,11 | |||||
1 | prefix=@prefix@ |
|
1 | prefix=@prefix@ | |
2 | exec_prefix=@exec_prefix@ |
|
2 | exec_prefix=@exec_prefix@ | |
3 | libdir=@libdir@ |
|
3 | libdir=@libdir@ | |
4 | includedir=@includedir@ |
|
4 | includedir=@includedir@ | |
5 |
|
5 | |||
6 | Name: @PACKAGE_NAME@ |
|
6 | Name: @PACKAGE_NAME@ | |
7 |
Description: |
|
7 | Description: Standard RS232 library. | |
8 | Version: @PACKAGE_VERSION@ |
|
8 | Version: @PACKAGE_VERSION@ | |
9 | URL: @PACKAGE_URL@ |
|
9 | URL: @PACKAGE_URL@ | |
10 | Libs: -L${libdir} -lrs232-@RS232_API_VERSION@ |
|
10 | Libs: -L${libdir} -lrs232-@RS232_API_VERSION@ | |
11 | Cflags: -I${includedir}/rs232-@RS232_API_VERSION@ -I${libdir}/rs232-@RS232_API_VERSION@/include |
|
11 | Cflags: -I${includedir}/rs232-@RS232_API_VERSION@ -I${libdir}/rs232-@RS232_API_VERSION@/include |
@@ -1,455 +1,516 | |||||
1 | #include <stdio.h> |
|
1 | #include <stdio.h> | |
2 | #include <unistd.h> |
|
2 | #include <unistd.h> | |
3 | #include <fcntl.h> |
|
3 | #include <fcntl.h> | |
4 | #include <string.h> |
|
4 | #include <string.h> | |
5 | #include <errno.h> |
|
5 | #include <errno.h> | |
6 | #include <malloc.h> |
|
6 | #include <malloc.h> | |
|
7 | #include <dirent.h> | |||
|
8 | #include <limits.h> | |||
|
9 | #include <stdlib.h> | |||
|
10 | #include <sys/stat.h> | |||
7 | #include "rs232config.h" |
|
11 | #include "rs232config.h" | |
|
12 | ||||
8 | #ifdef HAVE_TERMIOS_H |
|
13 | #ifdef HAVE_TERMIOS_H | |
9 | #include <termios.h> |
|
14 | #include <termios.h> | |
10 | #endif |
|
15 | #endif | |
11 | #ifdef HAVE_TERMIO_H |
|
16 | #ifdef HAVE_TERMIO_H | |
12 | #include <termio.h> |
|
17 | #include <termio.h> | |
13 | #endif |
|
18 | #endif | |
14 | #include "RS232.h" |
|
19 | #include "RS232.h" | |
15 |
|
20 | |||
16 | #ifdef HAVE_WINDOWS_H |
|
21 | #ifdef HAVE_WINDOWS_H | |
17 | #else |
|
22 | #else | |
18 | #ifdef HAVE_TERMIOS_H |
|
23 | #ifdef HAVE_TERMIOS_H | |
19 | rs232speed_t rs232cfspeed(unsigned int BaudeRate); |
|
24 | rs232speed_t rs232cfspeed(unsigned int BaudeRate); | |
20 |
|
25 | |||
21 | rs232port_t rs232open(char* psPortName) |
|
26 | rs232port_t rs232open(char* psPortName) | |
22 | { |
|
27 | { | |
23 | rs232port_t fd; |
|
28 | rs232port_t fd; | |
24 | fd = (rs232port_t)open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY); |
|
29 | fd = (rs232port_t)open(psPortName, O_RDWR | O_NOCTTY | O_NDELAY); | |
25 | fcntl((int)fd, F_SETFL, 0); |
|
30 | fcntl((int)fd, F_SETFL, 0); | |
26 | //fd = open(psPortName, O_RDWR | O_NOCTTY); |
|
31 | //fd = open(psPortName, O_RDWR | O_NOCTTY); | |
27 | #ifdef debug |
|
32 | #ifdef debug | |
28 | if(fd==-1)printf("can't open Port\n"); |
|
33 | if(fd==-1)printf("can't open Port\n"); | |
29 | #endif |
|
34 | #endif | |
30 | return fd; |
|
35 | return fd; | |
31 | } |
|
36 | } | |
32 |
|
37 | |||
33 | int rs232close(rs232port_t fd) |
|
38 | int rs232close(rs232port_t fd) | |
34 | { |
|
39 | { | |
35 | if ((int)fd == -1) |
|
40 | if ((int)fd == -1) | |
36 | { |
|
41 | { | |
37 | return -1; |
|
42 | return -1; | |
38 | } |
|
43 | } | |
39 | else |
|
44 | else | |
40 | { |
|
45 | { | |
41 | close(fd); |
|
46 | close(fd); | |
42 | return 0; |
|
47 | return 0; | |
43 | } |
|
48 | } | |
44 | } |
|
49 | } | |
45 |
|
50 | |||
46 | rs232portslist_t* rs232getportlist() |
|
51 | rs232portslist_t* rs232getportlist() | |
47 | { |
|
52 | { | |
48 |
|
53 | struct dirent *dp; | ||
|
54 | char* path="/dev/serial/by-id"; | |||
|
55 | DIR *dir = opendir(path); | |||
|
56 | rs232portslist_t* firstitem=NULL; | |||
|
57 | rs232portslist_t* previtem=NULL; | |||
|
58 | char linkname[1024]; | |||
|
59 | int i=0; | |||
|
60 | if(dir!=NULL) | |||
|
61 | { | |||
|
62 | while ((dp=readdir(dir)) != NULL) | |||
|
63 | { | |||
|
64 | char* name = (char*)malloc(1024); | |||
|
65 | for(i=0;i<1024;i++) | |||
|
66 | { | |||
|
67 | name[i]='\0'; | |||
|
68 | linkname[i]='\0'; | |||
|
69 | } | |||
|
70 | struct stat statbuf; | |||
|
71 | strcpy(linkname,path); | |||
|
72 | strcat(linkname,"/"); | |||
|
73 | strcat(linkname,dp->d_name); | |||
|
74 | lstat(linkname, &statbuf); | |||
|
75 | if(S_ISLNK(statbuf.st_mode)) | |||
|
76 | { | |||
|
77 | if(-1!=readlink(linkname,name,1024)) | |||
|
78 | { | |||
|
79 | for(i=0;i<1024;i++) | |||
|
80 | { | |||
|
81 | linkname[i]='\0'; | |||
|
82 | } | |||
|
83 | strcpy(linkname,path); | |||
|
84 | strcat(linkname,"/"); | |||
|
85 | strcat(linkname,name); | |||
|
86 | for(i=0;i<1024;i++) | |||
|
87 | { | |||
|
88 | name[i]='\0'; | |||
|
89 | } | |||
|
90 | if(NULL!=realpath(linkname, name)) | |||
|
91 | { | |||
|
92 | rs232portslist_t* item = (rs232portslist_t*)malloc(sizeof(rs232portslist_t)); | |||
|
93 | item->name = name; | |||
|
94 | item->next = NULL; | |||
|
95 | if(NULL!=previtem)previtem->next = item; | |||
|
96 | previtem = item; | |||
|
97 | if(NULL==firstitem)firstitem = item; | |||
|
98 | } | |||
|
99 | ||||
|
100 | } | |||
|
101 | } | |||
49 |
|
102 | |||
|
103 | } | |||
|
104 | } | |||
|
105 | return firstitem; | |||
50 | } |
|
106 | } | |
51 |
|
107 | |||
52 | void rs232deleteportlist(rs232portslist_t* list) |
|
108 | void rs232deleteportlist(rs232portslist_t* list) | |
53 | { |
|
109 | { | |
54 |
|
110 | if(list!=NULL) | ||
|
111 | { | |||
|
112 | if(list->next != NULL) | |||
|
113 | rs232deleteportlist(list->next); | |||
|
114 | free(list); | |||
|
115 | } | |||
55 | } |
|
116 | } | |
56 |
|
117 | |||
57 | int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop) |
|
118 | int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop) | |
58 | { |
|
119 | { | |
59 | if ((int)fd == -1) |
|
120 | if ((int)fd == -1) | |
60 | { |
|
121 | { | |
61 | return -1; |
|
122 | return -1; | |
62 | } |
|
123 | } | |
63 | else |
|
124 | else | |
64 | { |
|
125 | { | |
65 | struct termios terminos; |
|
126 | struct termios terminos; | |
66 | tcgetattr(fd, &terminos); |
|
127 | tcgetattr(fd, &terminos); | |
67 | cfsetispeed(&terminos, rs232cfspeed(BaudeRate)); |
|
128 | cfsetispeed(&terminos, rs232cfspeed(BaudeRate)); | |
68 | cfsetospeed(&terminos, rs232cfspeed(BaudeRate)); |
|
129 | cfsetospeed(&terminos, rs232cfspeed(BaudeRate)); | |
69 | terminos.c_cflag |= (CLOCAL | CREAD); |
|
130 | terminos.c_cflag |= (CLOCAL | CREAD); | |
70 | rs232cfparity((int)fd, &terminos, Parity); |
|
131 | rs232cfparity((int)fd, &terminos, Parity); | |
71 | rs232cfnbstop((int)fd, &terminos, NbStop); |
|
132 | rs232cfnbstop((int)fd, &terminos, NbStop); | |
72 | rs232cfcsize((int)fd, &terminos, ChSize); |
|
133 | rs232cfcsize((int)fd, &terminos, ChSize); | |
73 | terminos.c_cc[VMIN]=0; |
|
134 | terminos.c_cc[VMIN]=0; | |
74 | terminos.c_cc[VTIME]=1; |
|
135 | terminos.c_cc[VTIME]=1; | |
75 | tcflush(fd, TCIFLUSH); |
|
136 | tcflush(fd, TCIFLUSH); | |
76 | #ifdef debug |
|
137 | #ifdef debug | |
77 | if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n"); |
|
138 | if(tcsetattr(fd, TCSANOW, &terminos)!=0)printf("bad setup\n"); | |
78 | #else |
|
139 | #else | |
79 | tcsetattr(fd, TCSANOW, &terminos); |
|
140 | tcsetattr(fd, TCSANOW, &terminos); | |
80 | #endif |
|
141 | #endif | |
81 | return 0; |
|
142 | return 0; | |
82 | } |
|
143 | } | |
83 | } |
|
144 | } | |
84 |
|
145 | |||
85 | int rs232setbaudrate(rs232port_t fd, int baudrate) |
|
146 | int rs232setbaudrate(rs232port_t fd, int baudrate) | |
86 | { |
|
147 | { | |
87 | if ((int)fd == -1) |
|
148 | if ((int)fd == -1) | |
88 | { |
|
149 | { | |
89 | return fd; |
|
150 | return fd; | |
90 | } |
|
151 | } | |
91 | else |
|
152 | else | |
92 | { |
|
153 | { | |
93 | struct termios terminos; |
|
154 | struct termios terminos; | |
94 | tcgetattr((int)fd, &terminos); |
|
155 | tcgetattr((int)fd, &terminos); | |
95 | cfsetispeed(&terminos, rs232cfspeed(baudrate)); |
|
156 | cfsetispeed(&terminos, rs232cfspeed(baudrate)); | |
96 | cfsetospeed(&terminos, rs232cfspeed(baudrate)); |
|
157 | cfsetospeed(&terminos, rs232cfspeed(baudrate)); | |
97 | tcsetattr((int)fd, TCSANOW, &terminos); |
|
158 | tcsetattr((int)fd, TCSANOW, &terminos); | |
98 | return 0; |
|
159 | return 0; | |
99 | } |
|
160 | } | |
100 | } |
|
161 | } | |
101 |
|
162 | |||
102 | int rs232setparity(rs232port_t fd, rs232parity Parity) |
|
163 | int rs232setparity(rs232port_t fd, rs232parity Parity) | |
103 | { |
|
164 | { | |
104 | if ((int)fd == -1) |
|
165 | if ((int)fd == -1) | |
105 | { |
|
166 | { | |
106 | return fd; |
|
167 | return fd; | |
107 | } |
|
168 | } | |
108 | else |
|
169 | else | |
109 | { |
|
170 | { | |
110 | struct termios terminos; |
|
171 | struct termios terminos; | |
111 | tcgetattr((int)fd, &terminos); |
|
172 | tcgetattr((int)fd, &terminos); | |
112 | terminos.c_cflag &= ~PARENB; |
|
173 | terminos.c_cflag &= ~PARENB; | |
113 | terminos.c_cflag &= ~PARODD; |
|
174 | terminos.c_cflag &= ~PARODD; | |
114 | switch(Parity) |
|
175 | switch(Parity) | |
115 | { |
|
176 | { | |
116 | case rs232parityNo: |
|
177 | case rs232parityNo: | |
117 | terminos.c_cflag &= ~PARENB; |
|
178 | terminos.c_cflag &= ~PARENB; | |
118 | break; |
|
179 | break; | |
119 | case rs232parityOdd: |
|
180 | case rs232parityOdd: | |
120 | terminos.c_cflag |= PARENB; |
|
181 | terminos.c_cflag |= PARENB; | |
121 | terminos.c_cflag |= PARODD; |
|
182 | terminos.c_cflag |= PARODD; | |
122 | break; |
|
183 | break; | |
123 | case rs232parityEven: |
|
184 | case rs232parityEven: | |
124 | terminos.c_cflag |= PARENB; |
|
185 | terminos.c_cflag |= PARENB; | |
125 | terminos.c_cflag &= ~PARODD; |
|
186 | terminos.c_cflag &= ~PARODD; | |
126 | break; |
|
187 | break; | |
127 | default: |
|
188 | default: | |
128 | terminos.c_cflag &= ~PARENB; |
|
189 | terminos.c_cflag &= ~PARENB; | |
129 | break; |
|
190 | break; | |
130 | } |
|
191 | } | |
131 | tcsetattr((int)fd, TCSANOW, &terminos); |
|
192 | tcsetattr((int)fd, TCSANOW, &terminos); | |
132 | return 0; |
|
193 | return 0; | |
133 | } |
|
194 | } | |
134 | } |
|
195 | } | |
135 |
|
196 | |||
136 | int rs232setnbstop(rs232port_t fd, rs232stop NbStop) |
|
197 | int rs232setnbstop(rs232port_t fd, rs232stop NbStop) | |
137 | { |
|
198 | { | |
138 | if ((int)fd == -1) |
|
199 | if ((int)fd == -1) | |
139 | { |
|
200 | { | |
140 | return fd; |
|
201 | return fd; | |
141 | } |
|
202 | } | |
142 | else |
|
203 | else | |
143 | { |
|
204 | { | |
144 | struct termios terminos; |
|
205 | struct termios terminos; | |
145 | tcgetattr((int)fd, &terminos); |
|
206 | tcgetattr((int)fd, &terminos); | |
146 | switch(NbStop) |
|
207 | switch(NbStop) | |
147 | { |
|
208 | { | |
148 | case rs232OneStop: |
|
209 | case rs232OneStop: | |
149 | terminos.c_cflag &= ~CSTOPB; |
|
210 | terminos.c_cflag &= ~CSTOPB; | |
150 | break; |
|
211 | break; | |
151 | case rs232One5Stop: |
|
212 | case rs232One5Stop: | |
152 | terminos.c_cflag |= CSTOPB; |
|
213 | terminos.c_cflag |= CSTOPB; | |
153 | break; |
|
214 | break; | |
154 | case rs232TwoStop: |
|
215 | case rs232TwoStop: | |
155 | terminos.c_cflag |= CSTOPB; |
|
216 | terminos.c_cflag |= CSTOPB; | |
156 | break; |
|
217 | break; | |
157 | default: |
|
218 | default: | |
158 | terminos.c_cflag &= ~CSTOPB; |
|
219 | terminos.c_cflag &= ~CSTOPB; | |
159 | break; |
|
220 | break; | |
160 | } |
|
221 | } | |
161 | tcsetattr((int)fd, TCSANOW, &terminos); |
|
222 | tcsetattr((int)fd, TCSANOW, &terminos); | |
162 | return 0; |
|
223 | return 0; | |
163 | } |
|
224 | } | |
164 | } |
|
225 | } | |
165 |
|
226 | |||
166 |
|
227 | |||
167 | int rs232setcsize(rs232port_t fd, int ChSize) |
|
228 | int rs232setcsize(rs232port_t fd, int ChSize) | |
168 | { |
|
229 | { | |
169 | if ((int)fd == -1) |
|
230 | if ((int)fd == -1) | |
170 | { |
|
231 | { | |
171 | return fd; |
|
232 | return fd; | |
172 | } |
|
233 | } | |
173 | else |
|
234 | else | |
174 | { |
|
235 | { | |
175 | struct termios terminos; |
|
236 | struct termios terminos; | |
176 | tcgetattr((int)fd, &terminos); |
|
237 | tcgetattr((int)fd, &terminos); | |
177 | terminos.c_cflag &= ~CSIZE; |
|
238 | terminos.c_cflag &= ~CSIZE; | |
178 | switch(ChSize) |
|
239 | switch(ChSize) | |
179 | { |
|
240 | { | |
180 | case 5: |
|
241 | case 5: | |
181 | terminos.c_cflag |= CS5; |
|
242 | terminos.c_cflag |= CS5; | |
182 | break; |
|
243 | break; | |
183 | case 6: |
|
244 | case 6: | |
184 | terminos.c_cflag |= CS6; |
|
245 | terminos.c_cflag |= CS6; | |
185 | break; |
|
246 | break; | |
186 | case 7: |
|
247 | case 7: | |
187 | terminos.c_cflag |= CS7; |
|
248 | terminos.c_cflag |= CS7; | |
188 | break; |
|
249 | break; | |
189 | default: |
|
250 | default: | |
190 | terminos.c_cflag |= CS8; |
|
251 | terminos.c_cflag |= CS8; | |
191 | break; |
|
252 | break; | |
192 | } |
|
253 | } | |
193 | tcsetattr((int)fd, TCSANOW, &terminos); |
|
254 | tcsetattr((int)fd, TCSANOW, &terminos); | |
194 | return 0; |
|
255 | return 0; | |
195 | } |
|
256 | } | |
196 | } |
|
257 | } | |
197 |
|
258 | |||
198 | rs232speed_t rs232cfspeed(unsigned int BaudeRate) |
|
259 | rs232speed_t rs232cfspeed(unsigned int BaudeRate) | |
199 | { |
|
260 | { | |
200 | if(BaudeRate<25) |
|
261 | if(BaudeRate<25) | |
201 | return B0; |
|
262 | return B0; | |
202 |
|
263 | |||
203 | if(BaudeRate<67) |
|
264 | if(BaudeRate<67) | |
204 | return B50; |
|
265 | return B50; | |
205 |
|
266 | |||
206 | if(BaudeRate<93) |
|
267 | if(BaudeRate<93) | |
207 | return B75; |
|
268 | return B75; | |
208 |
|
269 | |||
209 | if(BaudeRate<123) |
|
270 | if(BaudeRate<123) | |
210 | return B110; |
|
271 | return B110; | |
211 |
|
272 | |||
212 | if(BaudeRate<142) |
|
273 | if(BaudeRate<142) | |
213 | return B134; |
|
274 | return B134; | |
214 |
|
275 | |||
215 | if(BaudeRate<175) |
|
276 | if(BaudeRate<175) | |
216 | return B150; |
|
277 | return B150; | |
217 |
|
278 | |||
218 | if(BaudeRate<250) |
|
279 | if(BaudeRate<250) | |
219 | return B200; |
|
280 | return B200; | |
220 |
|
281 | |||
221 | if(BaudeRate<450) |
|
282 | if(BaudeRate<450) | |
222 | return B300; |
|
283 | return B300; | |
223 |
|
284 | |||
224 | if(BaudeRate<900) |
|
285 | if(BaudeRate<900) | |
225 | return B600; |
|
286 | return B600; | |
226 |
|
287 | |||
227 | if(BaudeRate<1500) |
|
288 | if(BaudeRate<1500) | |
228 | return B1200; |
|
289 | return B1200; | |
229 |
|
290 | |||
230 | if(BaudeRate<2100) |
|
291 | if(BaudeRate<2100) | |
231 | return B1800; |
|
292 | return B1800; | |
232 |
|
293 | |||
233 | if(BaudeRate<3600) |
|
294 | if(BaudeRate<3600) | |
234 | return B2400; |
|
295 | return B2400; | |
235 |
|
296 | |||
236 | if(BaudeRate<7200) |
|
297 | if(BaudeRate<7200) | |
237 | return B4800; |
|
298 | return B4800; | |
238 |
|
299 | |||
239 | if(BaudeRate<1400) |
|
300 | if(BaudeRate<1400) | |
240 | return B9600; |
|
301 | return B9600; | |
241 |
|
302 | |||
242 | if(BaudeRate<28800) |
|
303 | if(BaudeRate<28800) | |
243 | return B19200; |
|
304 | return B19200; | |
244 |
|
305 | |||
245 | if(BaudeRate<48000) |
|
306 | if(BaudeRate<48000) | |
246 | return B38400; |
|
307 | return B38400; | |
247 |
|
308 | |||
248 | if(BaudeRate<86400) |
|
309 | if(BaudeRate<86400) | |
249 | return B57600; |
|
310 | return B57600; | |
250 |
|
311 | |||
251 | if(BaudeRate<172800) |
|
312 | if(BaudeRate<172800) | |
252 | return B115200; |
|
313 | return B115200; | |
253 | else |
|
314 | else | |
254 | return B230400; |
|
315 | return B230400; | |
255 | } |
|
316 | } | |
256 |
|
317 | |||
257 |
|
318 | |||
258 | int rs232cfparity(int fd, struct termios *terminos, rs232parity Parity) |
|
319 | int rs232cfparity(int fd, struct termios *terminos, rs232parity Parity) | |
259 | { |
|
320 | { | |
260 | if ((int)fd == -1) |
|
321 | if ((int)fd == -1) | |
261 | { |
|
322 | { | |
262 | return fd; |
|
323 | return fd; | |
263 | } |
|
324 | } | |
264 | else |
|
325 | else | |
265 | { |
|
326 | { | |
266 | terminos->c_cflag &= ~PARENB; |
|
327 | terminos->c_cflag &= ~PARENB; | |
267 | terminos->c_cflag &= ~PARODD; |
|
328 | terminos->c_cflag &= ~PARODD; | |
268 | switch(Parity) |
|
329 | switch(Parity) | |
269 | { |
|
330 | { | |
270 | case rs232parityNo: |
|
331 | case rs232parityNo: | |
271 | terminos->c_cflag &= ~PARENB; |
|
332 | terminos->c_cflag &= ~PARENB; | |
272 | terminos->c_cflag &= ~PARODD; |
|
333 | terminos->c_cflag &= ~PARODD; | |
273 | break; |
|
334 | break; | |
274 | case rs232parityOdd: |
|
335 | case rs232parityOdd: | |
275 | terminos->c_cflag |= PARENB; |
|
336 | terminos->c_cflag |= PARENB; | |
276 | terminos->c_cflag |= PARODD; |
|
337 | terminos->c_cflag |= PARODD; | |
277 | break; |
|
338 | break; | |
278 | case rs232parityEven: |
|
339 | case rs232parityEven: | |
279 | terminos->c_cflag |= PARENB; |
|
340 | terminos->c_cflag |= PARENB; | |
280 | terminos->c_cflag &= ~PARODD; |
|
341 | terminos->c_cflag &= ~PARODD; | |
281 | break; |
|
342 | break; | |
282 | default: |
|
343 | default: | |
283 | terminos->c_cflag &= ~PARENB; |
|
344 | terminos->c_cflag &= ~PARENB; | |
284 | terminos->c_cflag &= ~PARODD; |
|
345 | terminos->c_cflag &= ~PARODD; | |
285 | break; |
|
346 | break; | |
286 | } |
|
347 | } | |
287 | return 0; |
|
348 | return 0; | |
288 | } |
|
349 | } | |
289 | } |
|
350 | } | |
290 |
|
351 | |||
291 | int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop) |
|
352 | int rs232cfnbstop(int fd, struct termios *terminos, rs232stop NbStop) | |
292 | { |
|
353 | { | |
293 | if ((int)fd == -1) |
|
354 | if ((int)fd == -1) | |
294 | { |
|
355 | { | |
295 | return fd; |
|
356 | return fd; | |
296 | } |
|
357 | } | |
297 | else |
|
358 | else | |
298 | { |
|
359 | { | |
299 | switch(NbStop) |
|
360 | switch(NbStop) | |
300 | { |
|
361 | { | |
301 | case 2: |
|
362 | case 2: | |
302 | terminos->c_cflag |= CSTOPB; |
|
363 | terminos->c_cflag |= CSTOPB; | |
303 | break; |
|
364 | break; | |
304 | default: |
|
365 | default: | |
305 | terminos->c_cflag &= ~CSTOPB; |
|
366 | terminos->c_cflag &= ~CSTOPB; | |
306 | break; |
|
367 | break; | |
307 | } |
|
368 | } | |
308 | return 0; |
|
369 | return 0; | |
309 | } |
|
370 | } | |
310 | } |
|
371 | } | |
311 |
|
372 | |||
312 |
|
373 | |||
313 | int rs232cfcsize(int fd, struct termios *terminos, int ChSize) |
|
374 | int rs232cfcsize(int fd, struct termios *terminos, int ChSize) | |
314 | { |
|
375 | { | |
315 | if ((int)fd == -1) |
|
376 | if ((int)fd == -1) | |
316 | { |
|
377 | { | |
317 | return fd; |
|
378 | return fd; | |
318 | } |
|
379 | } | |
319 | else |
|
380 | else | |
320 | { |
|
381 | { | |
321 | terminos->c_cflag &= ~CSIZE; |
|
382 | terminos->c_cflag &= ~CSIZE; | |
322 | switch(ChSize) |
|
383 | switch(ChSize) | |
323 | { |
|
384 | { | |
324 | case 5: |
|
385 | case 5: | |
325 | terminos->c_cflag |= CS5; |
|
386 | terminos->c_cflag |= CS5; | |
326 | break; |
|
387 | break; | |
327 | case 6: |
|
388 | case 6: | |
328 | terminos->c_cflag |= CS6; |
|
389 | terminos->c_cflag |= CS6; | |
329 | break; |
|
390 | break; | |
330 | case 7: |
|
391 | case 7: | |
331 | terminos->c_cflag |= CS7; |
|
392 | terminos->c_cflag |= CS7; | |
332 | break; |
|
393 | break; | |
333 | default: |
|
394 | default: | |
334 | terminos->c_cflag |= CS8; |
|
395 | terminos->c_cflag |= CS8; | |
335 | break; |
|
396 | break; | |
336 | } |
|
397 | } | |
337 | return 0; |
|
398 | return 0; | |
338 | } |
|
399 | } | |
339 | } |
|
400 | } | |
340 |
|
401 | |||
341 |
|
402 | |||
342 | int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize) |
|
403 | int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize) | |
343 | { |
|
404 | { | |
344 | if ((int)fd == -1) |
|
405 | if ((int)fd == -1) | |
345 | { |
|
406 | { | |
346 | return -1; |
|
407 | return -1; | |
347 | } |
|
408 | } | |
348 | else |
|
409 | else | |
349 | { |
|
410 | { | |
350 | return write((int)fd, psWrite, WriteBufferSize); |
|
411 | return write((int)fd, psWrite, WriteBufferSize); | |
351 | } |
|
412 | } | |
352 | } |
|
413 | } | |
353 |
|
414 | |||
354 |
|
415 | |||
355 | int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize) |
|
416 | int rs232read(rs232port_t fd,char *psReadHex, int ReadBufferSize) | |
356 | { |
|
417 | { | |
357 |
|
418 | |||
358 | if ((int)fd == -1) |
|
419 | if ((int)fd == -1) | |
359 | { |
|
420 | { | |
360 | return -1; |
|
421 | return -1; | |
361 | } |
|
422 | } | |
362 | else |
|
423 | else | |
363 | { |
|
424 | { | |
364 | return read((int)fd, psReadHex, ReadBufferSize); |
|
425 | return read((int)fd, psReadHex, ReadBufferSize); | |
365 | } |
|
426 | } | |
366 |
|
427 | |||
367 | } |
|
428 | } | |
368 |
|
429 | |||
369 |
|
430 | |||
370 | int rs232setRTS(rs232port_t fd) |
|
431 | int rs232setRTS(rs232port_t fd) | |
371 | { |
|
432 | { | |
372 | int status; |
|
433 | int status; | |
373 | ioctl((int)fd, TIOCMGET, &status); |
|
434 | ioctl((int)fd, TIOCMGET, &status); | |
374 | status &= ~TIOCM_RTS; |
|
435 | status &= ~TIOCM_RTS; | |
375 | if (ioctl((int)fd, TIOCMSET, &status)) |
|
436 | if (ioctl((int)fd, TIOCMSET, &status)) | |
376 | { |
|
437 | { | |
377 | return -1; |
|
438 | return -1; | |
378 | } |
|
439 | } | |
379 | return 0; |
|
440 | return 0; | |
380 | } |
|
441 | } | |
381 |
|
442 | |||
382 | int rs232clearRTS(rs232port_t fd) |
|
443 | int rs232clearRTS(rs232port_t fd) | |
383 | { |
|
444 | { | |
384 | int status; |
|
445 | int status; | |
385 | ioctl((int)fd, TIOCMGET, &status); |
|
446 | ioctl((int)fd, TIOCMGET, &status); | |
386 | status |= TIOCM_RTS; |
|
447 | status |= TIOCM_RTS; | |
387 | if (ioctl((int)fd, TIOCMSET, &status)) |
|
448 | if (ioctl((int)fd, TIOCMSET, &status)) | |
388 | { |
|
449 | { | |
389 | return -1; |
|
450 | return -1; | |
390 | } |
|
451 | } | |
391 | return 0; |
|
452 | return 0; | |
392 | } |
|
453 | } | |
393 |
|
454 | |||
394 | int rs232setDTR(rs232port_t fd) |
|
455 | int rs232setDTR(rs232port_t fd) | |
395 | { |
|
456 | { | |
396 | int status; |
|
457 | int status; | |
397 | ioctl((int)fd, TIOCMGET, &status); |
|
458 | ioctl((int)fd, TIOCMGET, &status); | |
398 | status &= ~TIOCM_DTR; |
|
459 | status &= ~TIOCM_DTR; | |
399 | if (ioctl((int)fd, TIOCMSET, &status)) |
|
460 | if (ioctl((int)fd, TIOCMSET, &status)) | |
400 | { |
|
461 | { | |
401 | return -1; |
|
462 | return -1; | |
402 | } |
|
463 | } | |
403 | return 0; |
|
464 | return 0; | |
404 | } |
|
465 | } | |
405 |
|
466 | |||
406 |
|
467 | |||
407 | int rs232clearDTR(rs232port_t fd) |
|
468 | int rs232clearDTR(rs232port_t fd) | |
408 | { |
|
469 | { | |
409 | int status; |
|
470 | int status; | |
410 | ioctl((int)fd, TIOCMGET, &status); |
|
471 | ioctl((int)fd, TIOCMGET, &status); | |
411 | status |= TIOCM_DTR; |
|
472 | status |= TIOCM_DTR; | |
412 | if (ioctl((int)fd, TIOCMSET, &status)) |
|
473 | if (ioctl((int)fd, TIOCMSET, &status)) | |
413 | { |
|
474 | { | |
414 | return -1; |
|
475 | return -1; | |
415 | } |
|
476 | } | |
416 | return 0; |
|
477 | return 0; | |
417 | } |
|
478 | } | |
418 |
|
479 | |||
419 |
|
480 | |||
420 |
|
481 | |||
421 | int rs232saferead(rs232port_t fd,char* data,int count ) |
|
482 | int rs232saferead(rs232port_t fd,char* data,int count ) | |
422 | { |
|
483 | { | |
423 | int read=0; |
|
484 | int read=0; | |
424 | int i=0; |
|
485 | int i=0; | |
425 | for(i=0;i<100;i++) |
|
486 | for(i=0;i<100;i++) | |
426 | { |
|
487 | { | |
427 | read = rs232read((int)fd,data,count); |
|
488 | read = rs232read((int)fd,data,count); | |
428 | count -=read; |
|
489 | count -=read; | |
429 | data+=read; |
|
490 | data+=read; | |
430 | if(count==0) |
|
491 | if(count==0) | |
431 | return 0; |
|
492 | return 0; | |
432 | } |
|
493 | } | |
433 | return -1; |
|
494 | return -1; | |
434 | } |
|
495 | } | |
435 |
|
496 | |||
436 |
|
497 | |||
437 |
|
498 | |||
438 | int rs232safewrite(rs232port_t fd,char* data,int count) |
|
499 | int rs232safewrite(rs232port_t fd,char* data,int count) | |
439 | { |
|
500 | { | |
440 | int written=0; |
|
501 | int written=0; | |
441 | int i=0; |
|
502 | int i=0; | |
442 | for(i=0;i<1000;i++) |
|
503 | for(i=0;i<1000;i++) | |
443 | { |
|
504 | { | |
444 | written = rs232write((int)fd,data+written,count); |
|
505 | written = rs232write((int)fd,data+written,count); | |
445 | count-=written; |
|
506 | count-=written; | |
446 | data+=written; |
|
507 | data+=written; | |
447 | if(count==0) |
|
508 | if(count==0) | |
448 | return 0; |
|
509 | return 0; | |
449 | } |
|
510 | } | |
450 | return -1; |
|
511 | return -1; | |
451 | } |
|
512 | } | |
452 |
|
513 | |||
453 | #endif |
|
514 | #endif | |
454 | #endif //#ifdef HAVE_TERMIOS_H |
|
515 | #endif //#ifdef HAVE_TERMIOS_H | |
455 |
|
516 |
@@ -1,334 +1,364 | |||||
1 | #include "rs232config.h" |
|
1 | #include "rs232config.h" | |
2 | #include <stdio.h> |
|
2 | #include <stdio.h> | |
3 | #include <unistd.h> |
|
3 | #include <unistd.h> | |
4 | #include <fcntl.h> |
|
4 | #include <fcntl.h> | |
5 | #include <string.h> |
|
5 | #include <string.h> | |
6 | #include <errno.h> |
|
6 | #include <errno.h> | |
7 | #include <malloc.h> |
|
7 | #include <malloc.h> | |
8 |
|
8 | |||
9 | #ifdef HAVE_WINDOWS_H |
|
9 | #ifdef HAVE_WINDOWS_H | |
10 | #include <windows.h> |
|
10 | #include <windows.h> | |
11 | #endif |
|
11 | #endif | |
12 | #include "RS232.h" |
|
12 | #include "RS232.h" | |
13 |
|
13 | |||
14 | #ifdef HAVE_WINDOWS_H |
|
14 | #ifdef HAVE_WINDOWS_H | |
15 |
|
15 | |||
16 |
|
16 | |||
17 | int privatedecodeparity(rs232parity Parity ) |
|
17 | int privatedecodeparity(rs232parity Parity ) | |
18 | { |
|
18 | { | |
19 | switch(Parity) |
|
19 | switch(Parity) | |
20 | { |
|
20 | { | |
21 | case rs232parityNo: |
|
21 | case rs232parityNo: | |
22 | return NOPARITY; |
|
22 | return NOPARITY; | |
23 | break; |
|
23 | break; | |
24 | case rs232parityOdd: |
|
24 | case rs232parityOdd: | |
25 | return ODDPARITY; |
|
25 | return ODDPARITY; | |
26 | break; |
|
26 | break; | |
27 | case rs232parityEven: |
|
27 | case rs232parityEven: | |
28 | return EVENPARITY; |
|
28 | return EVENPARITY; | |
29 | break; |
|
29 | break; | |
30 | default: |
|
30 | default: | |
31 | return NOPARITY; |
|
31 | return NOPARITY; | |
32 | break; |
|
32 | break; | |
33 | } |
|
33 | } | |
34 | } |
|
34 | } | |
35 |
|
35 | |||
36 | int privatedecodestop(rs232stop NbStop) |
|
36 | int privatedecodestop(rs232stop NbStop) | |
37 | { |
|
37 | { | |
38 | switch(NbStop) |
|
38 | switch(NbStop) | |
39 | { |
|
39 | { | |
40 | case rs232OneStop: |
|
40 | case rs232OneStop: | |
41 | return ONESTOPBIT; |
|
41 | return ONESTOPBIT; | |
42 | break; |
|
42 | break; | |
43 | case rs232One5Stop: |
|
43 | case rs232One5Stop: | |
44 | return ONE5STOPBITS; |
|
44 | return ONE5STOPBITS; | |
45 | break; |
|
45 | break; | |
46 | case rs232TwoStop: |
|
46 | case rs232TwoStop: | |
47 | return TWOSTOPBITS; |
|
47 | return TWOSTOPBITS; | |
48 | break; |
|
48 | break; | |
49 | default: |
|
49 | default: | |
50 | return ONESTOPBIT; |
|
50 | return ONESTOPBIT; | |
51 | break; |
|
51 | break; | |
52 | } |
|
52 | } | |
53 | } |
|
53 | } | |
54 |
|
54 | |||
55 |
|
55 | |||
56 |
|
56 | |||
57 | rs232speed_t rs232cfspeed(unsigned int BaudeRate) |
|
57 | rs232speed_t rs232cfspeed(unsigned int BaudeRate) | |
58 | { |
|
58 | { | |
59 |
|
59 | |||
60 | if(BaudeRate<123) |
|
60 | if(BaudeRate<123) | |
61 | return (rs232speed_t)CBR_110; |
|
61 | return (rs232speed_t)CBR_110; | |
62 |
|
62 | |||
63 | if(BaudeRate<450) |
|
63 | if(BaudeRate<450) | |
64 | return (rs232speed_t)CBR_300; |
|
64 | return (rs232speed_t)CBR_300; | |
65 |
|
65 | |||
66 | if(BaudeRate<900) |
|
66 | if(BaudeRate<900) | |
67 | return (rs232speed_t)CBR_600; |
|
67 | return (rs232speed_t)CBR_600; | |
68 |
|
68 | |||
69 | if(BaudeRate<1500) |
|
69 | if(BaudeRate<1500) | |
70 | return (rs232speed_t)CBR_1200; |
|
70 | return (rs232speed_t)CBR_1200; | |
71 |
|
71 | |||
72 | if(BaudeRate<3600) |
|
72 | if(BaudeRate<3600) | |
73 | return (rs232speed_t)CBR_2400; |
|
73 | return (rs232speed_t)CBR_2400; | |
74 |
|
74 | |||
75 | if(BaudeRate<7200) |
|
75 | if(BaudeRate<7200) | |
76 | return (rs232speed_t)CBR_4800; |
|
76 | return (rs232speed_t)CBR_4800; | |
77 |
|
77 | |||
78 | if(BaudeRate<14000) |
|
78 | if(BaudeRate<14000) | |
79 | return (rs232speed_t)CBR_9600; |
|
79 | return (rs232speed_t)CBR_9600; | |
80 |
|
80 | |||
81 | if(BaudeRate<16800) |
|
81 | if(BaudeRate<16800) | |
82 | return (rs232speed_t)CBR_14400; |
|
82 | return (rs232speed_t)CBR_14400; | |
83 |
|
83 | |||
84 | if(BaudeRate<28800) |
|
84 | if(BaudeRate<28800) | |
85 | return (rs232speed_t)CBR_19200; |
|
85 | return (rs232speed_t)CBR_19200; | |
86 |
|
86 | |||
87 | if(BaudeRate<48000) |
|
87 | if(BaudeRate<48000) | |
88 | return (rs232speed_t)CBR_38400; |
|
88 | return (rs232speed_t)CBR_38400; | |
89 |
|
89 | |||
90 | if(BaudeRate<86400) |
|
90 | if(BaudeRate<86400) | |
91 | return (rs232speed_t)CBR_57600; |
|
91 | return (rs232speed_t)CBR_57600; | |
92 |
|
92 | |||
93 | if(BaudeRate<172800) |
|
93 | if(BaudeRate<172800) | |
94 | return (rs232speed_t)CBR_115200; |
|
94 | return (rs232speed_t)CBR_115200; | |
95 | else |
|
95 | else | |
96 | return (rs232speed_t)CBR_256000; |
|
96 | return (rs232speed_t)CBR_256000; | |
97 | } |
|
97 | } | |
98 |
|
98 | |||
99 |
|
99 | |||
100 | rs232port_t rs232open(char* psPortName) |
|
100 | rs232port_t rs232open(char* psPortName) | |
101 | { |
|
101 | { | |
102 | rs232port_t fd; |
|
102 | rs232port_t fd; | |
103 | fd = (rs232port_t)CreateFile(psPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); |
|
103 | fd = (rs232port_t)CreateFile(psPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); | |
104 | #ifdef debug |
|
104 | #ifdef debug | |
105 | if(fd==(rs232port_t)INVALID_HANDLE_VALUE) |
|
105 | if(fd==(rs232port_t)INVALID_HANDLE_VALUE) | |
106 | { |
|
106 | { | |
107 | printf("can't open Port\n"); |
|
107 | printf("can't open Port\n"); | |
108 | return (rs232port_t)badPortValue; |
|
108 | return (rs232port_t)badPortValue; | |
109 | } |
|
109 | } | |
110 | #endif |
|
110 | #endif | |
111 | return fd; |
|
111 | return fd; | |
112 | } |
|
112 | } | |
113 |
|
113 | |||
114 | int rs232close(rs232port_t fd) |
|
114 | int rs232close(rs232port_t fd) | |
115 | { |
|
115 | { | |
116 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
116 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
117 | { |
|
117 | { | |
118 | return (rs232port_t)badPortValue; |
|
118 | return (rs232port_t)badPortValue; | |
119 | } |
|
119 | } | |
120 | else |
|
120 | else | |
121 | { |
|
121 | { | |
122 | CloseHandle((HANDLE)fd); |
|
122 | CloseHandle((HANDLE)fd); | |
123 | return rs232noerr; |
|
123 | return rs232noerr; | |
124 | } |
|
124 | } | |
125 | } |
|
125 | } | |
126 |
|
126 | |||
127 | rs232portslist_t* rs232getportlist() |
|
127 | rs232portslist_t* rs232getportlist() //here is the very dirty way! | |
128 | { |
|
128 | { | |
129 |
|
129 | int i=0; | ||
|
130 | char* devName="COM111"; | |||
|
131 | rs232port_t testport; | |||
|
132 | rs232portslist_t* firstitem=NULL; | |||
|
133 | rs232portslist_t* previtem=NULL; | |||
|
134 | for(i=0;i<256;i++) | |||
|
135 | { | |||
|
136 | devName[3] = '\0'; | |||
|
137 | devName[4] = '\0'; | |||
|
138 | devName[5] = '\0'; | |||
|
139 | devName[6] = '\0'; | |||
|
140 | sprintf(devName+3,"%d",i); | |||
|
141 | testport= rs232open(devName); | |||
|
142 | if(testport != (rs232port_t)badPortValue) | |||
|
143 | { | |||
|
144 | rs232portslist_t* item = (rs232portslist_t*)malloc(sizeof(rs232portslist_t)); | |||
|
145 | char* name = (char*)malloc(7); | |||
|
146 | strcpy(name,devName); | |||
|
147 | item->name = name; | |||
|
148 | item->next = NULL; | |||
|
149 | if(NULL!=previtem)previtem->next = item; | |||
|
150 | previtem = item; | |||
|
151 | if(NULL==firstitem)firstitem = item; | |||
|
152 | } | |||
|
153 | } | |||
|
154 | return firstitem; | |||
130 | } |
|
155 | } | |
131 |
|
156 | |||
132 | void rs232deleteportlist(rs232portslist_t* list) |
|
157 | void rs232deleteportlist(rs232portslist_t* list) | |
133 | { |
|
158 | { | |
134 |
|
159 | if(list!=NULL) | ||
|
160 | { | |||
|
161 | if(list->next != NULL) | |||
|
162 | rs232deleteportlist(list->next); | |||
|
163 | free(list); | |||
|
164 | } | |||
135 | } |
|
165 | } | |
136 |
|
166 | |||
137 |
|
167 | |||
138 | int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop) |
|
168 | int rs232setup(rs232port_t fd, int ChSize, int BaudeRate, rs232parity Parity, rs232stop NbStop) | |
139 | { |
|
169 | { | |
140 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
170 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
141 | { |
|
171 | { | |
142 | return (rs232port_t)badPortValue; |
|
172 | return (rs232port_t)badPortValue; | |
143 | } |
|
173 | } | |
144 | else |
|
174 | else | |
145 | { |
|
175 | { | |
146 | DCB dcbSerialParams = {0}; |
|
176 | DCB dcbSerialParams = {0}; | |
147 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); |
|
177 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); | |
148 | GetCommState((HANDLE)fd, &dcbSerialParams); |
|
178 | GetCommState((HANDLE)fd, &dcbSerialParams); | |
149 | dcbSerialParams.BaudRate=rs232cfspeed(BaudeRate); |
|
179 | dcbSerialParams.BaudRate=rs232cfspeed(BaudeRate); | |
150 | dcbSerialParams.ByteSize=ChSize; |
|
180 | dcbSerialParams.ByteSize=ChSize; | |
151 | dcbSerialParams.StopBits=privatedecodestop(NbStop); |
|
181 | dcbSerialParams.StopBits=privatedecodestop(NbStop); | |
152 | dcbSerialParams.Parity=privatedecodeparity(Parity); |
|
182 | dcbSerialParams.Parity=privatedecodeparity(Parity); | |
153 | SetCommState((HANDLE)fd, &dcbSerialParams); |
|
183 | SetCommState((HANDLE)fd, &dcbSerialParams); | |
154 | COMMTIMEOUTS timeouts={0}; |
|
184 | COMMTIMEOUTS timeouts={0}; | |
155 | timeouts.ReadIntervalTimeout=100; |
|
185 | timeouts.ReadIntervalTimeout=100; | |
156 | timeouts.ReadTotalTimeoutConstant=100; |
|
186 | timeouts.ReadTotalTimeoutConstant=100; | |
157 | timeouts.ReadTotalTimeoutMultiplier=1; |
|
187 | timeouts.ReadTotalTimeoutMultiplier=1; | |
158 | timeouts.WriteTotalTimeoutConstant=100; |
|
188 | timeouts.WriteTotalTimeoutConstant=100; | |
159 | timeouts.WriteTotalTimeoutMultiplier=10; |
|
189 | timeouts.WriteTotalTimeoutMultiplier=10; | |
160 | SetCommTimeouts((HANDLE)fd, &timeouts); |
|
190 | SetCommTimeouts((HANDLE)fd, &timeouts); | |
161 | return rs232noerr; |
|
191 | return rs232noerr; | |
162 | } |
|
192 | } | |
163 | } |
|
193 | } | |
164 |
|
194 | |||
165 | int rs232setbaudrate(rs232port_t fd, int baudrate) |
|
195 | int rs232setbaudrate(rs232port_t fd, int baudrate) | |
166 | { |
|
196 | { | |
167 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
197 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
168 | { |
|
198 | { | |
169 | return (rs232port_t)badPortValue; |
|
199 | return (rs232port_t)badPortValue; | |
170 | } |
|
200 | } | |
171 | else |
|
201 | else | |
172 | { |
|
202 | { | |
173 | DCB dcbSerialParams = {0}; |
|
203 | DCB dcbSerialParams = {0}; | |
174 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); |
|
204 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); | |
175 | GetCommState((HANDLE)fd, &dcbSerialParams); |
|
205 | GetCommState((HANDLE)fd, &dcbSerialParams); | |
176 | dcbSerialParams.BaudRate=rs232cfspeed(baudrate); |
|
206 | dcbSerialParams.BaudRate=rs232cfspeed(baudrate); | |
177 | SetCommState((HANDLE)fd, &dcbSerialParams); |
|
207 | SetCommState((HANDLE)fd, &dcbSerialParams); | |
178 | return rs232noerr; |
|
208 | return rs232noerr; | |
179 | } |
|
209 | } | |
180 | } |
|
210 | } | |
181 |
|
211 | |||
182 | int rs232setparity(rs232port_t fd, rs232parity Parity) |
|
212 | int rs232setparity(rs232port_t fd, rs232parity Parity) | |
183 | { |
|
213 | { | |
184 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
214 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
185 | { |
|
215 | { | |
186 | return (rs232port_t)badPortValue; |
|
216 | return (rs232port_t)badPortValue; | |
187 | } |
|
217 | } | |
188 | else |
|
218 | else | |
189 | { |
|
219 | { | |
190 | DCB dcbSerialParams = {0}; |
|
220 | DCB dcbSerialParams = {0}; | |
191 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); |
|
221 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); | |
192 | GetCommState((HANDLE)fd, &dcbSerialParams); |
|
222 | GetCommState((HANDLE)fd, &dcbSerialParams); | |
193 | dcbSerialParams.Parity = privatedecodeparity(Parity); |
|
223 | dcbSerialParams.Parity = privatedecodeparity(Parity); | |
194 | SetCommState((HANDLE)fd, &dcbSerialParams); |
|
224 | SetCommState((HANDLE)fd, &dcbSerialParams); | |
195 | return rs232noerr; |
|
225 | return rs232noerr; | |
196 | } |
|
226 | } | |
197 | } |
|
227 | } | |
198 |
|
228 | |||
199 | int rs232setnbstop(rs232port_t fd, rs232stop NbStop) |
|
229 | int rs232setnbstop(rs232port_t fd, rs232stop NbStop) | |
200 | { |
|
230 | { | |
201 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
231 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
202 | { |
|
232 | { | |
203 | return (rs232port_t)badPortValue; |
|
233 | return (rs232port_t)badPortValue; | |
204 | } |
|
234 | } | |
205 | else |
|
235 | else | |
206 | { |
|
236 | { | |
207 | DCB dcbSerialParams = {0}; |
|
237 | DCB dcbSerialParams = {0}; | |
208 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); |
|
238 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); | |
209 | GetCommState((HANDLE)fd, &dcbSerialParams); |
|
239 | GetCommState((HANDLE)fd, &dcbSerialParams); | |
210 | dcbSerialParams.StopBits = privatedecodestop(NbStop); |
|
240 | dcbSerialParams.StopBits = privatedecodestop(NbStop); | |
211 | SetCommState((HANDLE)fd, &dcbSerialParams); |
|
241 | SetCommState((HANDLE)fd, &dcbSerialParams); | |
212 | return rs232noerr; |
|
242 | return rs232noerr; | |
213 | } |
|
243 | } | |
214 | } |
|
244 | } | |
215 |
|
245 | |||
216 |
|
246 | |||
217 | int rs232setcsize(rs232port_t fd, int ChSize) |
|
247 | int rs232setcsize(rs232port_t fd, int ChSize) | |
218 | { |
|
248 | { | |
219 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
249 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
220 | { |
|
250 | { | |
221 | return (rs232port_t)badPortValue; |
|
251 | return (rs232port_t)badPortValue; | |
222 | } |
|
252 | } | |
223 | else |
|
253 | else | |
224 | { |
|
254 | { | |
225 | DCB dcbSerialParams = {0}; |
|
255 | DCB dcbSerialParams = {0}; | |
226 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); |
|
256 | dcbSerialParams.DCBlength=sizeof(dcbSerialParams); | |
227 | GetCommState((HANDLE)fd, &dcbSerialParams); |
|
257 | GetCommState((HANDLE)fd, &dcbSerialParams); | |
228 | dcbSerialParams.ByteSize = ChSize; |
|
258 | dcbSerialParams.ByteSize = ChSize; | |
229 | SetCommState((HANDLE)fd, &dcbSerialParams); |
|
259 | SetCommState((HANDLE)fd, &dcbSerialParams); | |
230 | return rs232noerr; |
|
260 | return rs232noerr; | |
231 | } |
|
261 | } | |
232 | } |
|
262 | } | |
233 |
|
263 | |||
234 |
|
264 | |||
235 |
|
265 | |||
236 |
|
266 | |||
237 |
|
267 | |||
238 |
|
268 | |||
239 | int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize) |
|
269 | int rs232write(rs232port_t fd,char *psWrite, int WriteBufferSize) | |
240 | { |
|
270 | { | |
241 |
|
271 | |||
242 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
272 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
243 | { |
|
273 | { | |
244 | return (rs232port_t)badPortValue; |
|
274 | return (rs232port_t)badPortValue; | |
245 | } |
|
275 | } | |
246 | else |
|
276 | else | |
247 | { |
|
277 | { | |
248 | DWORD dwBytesWriten = 0; |
|
278 | DWORD dwBytesWriten = 0; | |
249 | WriteFile((HANDLE)fd, psWrite, WriteBufferSize, &dwBytesWriten, NULL); |
|
279 | WriteFile((HANDLE)fd, psWrite, WriteBufferSize, &dwBytesWriten, NULL); | |
250 | return dwBytesWriten; |
|
280 | return dwBytesWriten; | |
251 | } |
|
281 | } | |
252 | } |
|
282 | } | |
253 |
|
283 | |||
254 |
|
284 | |||
255 | int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize) |
|
285 | int rs232read(rs232port_t fd,char *psRead, int ReadBufferSize) | |
256 | { |
|
286 | { | |
257 |
|
287 | |||
258 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) |
|
288 | if (fd == (rs232port_t)INVALID_HANDLE_VALUE) | |
259 | { |
|
289 | { | |
260 | return (rs232port_t)badPortValue; |
|
290 | return (rs232port_t)badPortValue; | |
261 | } |
|
291 | } | |
262 | else |
|
292 | else | |
263 | { |
|
293 | { | |
264 | DWORD dwBytesRead = 0; |
|
294 | DWORD dwBytesRead = 0; | |
265 | ReadFile((HANDLE)fd, psRead, ReadBufferSize, &dwBytesRead, NULL); |
|
295 | ReadFile((HANDLE)fd, psRead, ReadBufferSize, &dwBytesRead, NULL); | |
266 | return dwBytesRead; |
|
296 | return dwBytesRead; | |
267 | } |
|
297 | } | |
268 |
|
298 | |||
269 | } |
|
299 | } | |
270 |
|
300 | |||
271 |
|
301 | |||
272 | int rs232saferead(rs232port_t fd,char* data,int count ) |
|
302 | int rs232saferead(rs232port_t fd,char* data,int count ) | |
273 | { |
|
303 | { | |
274 | int read=0; |
|
304 | int read=0; | |
275 | int i=0; |
|
305 | int i=0; | |
276 | for(i=0;i<100;i++) |
|
306 | for(i=0;i<100;i++) | |
277 | { |
|
307 | { | |
278 | read = rs232read(fd,data,count); |
|
308 | read = rs232read(fd,data,count); | |
279 | count -=read; |
|
309 | count -=read; | |
280 | data+=read; |
|
310 | data+=read; | |
281 | if(count==0) |
|
311 | if(count==0) | |
282 | return rs232noerr; |
|
312 | return rs232noerr; | |
283 | } |
|
313 | } | |
284 | return -1; |
|
314 | return -1; | |
285 | } |
|
315 | } | |
286 |
|
316 | |||
287 |
|
317 | |||
288 |
|
318 | |||
289 | int rs232safewrite(rs232port_t fd,char* data,int count) |
|
319 | int rs232safewrite(rs232port_t fd,char* data,int count) | |
290 | { |
|
320 | { | |
291 | int written=0; |
|
321 | int written=0; | |
292 | int i=0; |
|
322 | int i=0; | |
293 | for(i=0;i<1000;i++) |
|
323 | for(i=0;i<1000;i++) | |
294 | { |
|
324 | { | |
295 | written = rs232write(fd,data+written,count); |
|
325 | written = rs232write(fd,data+written,count); | |
296 | count-=written; |
|
326 | count-=written; | |
297 | data+=written; |
|
327 | data+=written; | |
298 | if(count==0) |
|
328 | if(count==0) | |
299 | return rs232noerr; |
|
329 | return rs232noerr; | |
300 | } |
|
330 | } | |
301 | return -1; |
|
331 | return -1; | |
302 | } |
|
332 | } | |
303 |
|
333 | |||
304 |
|
334 | |||
305 | int rs232setRTS(rs232port_t fd) |
|
335 | int rs232setRTS(rs232port_t fd) | |
306 | { |
|
336 | { | |
307 | if(EscapeCommFunction((HANDLE)fd, CLRRTS)) |
|
337 | if(EscapeCommFunction((HANDLE)fd, CLRRTS)) | |
308 | return rs232noerr; |
|
338 | return rs232noerr; | |
309 | return -1; |
|
339 | return -1; | |
310 | } |
|
340 | } | |
311 |
|
341 | |||
312 | int rs232clearRTS(rs232port_t fd) |
|
342 | int rs232clearRTS(rs232port_t fd) | |
313 | { |
|
343 | { | |
314 | if(EscapeCommFunction((HANDLE)fd, SETRTS)) |
|
344 | if(EscapeCommFunction((HANDLE)fd, SETRTS)) | |
315 | return rs232noerr; |
|
345 | return rs232noerr; | |
316 | return -1; |
|
346 | return -1; | |
317 | } |
|
347 | } | |
318 |
|
348 | |||
319 | int rs232setDTR(rs232port_t fd) |
|
349 | int rs232setDTR(rs232port_t fd) | |
320 | { |
|
350 | { | |
321 | if(EscapeCommFunction((HANDLE)fd, CLRDTR)) |
|
351 | if(EscapeCommFunction((HANDLE)fd, CLRDTR)) | |
322 | return rs232noerr; |
|
352 | return rs232noerr; | |
323 | return -1; |
|
353 | return -1; | |
324 | } |
|
354 | } | |
325 |
|
355 | |||
326 |
|
356 | |||
327 | int rs232clearDTR(rs232port_t fd) |
|
357 | int rs232clearDTR(rs232port_t fd) | |
328 | { |
|
358 | { | |
329 | if(EscapeCommFunction((HANDLE)fd, SETDTR)) |
|
359 | if(EscapeCommFunction((HANDLE)fd, SETDTR)) | |
330 | return rs232noerr; |
|
360 | return rs232noerr; | |
331 | return -1; |
|
361 | return -1; | |
332 | } |
|
362 | } | |
333 |
|
363 | |||
334 | #endif //#ifdef HAVE_WINDOWS_H |
|
364 | #endif //#ifdef HAVE_WINDOWS_H |
@@ -1,83 +1,86 | |||||
1 | /* src/rs232config.h.in. Generated from configure.ac by autoheader. */ |
|
1 | /* src/rs232config.h.in. Generated from configure.ac by autoheader. */ | |
2 |
|
2 | |||
|
3 | /* Define to 1 if you have the <dirent.h> header file. */ | |||
|
4 | #undef HAVE_DIRENT_H | |||
|
5 | ||||
3 | /* Define to 1 if you have the <dlfcn.h> header file. */ |
|
6 | /* Define to 1 if you have the <dlfcn.h> header file. */ | |
4 | #undef HAVE_DLFCN_H |
|
7 | #undef HAVE_DLFCN_H | |
5 |
|
8 | |||
6 | /* Define to 1 if you have the <errno.h> header file. */ |
|
9 | /* Define to 1 if you have the <errno.h> header file. */ | |
7 | #undef HAVE_ERRNO_H |
|
10 | #undef HAVE_ERRNO_H | |
8 |
|
11 | |||
9 | /* Define to 1 if you have the <fcntl.h> header file. */ |
|
12 | /* Define to 1 if you have the <fcntl.h> header file. */ | |
10 | #undef HAVE_FCNTL_H |
|
13 | #undef HAVE_FCNTL_H | |
11 |
|
14 | |||
12 | /* Define to 1 if you have the <inttypes.h> header file. */ |
|
15 | /* Define to 1 if you have the <inttypes.h> header file. */ | |
13 | #undef HAVE_INTTYPES_H |
|
16 | #undef HAVE_INTTYPES_H | |
14 |
|
17 | |||
15 | /* Define to 1 if you have the <memory.h> header file. */ |
|
18 | /* Define to 1 if you have the <memory.h> header file. */ | |
16 | #undef HAVE_MEMORY_H |
|
19 | #undef HAVE_MEMORY_H | |
17 |
|
20 | |||
18 | /* Define to 1 if you have the <stdint.h> header file. */ |
|
21 | /* Define to 1 if you have the <stdint.h> header file. */ | |
19 | #undef HAVE_STDINT_H |
|
22 | #undef HAVE_STDINT_H | |
20 |
|
23 | |||
21 | /* Define to 1 if you have the <stdio.h> header file. */ |
|
24 | /* Define to 1 if you have the <stdio.h> header file. */ | |
22 | #undef HAVE_STDIO_H |
|
25 | #undef HAVE_STDIO_H | |
23 |
|
26 | |||
24 | /* Define to 1 if you have the <stdlib.h> header file. */ |
|
27 | /* Define to 1 if you have the <stdlib.h> header file. */ | |
25 | #undef HAVE_STDLIB_H |
|
28 | #undef HAVE_STDLIB_H | |
26 |
|
29 | |||
27 | /* Define to 1 if you have the <strings.h> header file. */ |
|
30 | /* Define to 1 if you have the <strings.h> header file. */ | |
28 | #undef HAVE_STRINGS_H |
|
31 | #undef HAVE_STRINGS_H | |
29 |
|
32 | |||
30 | /* Define to 1 if you have the <string.h> header file. */ |
|
33 | /* Define to 1 if you have the <string.h> header file. */ | |
31 | #undef HAVE_STRING_H |
|
34 | #undef HAVE_STRING_H | |
32 |
|
35 | |||
33 | /* Define to 1 if you have the <sys/stat.h> header file. */ |
|
36 | /* Define to 1 if you have the <sys/stat.h> header file. */ | |
34 | #undef HAVE_SYS_STAT_H |
|
37 | #undef HAVE_SYS_STAT_H | |
35 |
|
38 | |||
36 | /* Define to 1 if you have the <sys/types.h> header file. */ |
|
39 | /* Define to 1 if you have the <sys/types.h> header file. */ | |
37 | #undef HAVE_SYS_TYPES_H |
|
40 | #undef HAVE_SYS_TYPES_H | |
38 |
|
41 | |||
39 | /* Define to 1 if you have the <termios.h> header file. */ |
|
42 | /* Define to 1 if you have the <termios.h> header file. */ | |
40 | #undef HAVE_TERMIOS_H |
|
43 | #undef HAVE_TERMIOS_H | |
41 |
|
44 | |||
42 | /* Define to 1 if you have the <termio.h> header file. */ |
|
45 | /* Define to 1 if you have the <termio.h> header file. */ | |
43 | #undef HAVE_TERMIO_H |
|
46 | #undef HAVE_TERMIO_H | |
44 |
|
47 | |||
45 | /* Define to 1 if you have the <unistd.h> header file. */ |
|
48 | /* Define to 1 if you have the <unistd.h> header file. */ | |
46 | #undef HAVE_UNISTD_H |
|
49 | #undef HAVE_UNISTD_H | |
47 |
|
50 | |||
48 | /* Define to 1 if you have the <windows.h> header file. */ |
|
51 | /* Define to 1 if you have the <windows.h> header file. */ | |
49 | #undef HAVE_WINDOWS_H |
|
52 | #undef HAVE_WINDOWS_H | |
50 |
|
53 | |||
51 | /* Define to the sub-directory in which libtool stores uninstalled libraries. |
|
54 | /* Define to the sub-directory in which libtool stores uninstalled libraries. | |
52 | */ |
|
55 | */ | |
53 | #undef LT_OBJDIR |
|
56 | #undef LT_OBJDIR | |
54 |
|
57 | |||
55 | /* Name of package */ |
|
58 | /* Name of package */ | |
56 | #undef PACKAGE |
|
59 | #undef PACKAGE | |
57 |
|
60 | |||
58 | /* Define to the address where bug reports for this package should be sent. */ |
|
61 | /* Define to the address where bug reports for this package should be sent. */ | |
59 | #undef PACKAGE_BUGREPORT |
|
62 | #undef PACKAGE_BUGREPORT | |
60 |
|
63 | |||
61 | /* Define to the full name of this package. */ |
|
64 | /* Define to the full name of this package. */ | |
62 | #undef PACKAGE_NAME |
|
65 | #undef PACKAGE_NAME | |
63 |
|
66 | |||
64 | /* Define to the full name and version of this package. */ |
|
67 | /* Define to the full name and version of this package. */ | |
65 | #undef PACKAGE_STRING |
|
68 | #undef PACKAGE_STRING | |
66 |
|
69 | |||
67 | /* Define to the one symbol short name of this package. */ |
|
70 | /* Define to the one symbol short name of this package. */ | |
68 | #undef PACKAGE_TARNAME |
|
71 | #undef PACKAGE_TARNAME | |
69 |
|
72 | |||
70 | /* Define to the home page for this package. */ |
|
73 | /* Define to the home page for this package. */ | |
71 | #undef PACKAGE_URL |
|
74 | #undef PACKAGE_URL | |
72 |
|
75 | |||
73 | /* Define to the version of this package. */ |
|
76 | /* Define to the version of this package. */ | |
74 | #undef PACKAGE_VERSION |
|
77 | #undef PACKAGE_VERSION | |
75 |
|
78 | |||
76 | /* Define to 1 if you have the ANSI C header files. */ |
|
79 | /* Define to 1 if you have the ANSI C header files. */ | |
77 | #undef STDC_HEADERS |
|
80 | #undef STDC_HEADERS | |
78 |
|
81 | |||
79 | /* Version number of package */ |
|
82 | /* Version number of package */ | |
80 | #undef VERSION |
|
83 | #undef VERSION | |
81 |
|
84 | |||
82 | /* Define to empty if `const' does not conform to ANSI C. */ |
|
85 | /* Define to empty if `const' does not conform to ANSI C. */ | |
83 | #undef const |
|
86 | #undef const |
General Comments 0
You need to be logged in to leave comments.
Login now