1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin * *
3da2e3ebdSchin * This software is part of the ast package *
4*3e14f97fSRoger A. Faulkner * Copyright (c) 1985-2010 AT&T Intellectual Property *
5da2e3ebdSchin * and is licensed under the *
6da2e3ebdSchin * Common Public License, Version 1.0 *
77c2fbfb3SApril Chin * by AT&T Intellectual Property *
8da2e3ebdSchin * *
9da2e3ebdSchin * A copy of the License is available at *
10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt *
11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12da2e3ebdSchin * *
13da2e3ebdSchin * Information and Software Systems Research *
14da2e3ebdSchin * AT&T Research *
15da2e3ebdSchin * Florham Park NJ *
16da2e3ebdSchin * *
17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> *
18da2e3ebdSchin * David Korn <dgk@research.att.com> *
19da2e3ebdSchin * Phong Vo <kpv@research.att.com> *
20da2e3ebdSchin * *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin * local device pathname for portable tape unit specification is returned
25da2e3ebdSchin * if e is non-null then it is set to the next unused char in s
26da2e3ebdSchin *
27da2e3ebdSchin * <unit><density>[<no-rewind>]
28da2e3ebdSchin * {0-7}[l,m,h,u,c][n]
29da2e3ebdSchin */
30da2e3ebdSchin
31da2e3ebdSchin #include <ast.h>
32da2e3ebdSchin
33da2e3ebdSchin char*
strtape(register const char * s,register char ** e)34da2e3ebdSchin strtape(register const char* s, register char** e)
35da2e3ebdSchin {
36da2e3ebdSchin int mtunit = '0';
37da2e3ebdSchin int mtdensity = 0;
38da2e3ebdSchin char mtrewind[2];
39da2e3ebdSchin char mtbehavior[2];
40da2e3ebdSchin
41da2e3ebdSchin static char tapefile[sizeof("/dev/Xrmt/123456789")];
42da2e3ebdSchin
43da2e3ebdSchin mtrewind[0] = mtrewind[1] = mtbehavior[0] = mtbehavior[1] = 0;
44da2e3ebdSchin for (;;)
45da2e3ebdSchin {
46da2e3ebdSchin switch (*s)
47da2e3ebdSchin {
48da2e3ebdSchin case '0':
49da2e3ebdSchin case '1':
50da2e3ebdSchin case '2':
51da2e3ebdSchin case '3':
52da2e3ebdSchin case '4':
53da2e3ebdSchin case '5':
54da2e3ebdSchin case '6':
55da2e3ebdSchin case '7':
56da2e3ebdSchin mtunit = *s++;
57da2e3ebdSchin continue;
58da2e3ebdSchin case 'b':
59da2e3ebdSchin case 'v':
60da2e3ebdSchin mtbehavior[0] = *s++;
61da2e3ebdSchin continue;
62da2e3ebdSchin case 'l':
63da2e3ebdSchin case 'm':
64da2e3ebdSchin case 'h':
65da2e3ebdSchin case 'u':
66da2e3ebdSchin case 'c':
67da2e3ebdSchin mtdensity = *s++;
68da2e3ebdSchin continue;
69da2e3ebdSchin case 'n':
70da2e3ebdSchin mtrewind[0] = *s++;
71da2e3ebdSchin continue;
72da2e3ebdSchin }
73da2e3ebdSchin break;
74da2e3ebdSchin }
75da2e3ebdSchin if (e) *e = (char*)s;
76da2e3ebdSchin if (!access("/dev/rmt/.", F_OK))
77da2e3ebdSchin {
78da2e3ebdSchin /*
79da2e3ebdSchin * system V
80da2e3ebdSchin */
81da2e3ebdSchin
82da2e3ebdSchin if (!mtdensity) mtdensity = 'm';
83da2e3ebdSchin sfsprintf(tapefile, sizeof(tapefile), "/dev/rmt/ctape%c%s", mtunit, mtrewind);
84da2e3ebdSchin if (!access(tapefile, F_OK)) return(tapefile);
85da2e3ebdSchin for (;;)
86da2e3ebdSchin {
87da2e3ebdSchin sfsprintf(tapefile, sizeof(tapefile), "/dev/rmt/%c%c%s%s", mtunit, mtdensity, mtbehavior, mtrewind);
88da2e3ebdSchin if (!access(tapefile, F_OK)) return(tapefile);
89da2e3ebdSchin if (!mtbehavior[0]) break;
90da2e3ebdSchin mtbehavior[0] = 0;
91da2e3ebdSchin }
92da2e3ebdSchin }
93da2e3ebdSchin else if (!access("/dev/nst0", F_OK))
94da2e3ebdSchin {
95da2e3ebdSchin /*
96da2e3ebdSchin * linux
97da2e3ebdSchin */
98da2e3ebdSchin
99da2e3ebdSchin sfsprintf(tapefile, sizeof(tapefile), "/dev/%sst%c", mtrewind, mtunit);
100da2e3ebdSchin }
101da2e3ebdSchin else if (!access("/dev/nrmt0", F_OK))
102da2e3ebdSchin {
103da2e3ebdSchin /*
104da2e3ebdSchin * 9th edition
105da2e3ebdSchin */
106da2e3ebdSchin
107da2e3ebdSchin switch (mtdensity)
108da2e3ebdSchin {
109da2e3ebdSchin case 'l':
110da2e3ebdSchin mtunit = '0';
111da2e3ebdSchin break;
112da2e3ebdSchin case 'm':
113da2e3ebdSchin mtunit = '1';
114da2e3ebdSchin break;
115da2e3ebdSchin case 'h':
116da2e3ebdSchin mtunit = '2';
117da2e3ebdSchin break;
118da2e3ebdSchin }
119da2e3ebdSchin sfsprintf(tapefile, sizeof(tapefile), "/dev/%srmt%c", mtrewind, mtunit);
120da2e3ebdSchin }
121da2e3ebdSchin else
122da2e3ebdSchin {
123da2e3ebdSchin /*
124da2e3ebdSchin * BSD
125da2e3ebdSchin */
126da2e3ebdSchin
127da2e3ebdSchin mtunit -= '0';
128da2e3ebdSchin switch (mtdensity)
129da2e3ebdSchin {
130da2e3ebdSchin case 'l':
131da2e3ebdSchin break;
132da2e3ebdSchin case 'h':
133da2e3ebdSchin mtunit |= 020;
134da2e3ebdSchin break;
135da2e3ebdSchin default:
136da2e3ebdSchin mtunit |= 010;
137da2e3ebdSchin break;
138da2e3ebdSchin }
139da2e3ebdSchin switch (mtrewind[0])
140da2e3ebdSchin {
141da2e3ebdSchin case 'n':
142da2e3ebdSchin mtunit |= 040;
143da2e3ebdSchin break;
144da2e3ebdSchin }
145da2e3ebdSchin sfsprintf(tapefile, sizeof(tapefile), "/dev/rmt%d", mtunit);
146da2e3ebdSchin }
147da2e3ebdSchin return(tapefile);
148da2e3ebdSchin }
149