134
134
#include "atopacctd.h"
135
135
136
136
#define ACCTDIR "/var/cache/atop.d"
137
+ #define ACCTDIRENV "ATOPACCTDIR"
137
138
#define ACCTFILE "atop.acct"
138
139
#define ACCTENV "ATOPACCT"
139
140
141
+ static char * acctdir = ACCTDIR ;
142
+
140
143
static char acctatop ; /* boolean: atop's own accounting busy ? */
141
144
static off_t acctsize ; /* previous size of account file */
142
145
static int acctrecsz ; /* size of account record */
@@ -249,6 +252,19 @@ acctswon(void)
249
252
}
250
253
}
251
254
255
+ /*
256
+ ** when a particular environment variable is present, atop should
257
+ ** use a specific directory for accounting-file (as defined by the environment
258
+ ** variable)
259
+ */
260
+ if ( (ep = getenv (ACCTDIRENV )) && * ep )
261
+ {
262
+ acctdir = ep ;
263
+ }
264
+
265
+ char acctfilepath [128 ];
266
+ snprintf (acctfilepath , sizeof acctfilepath , "%s/%s" , acctdir , ACCTFILE );
267
+
252
268
/*
253
269
** when the atopacctd daemon is active on this system,
254
270
** it should be the preferred way to read the accounting records
@@ -435,16 +451,16 @@ acctswon(void)
435
451
** if this directory exists (e.g. previous atop-run killed)
436
452
** it will be cleaned and newly created
437
453
*/
438
- if ( mkdir (ACCTDIR , 0700 ) == -1 )
454
+ if ( mkdir (acctdir , 0700 ) == -1 )
439
455
{
440
456
if (errno == EEXIST )
441
457
{
442
458
(void ) acct (0 );
443
- (void ) unlink (ACCTDIR "/" ACCTFILE );
444
- (void ) rmdir (ACCTDIR );
459
+ (void ) unlink (acctfilepath );
460
+ (void ) rmdir (acctdir );
445
461
}
446
462
447
- if ( mkdir (ACCTDIR , 0700 ) == -1 )
463
+ if ( mkdir (acctdir , 0700 ) == -1 )
448
464
{
449
465
/*
450
466
** persistent failure
@@ -453,19 +469,18 @@ acctswon(void)
453
469
return 4 ;
454
470
}
455
471
}
456
-
457
472
/*
458
473
** create accounting file in new directory
459
474
*/
460
- (void ) close ( creat (ACCTDIR "/" ACCTFILE , 0600 ) );
475
+ (void ) close ( creat ( acctfilepath , 0600 ) );
461
476
462
477
/*
463
478
** switch on accounting
464
479
*/
465
- if ( acct (ACCTDIR "/" ACCTFILE ) < 0 )
480
+ if ( acct ( acctfilepath ) < 0 )
466
481
{
467
- (void ) unlink (ACCTDIR "/" ACCTFILE );
468
- (void ) rmdir (ACCTDIR );
482
+ (void ) unlink (acctfilepath );
483
+ (void ) rmdir (acctdir );
469
484
(void ) semop (sematopid , & semrelse , 1 );
470
485
471
486
return 5 ;
@@ -476,11 +491,11 @@ acctswon(void)
476
491
** accounting is switched on now;
477
492
** open accounting-file
478
493
*/
479
- if ( (acctfd = open (ACCTDIR "/" ACCTFILE , O_RDONLY ) ) < 0 )
494
+ if ( (acctfd = open (acctfilepath , O_RDONLY ) ) < 0 )
480
495
{
481
496
(void ) acct (0 );
482
- (void ) unlink (ACCTDIR "/" ACCTFILE );
483
- (void ) rmdir (ACCTDIR );
497
+ (void ) unlink (acctfilepath );
498
+ (void ) rmdir (acctdir );
484
499
485
500
(void ) semop (sematopid , & semrelse , 1 );
486
501
return 1 ;
@@ -501,8 +516,8 @@ acctswon(void)
501
516
{
502
517
(void ) acct (0 );
503
518
(void ) close (acctfd );
504
- (void ) unlink (ACCTDIR "/" ACCTFILE );
505
- (void ) rmdir (ACCTDIR );
519
+ (void ) unlink (acctfilepath );
520
+ (void ) rmdir (acctdir );
506
521
507
522
acctfd = -1 ;
508
523
return 1 ;
@@ -524,8 +539,8 @@ acctswon(void)
524
539
{
525
540
(void ) acct (0 );
526
541
(void ) close (acctfd );
527
- (void ) unlink (ACCTDIR "/" ACCTFILE );
528
- (void ) rmdir (ACCTDIR );
542
+ (void ) unlink (acctfilepath );
543
+ (void ) rmdir (acctdir );
529
544
530
545
acctfd = -1 ;
531
546
return 1 ;
@@ -635,14 +650,24 @@ acctswoff(void)
635
650
636
651
if (after .st_size > before .st_size )
637
652
{
653
+
654
+ char * ep ;
655
+ if ( (ep = getenv (ACCTDIRENV )) && * ep )
656
+ {
657
+ acctdir = ep ;
658
+ }
659
+
660
+ char acctfilepath [128 ];
661
+ snprintf (acctfilepath , sizeof acctfilepath , "%s/%s" , acctdir , ACCTFILE );
662
+
638
663
/*
639
664
** remove the directory and file
640
665
*/
641
666
regainrootprivs (); /* get root privs again */
642
667
643
668
(void ) acct (0 );
644
- (void ) unlink (ACCTDIR "/" ACCTFILE );
645
- (void ) rmdir (ACCTDIR );
669
+ (void ) unlink (acctfilepath );
670
+ (void ) rmdir (acctdir );
646
671
647
672
if (! droprootprivs () )
648
673
mcleanstop (42 ,
@@ -982,10 +1007,24 @@ acctrestarttrial()
982
1007
983
1008
(void ) acct (0 ); // switch off accounting
984
1009
985
- if ( truncate (ACCTDIR "/" ACCTFILE , 0 ) == 0 )
1010
+ /*
1011
+ ** when a particular environment variable is present, atop should
1012
+ ** use a specific directory for accounting-file (as defined by the environment
1013
+ ** variable)
1014
+ */
1015
+ char * ep ;
1016
+ if ( (ep = getenv (ACCTDIRENV )) && * ep )
1017
+ {
1018
+ acctdir = ep ;
1019
+ }
1020
+
1021
+ char acctfilepath [128 ];
1022
+ snprintf (acctfilepath , sizeof acctfilepath , "%s/%s" , acctdir , ACCTFILE );
1023
+
1024
+ if ( truncate (acctfilepath , 0 ) == 0 )
986
1025
(void ) lseek (acctfd , 0 , SEEK_SET );
987
1026
988
- (void ) acct (ACCTDIR "/" ACCTFILE );
1027
+ (void ) acct (acctfilepath );
989
1028
990
1029
if (! droprootprivs () )
991
1030
mcleanstop (42 , "failed to drop root privs\n" );
0 commit comments