File Coverage

CTK.xs
Criterion Covered Total %
statement 36 50 72.0
branch 13 22 59.0
condition n/a
subroutine n/a
pod n/a
total 49 72 68.0


line stmt bran cond sub pod time code
1             /*
2             ** Copyright (C) 1998-2022 D&D Corporation. All Rights Reserved
3             **
4             ** This program is free software; you can redistribute it and/or
5             ** modify it under the same terms as Perl itself.
6             **
7             ** See file and
8             */
9              
10             #include "EXTERN.h"
11             #include "perl.h"
12             #include "XSUB.h"
13              
14             #include "CTK.h"
15              
16             #define PROGRAM_NAME "shred"
17             #define PROGRAM_VERSION "1.01"
18             #define AUTHORS "Serz Minus"
19              
20             #define PASSES 3
21             #define BUFFSIZE 512
22              
23             static char *
24 6           rnds(int n) {
25 6           int pid = getpid();
26             int i;
27             static char rndch[BUFFSIZE];
28              
29 6 50         if (pid < 0) pid = pid * -1;
30 6           pid += n;
31 6           srand(pid % 255);
32              
33 3078 100         for (i = 0; i < BUFFSIZE; i++) {
34 3072           rndch[i] = (rand() % 255);
35             }
36              
37 6           return rndch;
38             }
39              
40             static int
41 6           pass( int fd, off_t *sizep, int n) {
42 6           off_t size = *sizep;
43 6           off_t blksize = (off_t) BUFFSIZE;
44 6           off_t blks = (off_t) 0;
45 6           off_t blkn = (off_t) 0;
46 6           off_t blka = size % blksize;
47             ssize_t ssize; /* Return value from write */
48             char *buf;
49 6 50         if (blka == 0) {
50 0           blks = size / blksize;
51             } else {
52 6           blks = (size - blka) / blksize;
53             }
54              
55 6 50         if (lseek (fd, (off_t) 0, SEEK_SET) == -1) {
56 0           fprintf(stderr, "Error. Can't rewind\n");
57 0           fflush (stderr);
58 0           return 0;
59             }
60              
61             /* Loop to retry partial writes. */
62 6           buf = rnds(n);
63 6 50         for (blkn = 0; blkn < blks; blkn ++) {
64 0           ssize = write (fd, buf, blksize);
65             }
66 6 50         if (blka > 0) {
67 6           ssize = write (fd, buf, blka);
68             }
69              
70 6           return 1;
71             }
72              
73             static int
74 2           wipe(char *fn, size_t sz) {
75             int fd;
76             off_t size;
77             size_t i;
78             unsigned int n;
79              
80 2           fd = open (fn, O_WRONLY | O_NOCTTY);
81 2 50         if (fd < 0) {
82 0           fprintf(stderr, "Can't open file \"%s\": %s\n", fn, rerr);
83 0           fflush (stderr);
84 0           return 0;
85             }
86              
87 2           size = sz;
88             /* printf("SIZE: %d\n",size); */
89              
90 2 50         if (size < 0) {
91 0           fprintf(stderr, "File \"%s\" has negative size\n", fn);
92 0           fflush (stderr);
93 0           return 0;
94             }
95              
96             /* Do the work */
97 2           n = PASSES;
98              
99 8 100         for (i = 0; i < n; i++) {
100 6           if (pass(fd, &size, i)) {
101             /*printf("Pass %d on %d\n", i+1, n);*/
102             } else {
103             /*printf("Fault %d on %d\n", i+1, n);*/
104             }
105             }
106              
107 2 50         if (close (fd) != 0) {
108 0           fprintf(stderr, "Can't close \"%s\": %s\n", fn, rerr);
109 0           fflush (stderr);
110 0           return 0;
111             }
112              
113 2           return 1;
114             }
115              
116             MODULE = CTK PACKAGE = CTK::UtilXS
117              
118              
119             SV *
120             xstest()
121             ALIAS:
122             xsver = 1
123             CODE:
124             {
125 1           RETVAL = newSVpv(PROGRAM_VERSION,0);
126             }
127             OUTPUT:
128             RETVAL
129              
130             int
131             wipef(str,sz)
132             SV * str
133             size_t sz
134             PROTOTYPE: $
135             PREINIT:
136             char *rstr;
137             STRLEN rlen;
138             CODE:
139             {
140             int wres;
141 2 50         rstr = SvPV(str, rlen); /* SvPV(sv, len) gives warning for signed len */
142             /* printf("String: %s\n",rstr); */
143 2           wres = wipe(rstr,sz);
144 2           RETVAL = wres;
145             }
146             OUTPUT:
147             RETVAL