]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - sys-utils/cytune.c
1 /* cytune.c -- Tune Cyclades driver
3 * Copyright 1995 Nick Simicich (njs@scifi.emi.net)
5 * Modifications by Rik Faith (faith@cs.unc.edu)
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the Nick Simicich
18 * 4. Neither the name of the Nick Simicich nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY NICK SIMICICH AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL NICK SIMICICH OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
38 * - added Native Language Support
39 * Sun Mar 21 1999 - Arnaldo Carvalho de Melo <acme@conectiva.com.br>
40 * - fixed strerr(errno) in gettext calls
45 #include <sys/types.h>
47 #include <sys/ioctl.h>
53 #include <linux/tty.h>
56 #include "../defines.h" /* for NEED_tqueue_h */
58 #include <linux/tqueue.h> /* required for old kernels (for struct tq_struct) */
59 /* compilation errors on other kernels */
61 #include <linux/cyclades.h>
65 # include <linux/version.h>
66 # if LINUX_VERSION_CODE > 66056
73 /* Until it gets put in the kernel,
77 struct cyclades_control
{
78 struct cyclades_monitor c
;
83 unsigned long threshold_value
;
84 unsigned long timeout_value
;
86 struct cyclades_control
* cmon
;
89 #define mvtime(tvpto, tvpfrom) (((tvpto)->tv_sec = (tvpfrom)->tv_sec),(tvpto)->tv_usec = (tvpfrom)->tv_usec)
93 dtime ( struct timeval
* tvpnew
, struct timeval
* tvpold
) {
95 diff
= ( double ) tvpnew
-> tv_sec
- ( double ) tvpold
-> tv_sec
;
96 diff
+= (( double ) tvpnew
-> tv_usec
- ( double ) tvpold
-> tv_usec
)/ 1000000 ;
100 static int global_argc
, global_optind
;
101 static char *** global_argv
;
105 struct cyclades_control
* cc
;
107 int argc
, local_optind
;
114 local_optind
= global_optind
;
117 for ( i
= local_optind
; i
< argc
; i
++) {
118 j
= i
- local_optind
;
119 cc
= & cmon
[ cmon_index
];
120 fprintf ( stderr
, _ ( "File %s, For threshold value %lu, Maximum characters in fifo were %d, \n and the maximum transfer rate in characters/second was %f \n " ),
129 cc
= & cmon
[ cmon_index
];
130 if ( cc
-> threshold_value
> 0 && sig
!= - 1 ) {
131 fprintf ( stderr
, _ ( "File %s, For threshold value %lu and timrout value %lu, Maximum characters in fifo were %d, \n and the maximum transfer rate in characters/second was %f \n " ),
132 argv
[ cmon_index
+ local_optind
],
140 cc
-> threshold_value
= 0 ;
141 cc
-> timeout_value
= 0 ;
144 static int query
= 0 ;
145 static int interval
= 1 ;
148 static int set_val
= - 1 ;
151 static int set_def
= 0 ;
152 static int set_def_val
= - 1 ;
153 static int get_def
= 0 ;
155 static int set_time
= 0 ;
156 static int set_time_val
= - 1 ;
158 static int set_def_time
= 0 ;
159 static int set_def_time_val
= - 1 ;
162 int main ( int argc
, char * argv
[]) {
164 struct timeval lasttime
, thistime
;
165 struct timezone tz
= { 0 , 0 };
170 struct cyclades_monitor cywork
;
173 unsigned long threshold_value
;
174 unsigned long timeout_value
;
180 global_argc
= argc
; /* For signal routine. */
181 global_argv
= & argv
; /* For signal routine. */
183 setlocale ( LC_ALL
, "" );
184 bindtextdomain ( PACKAGE
, LOCALEDIR
);
187 while ( EOF
!= ( i
= getopt ( argc
, argv
,
194 interval
= atoi ( optarg
);
196 fprintf ( stderr
, _ ( "Invalid interval value: %s \n " ), optarg
);
202 set_val
= atoi ( optarg
);
203 if ( set_val
<= 0 || set_val
> 12 ) {
204 fprintf ( stderr
, _ ( "Invalid set value: %s \n " ), optarg
);
210 set_def_val
= atoi ( optarg
);
211 if ( set_def_val
< 0 || set_def_val
> 12 ) {
212 fprintf ( stderr
, _ ( "Invalid default value: %s \n " ), optarg
);
218 set_time_val
= atoi ( optarg
);
219 if ( set_time_val
<= 0 || set_time_val
> 255 ) {
220 fprintf ( stderr
, _ ( "Invalid set time value: %s \n " ), optarg
);
226 set_def_time_val
= atoi ( optarg
);
227 if ( set_def_time_val
< 0 || set_def_time_val
> 255 ) {
228 fprintf ( stderr
, _ ( "Invalid default time value: %s \n " ), optarg
);
232 case 'g' : ++ get
; break ;
233 case 'G' : ++ get_def
; break ;
238 numfiles
= argc
- optind
;
239 if ( errflg
|| ( numfiles
== 0 )
240 || (! query
&& ! set
&& ! set_def
&&
241 ! get
&& ! get_def
&& ! set_time
&& ! set_def_time
) ||
242 ( set
&& set_def
) || ( set_time
&& set_def_time
) ||
245 _ ( "Usage: %s [-q [-i interval]] ([-s value]|[-S value]) ([-t value]|[-T value]) [-g|-G] file [file...] \n " ),
250 global_optind
= optind
; /* For signal routine. */
252 if ( set
|| set_def
) {
253 for ( i
= optind
; i
< argc
; i
++) {
254 file
= open ( argv
[ i
], O_RDONLY
);
257 fprintf ( stderr
, _ ( "Can't open %s: %s \n " ), argv
[ i
], strerror ( errsv
));
261 set
? CYSETTHRESH
: CYSETDEFTHRESH
,
262 set
? set_val
: set_def_val
)) {
264 fprintf ( stderr
, _ ( "Can't set %s to threshold %d: %s \n " ),
265 argv
[ i
], set
? set_val
: set_def_val
, strerror ( errsv
));
270 if ( set_time
|| set_def_time
) {
271 for ( i
= optind
; i
< argc
; i
++) {
272 file
= open ( argv
[ i
], O_RDONLY
);
275 fprintf ( stderr
, _ ( "Can't open %s: %s \n " ), argv
[ i
], strerror ( errsv
));
279 set_time
? CYSETTIMEOUT
: CYSETDEFTIMEOUT
,
280 set_time
? set_time_val
: set_def_time_val
)) {
282 fprintf ( stderr
, _ ( "Can't set %s to time threshold %d: %s \n " ),
283 argv
[ i
], set_time
? set_time_val
: set_def_time_val
, strerror ( errsv
));
289 if ( get
|| get_def
) {
290 for ( i
= optind
; i
< argc
; i
++) {
291 file
= open ( argv
[ i
], O_RDONLY
);
294 fprintf ( stderr
, _ ( "Can't open %s: %s \n " ), argv
[ i
], strerror ( errsv
));
297 if ( ioctl ( file
, get
? CYGETTHRESH
: CYGETDEFTHRESH
, & threshold_value
)) {
299 fprintf ( stderr
, _ ( "Can't get threshold for %s: %s \n " ),
300 argv
[ i
], strerror ( errsv
));
303 if ( ioctl ( file
, get
? CYGETTIMEOUT
: CYGETDEFTIMEOUT
, & timeout_value
)) {
305 fprintf ( stderr
, _ ( "Can't get timeout for %s: %s \n " ),
306 argv
[ i
], strerror ( errsv
));
309 printf ( _ ( "%s: %ld %s threshold and %ld %s timeout \n " ),
310 argv
[ i
], threshold_value
,
311 get
? _ ( "current" ): _ ( "default" ),
313 get
? _ ( "current" ): _ ( "default" ));
317 if (! query
) return 0 ; /* must have been something earlier */
319 /* query stuff after this line */
321 cmon
= ( struct cyclades_control
*) malloc ( sizeof ( struct cyclades_control
)
324 perror ( _ ( "malloc failed" ));
327 if ( signal ( SIGINT
, summary
)||
328 signal ( SIGQUIT
, summary
)||
329 signal ( SIGTERM
, summary
)) {
330 perror ( _ ( "Can't set signal handler" ));
333 if ( gettimeofday (& lasttime
,& tz
)) {
334 perror ( _ ( "gettimeofday failed" ));
337 for ( i
= optind
; i
< argc
; i
++) {
338 cmon_index
= i
- optind
;
339 cmon
[ cmon_index
]. cfile
= open ( argv
[ i
], O_RDONLY
);
340 if (- 1 == cmon
[ cmon_index
]. cfile
) {
342 fprintf ( stderr
, _ ( "Can't open %s: %s \n " ), argv
[ i
], strerror ( errsv
));
345 if ( ioctl ( cmon
[ cmon_index
]. cfile
, CYGETMON
, & cmon
[ cmon_index
]. c
)) {
347 fprintf ( stderr
, _ ( "Can't issue CYGETMON on %s: %s \n " ),
348 argv
[ i
], strerror ( errsv
));
352 if ( ioctl ( cmon
[ cmon_index
]. cfile
, CYGETTHRESH
, & threshold_value
)) {
354 fprintf ( stderr
, _ ( "Can't get threshold for %s: %s \n " ),
355 argv
[ i
], strerror ( errsv
));
358 if ( ioctl ( cmon
[ cmon_index
]. cfile
, CYGETTIMEOUT
, & timeout_value
)) {
360 fprintf ( stderr
, _ ( "Can't get timeout for %s: %s \n " ),
361 argv
[ i
], strerror ( errsv
));
368 if ( gettimeofday (& thistime
,& tz
)) {
369 perror ( _ ( "gettimeofday failed" ));
372 diff
= dtime (& thistime
, & lasttime
);
373 mvtime (& lasttime
, & thistime
);
375 for ( i
= optind
; i
< argc
; i
++) {
376 cmon_index
= i
- optind
;
377 if ( ioctl ( cmon
[ cmon_index
]. cfile
, CYGETMON
, & cywork
)) {
379 fprintf ( stderr
, _ ( "Can't issue CYGETMON on %s: %s \n " ),
380 argv
[ i
], strerror ( errsv
));
383 if ( ioctl ( cmon
[ cmon_index
]. cfile
, CYGETTHRESH
, & threshold_value
)) {
385 fprintf ( stderr
, _ ( "Can't get threshold for %s: %s \n " ),
386 argv
[ i
], strerror ( errsv
));
389 if ( ioctl ( cmon
[ cmon_index
]. cfile
, CYGETTIMEOUT
, & timeout_value
)) {
391 fprintf ( stderr
, _ ( "Can't get timeout for %s: %s \n " ),
392 argv
[ i
], strerror ( errsv
));
396 xfer_rate
= cywork
. char_count
/ diff
;
398 xmit_rate
= cywork
. send_count
/ diff
;
401 if ( threshold_value
!= cmon
[ cmon_index
]. threshold_value
||
402 timeout_value
!= cmon
[ cmon_index
]. timeout_value
) {
404 /* Note that the summary must come before the setting of */
405 /* threshold_value */
406 cmon
[ cmon_index
]. threshold_value
= threshold_value
;
407 cmon
[ cmon_index
]. timeout_value
= timeout_value
;
409 /* Don't record this first cycle after change */
410 if ( xfer_rate
> cmon
[ cmon_index
]. maxtran
)
411 cmon
[ cmon_index
]. maxtran
= xfer_rate
;
413 if ( xmit_rate
> cmon
[ cmon_index
]. maxxmit
)
414 cmon
[ cmon_index
]. maxxmit
= xmit_rate
;
416 if ( cywork
. char_max
> cmon
[ cmon_index
]. maxmax
)
417 cmon
[ cmon_index
]. maxmax
= cywork
. char_max
;
421 printf ( _ ( "%s: %lu ints, %lu/%lu chars; " )
422 _ ( "fifo: %lu thresh, %lu tmout, " )
423 _ ( "%lu max, %lu now \n " ),
425 cywork
. int_count
, cywork
. char_count
, cywork
. send_count
,
426 threshold_value
, timeout_value
,
427 cywork
. char_max
, cywork
. char_last
);
428 printf ( _ ( " %f int/sec; %f rec, %f send (char/sec) \n " ),
429 cywork
. int_count
/ diff
,
433 printf ( _ ( "%s: %lu ints, %lu chars; fifo: %lu thresh, %lu tmout, %lu max, %lu now \n " ),
435 cywork
. int_count
, cywork
. char_count
,
436 threshold_value
, timeout_value
,
437 cywork
. char_max
, cywork
. char_last
);
438 printf ( _ ( " %f int/sec; %f rec (char/sec) \n " ),
439 cywork
. int_count
/ diff
,
442 memcpy (& cmon
[ cmon_index
]. c
, & cywork
, sizeof ( struct cyclades_monitor
));