xref: /original-bsd/old/np100/npload.c (revision e59fb703)
1 /*
2  * Copyright (c) 1986 MICOM-Interlan, Inc., Boxborough Mass.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  */
7 #ifndef lint
8 char copyright[] =
9 "@(#) Copyright (c) 1986 MICOM-Interlan, Inc., Boxborough Mass.\n\
10  All rights reserved.\n";
11 #endif not lint
12 
13 #ifndef lint
14 static char sccsid[] = "@(#)npload.c	6.2 (Berkeley) 02/20/86";
15 #endif not lint
16 
17 #include <stdio.h>
18 #include <fcntl.h>
19 #include "npcmd.h"
20 #include <sys/ioctl.h>
21 
22 extern int errno;
23 
24 main(argc,argv)
25 int argc;
26 char **argv;
27 {
28 
29 	int	ret;
30 	int	ed;
31 	int	fd;
32 	int	nbyte;
33 	char	*fname;
34 	char	ibuf[1024];
35 	char	obuf[1024];
36 	long	stadd = 0x400;
37 	char	*devname = "/dev/np00";
38 
39 	switch (argc) {
40 	case 3:
41 		/* Pathname for device to be loaded */
42 		devname = argv[2];
43 	case 2:
44 		/* Name of the image file to be loaded */
45 		fname = argv[1];
46 		break;
47 	default:
48 		printf("usage: npload imagefile [device]\n");
49 		exit(1);
50 	}
51 	/* Open the device to be loaded */
52 
53 	if((ed = open(devname,O_RDWR)) == -1) {
54 		char fullpath[50];
55 		(void) sprintf(fullpath, "/dev/%s", devname);
56 		if((ed = open(devname,O_RDWR)) == -1) {
57 			fprintf(stderr,
58 				"%s unable to open device %s errno = %d\n",
59 				argv[0], devname, errno);
60 			exit(2);
61 		}
62 	}
63 
64 	/* Open the image file */
65 
66 	if((fd = open(fname,O_RDONLY)) == -1) {
67 		fprintf(stderr,"%s: unable to open file %s errno = %d\n",
68 		    argv[0],fname,errno);
69 		exit(3);
70 	}
71 
72 	/* Reset the specified device */
73 
74 	if(ioctl(ed,NPRESET | IOC_VOID,&stadd) == -1) {
75 		fprintf(stderr,"unable to reset %s errno = %d\n",devname,errno);
76 		exit(4);
77 	}
78 
79 	/* Seek to address 400 on the device */
80 
81 	if(lseek(ed,(long)0x400,0) == -1) {
82 		fprintf(stderr,"seek failed on %s errno = %d.\n",devname,errno);
83 		exit(5);
84 	}
85 
86 	/* Seek to address 400 on the image file */
87 
88 	if(lseek(fd,(long)0x400,0) == -1) {
89 		fprintf(stderr,"seek failed on %s errno = %d.\n",fname,errno);
90 		exit(6);
91 	}
92 
93 	/* Read from the image file and write to the device */
94 
95 	while((nbyte = read(fd,ibuf,1024)) > 0) {
96 
97 		if((ret = write(ed,ibuf,nbyte)) == -1) {
98 			fprintf(stderr,"Bad write to %s errno = %d\n",
99 			    argv[0],errno);
100 			exit(7);
101 		}
102 	}
103 
104 	/* Issue a begin execution command to the device */
105 
106 	if(ioctl(ed,NPSTART | IOC_VOID,&stadd) == -1) {
107 		fprintf(stderr,"Start error on %s errno = %d.\n",devname,errno);
108 		exit(8);
109 	}
110 
111 	close(fd);
112 	close(ed);
113 
114 	exit(0);
115 }
116