a973b2635f1a69ddb38b73091bc33e0c82d498fa
[debian/amanda] / device-src / tape-aix.c
1 /*
2  * Copyright (c) 2005-2008 Zmanda Inc.  All Rights Reserved.
3  * 
4  * This library is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License version 2.1 as 
6  * published by the Free Software Foundation.
7  * 
8  * This library is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
11  * License for more details.
12  * 
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this library; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
16  * 
17  * Contact information: Zmanda Inc., 465 S Mathlida Ave, Suite 300
18  * Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
19  */
20
21 #include <amanda.h>
22 #include "glib-util.h"
23 #include "tape-ops.h"
24
25 /* Tape operations for AIX systems. Most of this stuff is based on
26    documentation from 
27    http://publibn.boulder.ibm.com/doc_link/Ja_JP/a_doc_lib/files/aixfiles/rmt.htm */
28
29 /* Uncomment to test compilation on non-AIX systems. */
30 /* ---
31 #undef MTIOCTOP
32 #define STIOCTOP 0
33 #define stop mtop
34 #define st_op mt_op
35 #define st_count mt_count
36 #define STREW MTREW
37 #define STFSF MTFSF
38 #define STRSF MTBSF
39 #define STFSR MTFSR
40 #define STRSR MTBSR
41 #define STWEOF MTWEOF
42 --- */
43
44 gboolean tape_rewind(int fd) {
45     struct stop st;
46     st.st_op = STREW;
47     st.st_count = 1;
48     return 0 == ioctl(fd, STIOCTOP, &st);
49 }
50
51 gboolean tape_fsf(int fd, guint count) {
52     struct stop st;
53     st.st_op = STFSF;
54     st.st_count = count;
55     return 0 == ioctl(fd, STIOCTOP, &st);
56 }
57
58 gboolean tape_bsf(int fd, guint count) {
59     struct stop st;
60     st.st_op = STRSF;
61     st.st_count = count;
62     return 0 == ioctl(fd, STIOCTOP, &st);
63 }
64
65 gboolean tape_fsr(int fd, guint count) {
66     struct stop st;
67     st.st_op = STFSR;
68     st.st_count = count;
69     return 0 == ioctl(fd, STIOCTOP, &st);
70 }
71
72 gboolean tape_bsr(int fd, guint count) {
73     struct stop st;
74     st.st_op = STRSR;
75     st.st_count = count;
76     return 0 == ioctl(fd, STIOCTOP, &st);
77 }
78
79 gint tape_eod(int fd G_GNUC_UNUSED) {
80     g_assert_not_reached();
81     return TAPE_OP_ERROR;
82 }
83
84 gboolean tape_weof(int fd, guint8 count) {
85     struct stop st;
86     st.st_op = STWEOF;
87     st.st_count = count;
88     return 0 == ioctl(fd, STIOCTOP, &st);
89 }
90
91 gboolean tape_setcompression(int fd G_GNUC_UNUSED, gboolean on G_GNUC_UNUSED) {
92     return FALSE;
93 }
94
95 DeviceStatusFlags tape_is_tape_device(int fd G_GNUC_UNUSED) {
96     /* AIX doesn't have a no-op, so we'll just assume this is a tape device */
97     return DEVICE_STATUS_SUCCESS;
98 }
99
100 DeviceStatusFlags tape_is_ready(int fd G_GNUC_UNUSED, TapeDevice *t_self G_GNUC_UNUSED) {
101     return DEVICE_STATUS_SUCCESS;
102 }
103
104 void tape_device_detect_capabilities(TapeDevice * t_self) {
105     tape_device_set_capabilities(t_self,
106         TRUE,  PROPERTY_SURETY_BAD,  PROPERTY_SOURCE_DEFAULT, /* fsf*/
107         DEFAULT_FSF_AFTER_FILEMARK, PROPERTY_SURETY_BAD,  PROPERTY_SOURCE_DEFAULT, /* fsf_after_filemark*/
108         TRUE,  PROPERTY_SURETY_BAD,  PROPERTY_SOURCE_DEFAULT, /* bsf*/
109         TRUE,  PROPERTY_SURETY_BAD,  PROPERTY_SOURCE_DEFAULT, /* fsr*/
110         TRUE,  PROPERTY_SURETY_BAD,  PROPERTY_SOURCE_DEFAULT, /* bsr*/
111         FALSE, PROPERTY_SURETY_GOOD, PROPERTY_SOURCE_DEFAULT, /* eom*/
112         FALSE, PROPERTY_SURETY_GOOD, PROPERTY_SOURCE_DEFAULT, /* bsf_after_eom*/
113         2,     PROPERTY_SURETY_BAD,  PROPERTY_SOURCE_DEFAULT  /* final_filemarks*/
114         );
115 }