home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / bundle < prev    next >
Internet Message Format  |  1987-08-12  |  10KB

  1. Path: uunet!rs
  2. From: rs@uunet.UU.NET (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v11i009:  Buffered copy to/from physical devices
  5. Message-ID: <899@uunet.UU.NET>
  6. Date: 13 Aug 87 22:51:33 GMT
  7. Organization: UUNET Communications Services, Arlington, VA
  8. Lines: 330
  9. Approved: rs@uunet.UU.NET
  10.  
  11. Submitted-by: <steinmetz!crdos1!davidsen>
  12. Posting-number: Volume 11, Issue 9
  13. Archive-name: bundle
  14.  
  15. These programs allow a physical device to be the head or end of a pipe,
  16. allowing software which does not know about volumes to operate on
  17. multi-volume sets, and improving the performance of programs such as
  18. tar and cpio.  It works on systems with 16 bit ints such as PC/IX, Xenix,
  19. and Microport.
  20.  
  21. bill davidsen        (davidsen@ge-crd.ARPA)
  22.     ihnp4!seismo!rochester!steinmetz! \
  23.                   chinet! ->--- crdos1!davidsen
  24.  
  25. [  Another spliced-in Makefile.  --r$  ]
  26. #!/bin/sh
  27. # shar+ created from directory /usr2/davidsen
  28. echo 'x - bundle.1 (text)'
  29. sed << 'E!O!F' 's/^X//' > bundle.1
  30. X'\"  Copyright 1986,87 by Bill Davidsen. This code may be used for
  31. X'\"  personal or commercial purposes. It may be freely distributed
  32. X'\"  in source form providing this notice is kept intact.
  33. X.TH bundle 1 Local
  34. X'\" Heading: name(sect)    center (paren)    name(sect)
  35. X.SH NAME
  36. Xbundle \- buffer and copy \fIstdin\fR to a physicaql device
  37. Xunbundle \- buffer and copy a physical device to \fIstdout\fR
  38. X.SH SYNOPSIS
  39. X\fBbundle\fR special dev_size buf_size
  40. X.br
  41. X\fBunbundle\fR special buf_size
  42. X.SH DESCRIPTION
  43. XThese programs allow a physical device to be the head or end of a pipe,
  44. Xallows software which does not know about volumes to operate on
  45. Xmulti-volume sets, and improves the performance of programs such as
  46. X\fItar\fR and \fIcpio\fR.
  47. X.P
  48. X\fBSpecial\fR is the name of a raw device, such as /dev/rmt0.
  49. X\fBdev_size\fR is the size of the device, given in bytes or kilobytes.
  50. XWhen \fBdev_size\fR bytes have been written to the output device, the
  51. Xoperator will be prompted for a media change. \fBBuf_size\fR is the size
  52. Xof the buffer for the write or read. For tape this should be the desired
  53. Xtape block size. For disk this should be a multiple of the size of a
  54. Xtrack. For disk output writing a track at a time rather than sectors
  55. Xcan reduce real time by a factor of three.
  56. X.SH EXAMPLES
  57. X  ls *.c | cpio -o | bundle /dev/rfp021 395k 5k
  58. X  unbundle /dev/rfp021 5k | cpio -idm
  59. X  tar cf - /usr/local | bundle /dev/rmt0 4000k 8k
  60. X  unbundle /dev/rmt0 8k | tar cf -
  61. X.SH WARNINGS
  62. X\fIunbundle\fR reads to EOF on the input device. There is no way to read
  63. Xonly part of a volume. If the \fBdev_size\fR is not a multiple of the
  64. X\fBbuf_size\fR, bizarre errors may occur.
  65. X.SH FILES
  66. X/dev/\fBspecial\fR
  67. X.SH SEE ALSO
  68. Xtar, cpio.
  69. X.SH AUTHOR
  70. XBill Davidsen (ihnp4!chinet!crdos1!davidsen)
  71. X'\" For more details, see man(7), as well as man(1), manroff(1), and mmt(1)
  72. E!O!F
  73. newsize=`wc -c < bundle.1`
  74. if [ $newsize -ne 1832 ]
  75. then echo "File bundle.1 was $newsize bytes, 1832 expected"
  76. fi
  77. echo 'x - bundle.c (text)'
  78. sed << 'E!O!F' 's/^X//' > bundle.c
  79. X/*****************************************************************
  80. X |  Program name:  bundle.c
  81. X |----------------------------------------------------------------
  82. X |  accept standard input and write to a device named on the command
  83. X |  line. The total bytes on the device and the buffer size are
  84. X |  given on the command line. When the device is full, prompt
  85. X |  for a new medium in the device and continue.
  86. X |
  87. X |  Command form:
  88. X |   bundle device Dsize Bsize
  89. X |----------------------------------------------------------------
  90. X |  Author: Bill Davidsen, 8/16/86
  91. X |  Version 1.6
  92. X |  Last modified: 3/6/87
  93. X |----------------------------------------------------------------
  94. X |  Copyright 1986,87 by Bill Davidsen. This code may be used for
  95. X |  personal or commercial purposes. It may be freely distributed
  96. X |  in source form providing this notice is kept intact.
  97. X *****************************************************************/
  98. X
  99. X#include <stdio.h>
  100. X
  101. X#ifdef DEBUG
  102. X#define debug(f,v) fprintf(stderr, f, v)
  103. X#else
  104. X#define debug(f,v)
  105. X#endif
  106. X
  107. Xstatic char *SCCS = "@(#) bundle 1.6";
  108. X
  109. Xmain (argc, argv)
  110. X    int  argc;
  111. X    char *argv[];
  112. X{
  113. X    char *buffer,        /* i/o buffer */
  114. X         *malloc ();
  115. X    register  long left;    /* room left in the buffer */
  116. X    long  bufsize, devsize;    /* buffer and device size */
  117. X    long  devleft = 0;        /* room left on device */
  118. X    int  istat,            /* stdin read status */
  119. X         ostat,            /* device write status */
  120. X         dev,            /* device name from open */
  121. X         MediaNum = 1;        /* sequential media # */
  122. X    FILE *tty, *fopen ();
  123. X    long getsize ();        /* get size from argument */
  124. X
  125. X /* validate arguments */
  126. X    if (argc != 4)
  127. X    { /* invalid */
  128. X    printf ("Format:\n bundle device DevSize BufSize\n");
  129. X    printf ("Where size may be bytes (as 5120) or k (as 5k)\n");
  130. X    exit (1);
  131. X    }
  132. X
  133. X    devsize = getsize (argv[2]);
  134. X    debug ("Device size %ld", devsize);
  135. X    bufsize = getsize (argv[3]);
  136. X    debug (", buffer size %ld\n", bufsize);
  137. X    if (devsize < 1 || devsize < bufsize)
  138. X    { /* invalid specification of size */
  139. X    printf ("Invalid buffer and/or device size\n");
  140. X    exit (1);
  141. X    }
  142. X
  143. X /* open the terminal for prompt */
  144. X    tty = fopen ("/dev/tty", "r");
  145. X    if (tty == NULL)
  146. X    { /* mystery failure */
  147. X    printf ("Unable to open /dev/tty for prompt\n");
  148. X    exit (1);
  149. X    }
  150. X
  151. X /* open the buffer */
  152. X    buffer = malloc (bufsize);
  153. X    debug ("Buffer allocated\n", 0);
  154. X    if (buffer == NULL)
  155. X    { /* can't mallocate */
  156. X    printf ("Can't allocate space for the buffer\n");
  157. X    exit (1);
  158. X    }
  159. X
  160. X /* see if you can open the device */
  161. X    printf ("Mount media #1 on %s and press RETURN", argv[1]);
  162. X    while (getc (tty) != '\n');
  163. X    dev = open (argv[1], 1);
  164. X    if (dev < 0)
  165. X    { /* invalid name */
  166. X    printf ("Can't access device %s\n", argv[1]);
  167. X    exit (1);
  168. X    }
  169. X    devleft = devsize; /* set media ready */
  170. X    debug ("Enter copy loop\n\n", 0);
  171. X
  172. X /* main copy loop */
  173. X    while (istat = fread (buffer, 1, (int) bufsize, stdin))
  174. X    { /* until EOF */
  175. X    debug ("Input read size %d\n", istat);
  176. X
  177. X    if (devleft < istat)
  178. X    { /* change media */
  179. X        close (dev);
  180. X        printf ("\007Mount media #%d on %s and press RETURN: ",
  181. X            ++MediaNum, argv[1]);
  182. X        while (getc (tty) != '\n');
  183. X        dev = open (argv[1], 1);
  184. X        devleft = devsize;
  185. X    }
  186. X
  187. X    /* write the buffer */
  188. X    ostat = write (dev, buffer, bufsize);
  189. X    debug ("Output write size %d\n", ostat);
  190. X
  191. X    if (bufsize != ostat)
  192. X    { /* error on write */
  193. X        printf ("Error on device write!\n");
  194. X        exit (1);
  195. X    }
  196. X    devleft -= ostat;
  197. X    }
  198. X}
  199. X
  200. X/*
  201. X |  Procedure:  getsize
  202. X |-
  203. X |  Convert the size string to bytes. If the last character is
  204. X |  'k', multiply by 1024
  205. X */
  206. X
  207. Xlong
  208. Xgetsize (string)
  209. X    char *string;
  210. X{
  211. X    register long  len = strlen (string),
  212. X                   val = atol (string);
  213. X
  214. X    if (string[len - 1] == 'k')
  215. X    val *= 1024;
  216. X
  217. X    return val;
  218. X}
  219. E!O!F
  220. newsize=`wc -c < bundle.c`
  221. if [ $newsize -ne 3803 ]
  222. then echo "File bundle.c was $newsize bytes, 3803 expected"
  223. fi
  224. echo 'x - unbundle.c (text)'
  225. sed << 'E!O!F' 's/^X//' > unbundle.c
  226. X/*****************************************************************
  227. X |  Program: unbundle
  228. X |    accept input from a device and write to stdout
  229. X |----------------------------------------------------------------
  230. X |  Arguments:
  231. X |   1) device name
  232. X |   2) block size in bytes or k
  233. X |  Version: 1.6
  234. X |  Last modified: 3/6/87
  235. X |----------------------------------------------------------------
  236. X |  Copyright 1986,87 by Bill Davidsen. This code may be used for
  237. X |  personal or commercial purposes. It may be freely distributed
  238. X |  in source form providing this notice is kept intact.
  239. X ****************************************************************/
  240. X
  241. X#include <stdio.h>
  242. X
  243. X#ifdef DEBUG
  244. X#define debug(f,v) fprintf(stderr, f, v)
  245. X#else
  246. X#define debug(f,v)
  247. X#endif
  248. Xmain (argc, argv)
  249. X    int  argc;
  250. X    char *argv[];
  251. X{
  252. X    char *buf, *malloc ();
  253. X    int  bufsize, dn, mnum = 1, ch, readsize;
  254. X    static char *SCCSid = "@(#)unbundle 1.6";
  255. X    long getsize ();        /* size of buffer */
  256. X
  257. X    if (argc != 3)
  258. X    { /* bad calling sequence */
  259. X    fprintf (stderr, "%s: wrong # of arguments\n", argv[0]);
  260. X        fprintf (stderr, "Calling seq:\n  %s device bufsize\n", 
  261. X                argv[0]);
  262. X    exit (1);
  263. X    }
  264. X
  265. X /* try to open the device */
  266. X    dn = open (argv[1], 0);
  267. X    if (dn < 0)
  268. X    { /* open failed */
  269. X    fprintf (stderr, "%s: can't open device %s\n", argv[0], argv[1]);
  270. X    exit (1);
  271. X    }
  272. X    close (dn); /* so I can reopen */
  273. X
  274. X /* allocate the buffer */
  275. X    bufsize = getsize (argv[2]);
  276. X    debug ("Bufsize: %d\n", bufsize);
  277. X
  278. X    buf = malloc (bufsize);
  279. X    if (buf == NULL)
  280. X    { /* can't allocate the buffer */
  281. X    fprintf (stderr, "Can't allocate %d byte buffer\n", bufsize);
  282. X    exit (1);
  283. X    }
  284. X
  285. X    for (;;)
  286. X    { /* get a fresh mount and read it */
  287. X    fprintf (stderr, "Mount input medium #%d on %s and press return: ",
  288. X        mnum++, argv[1]);
  289. X    read (0, &ch, 1);
  290. X    open (argv[1], 0);
  291. X
  292. X    while (readsize = read (dn, buf, bufsize))
  293. X        write (1, buf, readsize);
  294. X    close (dn);
  295. X    }
  296. X}
  297. X
  298. X/*
  299. X |  Procedure:  getsize
  300. X |-
  301. X |  Convert the size string to bytes. If the last character is
  302. X |  'k', multiply by 1024
  303. X */
  304. X
  305. Xlong
  306. Xgetsize (string)
  307. X    char *string;
  308. X{
  309. X    register long  len = strlen (string),
  310. X                   val = atol (string);
  311. X
  312. X    if (string[len - 1] == 'k')
  313. X    val *= 1024;
  314. X
  315. X    return val;
  316. X}
  317. X
  318. E!O!F
  319. newsize=`wc -c < unbundle.c`
  320. if [ $newsize -ne 2271 ]
  321. then echo "File unbundle.c was $newsize bytes, 2271 expected"
  322. fi
  323.  
  324. echo x - Makefile
  325. sed -e 's/^X// >Makefile <\SHAR_EOF
  326. #all:    bundle unbundle
  327. #bundle:    bundle.c
  328. #    $(CC) -o bundle $(CFLAGS) bundle.c
  329. #unbundle:    unbundle.c
  330. #    $(CC) -o unbundle $(CFLAGS) unbundle.c
  331. #install:    all bundle.c
  332. #    @echo Copy programs and manpage to appropriate directories
  333. SHAR_EOF
  334. echo No error check, lazy moderator...
  335.  
  336. -- 
  337.  
  338. Rich $alz
  339. Cronus Project, BBN Labs            rsalz@bbn.com
  340. Moderator, comp.sources.unix            sources@uunet.uu.net
  341.