1 /*---------------------------------------------------------------------------*
2   Project:  output file generator for dvd archiver
3   File:     out.c
4 
5   Copyright (C) 2001-2006 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: out.c,v $
14   Revision 1.1  04/20/2006 01:41:22  hiratsu
15   Initial check-in.
16 
17 
18     1     7/02/01 11:34p Hashida
19     Initial revision.
20 
21   $NoKeywords: $
22  *---------------------------------------------------------------------------*/
23 
24 #include "darch.h"
25 
26 
makeOutFile(char * name)27 int makeOutFile(char* name)
28 {
29     int                 fido;
30     int                 fidi;
31     ARCHeader           header;
32 
33     if (debugMode)
34     {
35         fprintf(stderr, "output file size is %d\n",
36                 map.userFilePosition + map.userFileLength);
37     }
38 
39     if( (fido = open(name,
40                      O_TRUNC | O_CREAT | O_BINARY | O_WRONLY, 0666)) == -1 )
41     {
42         fprintf(stderr, "%s: Cannot open %s\n", progName, name);
43         exit (1);
44     }
45 
46     // Copy fst
47     if( (fidi = open(fstFile, O_BINARY | O_RDONLY)) == -1 )
48     {
49         fprintf(stderr, "%s: Cannot open %s\n", progName, fstFile);
50         exit (1);
51     }
52 
53     CopyUtility(fidi, 0, fido, map.fstPosition, map.fstLength);
54 
55     close(fidi);
56 
57     // Copy user file
58     if( (fidi = open(userFile, O_BINARY | O_RDONLY)) == -1 )
59     {
60         fprintf(stderr, "%s: Cannot open %s\n", progName, userFile);
61         exit (1);
62     }
63 
64     CopyUtility(fidi, 0, fido, map.userFilePosition, map.userFileLength);
65 
66     close(fidi);
67 
68 
69     // Write header
70     header.magic = REV32(DARCH_MAGIC);
71     header.fstStart = REV32(map.fstPosition);
72     header.fstSize = REV32(map.fstLength);
73     header.fileStart = REV32(map.userFilePosition);
74     header.reserve[0] = 0;
75     header.reserve[1] = 0;
76     header.reserve[2] = 0;
77     header.reserve[3] = 0;
78 
79     if ( -1 == lseek(fido, 0, SEEK_SET) )
80     {
81         fprintf(stderr, "%s: Error occurred when issuing seek to a file\n",
82                 progName);
83         exit(1);
84     }
85 
86     if (sizeof(ARCHeader) != write(fido, &header, sizeof(ARCHeader)))
87     {
88         fprintf(stderr, "%s: Cannot write %s\n", progName, name);
89         exit (1);
90     }
91 
92     if (close(fido) == -1)
93     {
94         fprintf(stderr, "%s: Cannot close %s\n", progName, name);
95         exit (1);
96     }
97 
98     return 0;
99 }
100 
101