1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
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