btoa.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:5k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include "plgetopt.h"
  34. #include "secutil.h"
  35. #include "nssb64.h"
  36. #if defined(XP_WIN) || (defined(__sun) && !defined(SVR4))
  37. #if !defined(WIN32)
  38. extern int fread(char *, size_t, size_t, FILE*);
  39. extern int fwrite(char *, size_t, size_t, FILE*);
  40. extern int fprintf(FILE *, char *, ...);
  41. #endif
  42. #endif
  43. #if defined(WIN32)
  44. #include "fcntl.h"
  45. #include "io.h"
  46. #endif
  47. static PRInt32 
  48. output_ascii (void *arg, const char *obuf, PRInt32 size)
  49. {
  50.     FILE *outFile = arg;
  51.     int nb;
  52.     nb = fwrite(obuf, 1, size, outFile);
  53.     if (nb != size) {
  54. PORT_SetError(SEC_ERROR_IO);
  55. return -1;
  56.     }
  57.     return nb;
  58. }
  59. static SECStatus
  60. encode_file(FILE *outFile, FILE *inFile)
  61. {
  62.     NSSBase64Encoder *cx;
  63.     int nb;
  64.     SECStatus status = SECFailure;
  65.     unsigned char ibuf[4096];
  66.     cx = NSSBase64Encoder_Create(output_ascii, outFile);
  67.     if (!cx) {
  68. return -1;
  69.     }
  70.     for (;;) {
  71. if (feof(inFile)) break;
  72. nb = fread(ibuf, 1, sizeof(ibuf), inFile);
  73. if (nb != sizeof(ibuf)) {
  74.     if (nb == 0) {
  75. if (ferror(inFile)) {
  76.     PORT_SetError(SEC_ERROR_IO);
  77.     goto loser;
  78. }
  79. /* eof */
  80. break;
  81.     }
  82. }
  83. status = NSSBase64Encoder_Update(cx, ibuf, nb);
  84. if (status != SECSuccess) goto loser;
  85.     }
  86.     status = NSSBase64Encoder_Destroy(cx, PR_FALSE);
  87.     if (status != SECSuccess)
  88. return status;
  89.     /*
  90.      * Add a trailing CRLF.  Note this must be done *after* the call
  91.      * to Destroy above (because only then are we sure all data has
  92.      * been written out).
  93.      */
  94.     fwrite("rn", 1, 2, outFile);
  95.     return SECSuccess;
  96.   loser:
  97.     (void) NSSBase64Encoder_Destroy(cx, PR_TRUE);
  98.     return status;
  99. }
  100. static void Usage(char *progName)
  101. {
  102.     fprintf(stderr,
  103.     "Usage: %s [-i input] [-o output]n",
  104.     progName);
  105.     fprintf(stderr, "%-20s Define an input file to use (default is stdin)n",
  106.     "-i input");
  107.     fprintf(stderr, "%-20s Define an output file to use (default is stdout)n",
  108.     "-o output");
  109.     exit(-1);
  110. }
  111. int main(int argc, char **argv)
  112. {
  113.     char *progName;
  114.     SECStatus rv;
  115.     FILE *inFile, *outFile;
  116.     PLOptState *optstate;
  117.     PLOptStatus status;
  118.     inFile = 0;
  119.     outFile = 0;
  120.     progName = strrchr(argv[0], '/');
  121.     if (!progName)
  122. progName = strrchr(argv[0], '\');
  123.     progName = progName ? progName+1 : argv[0];
  124.     /* Parse command line arguments */
  125.     optstate = PL_CreateOptState(argc, argv, "i:o:");
  126.     while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
  127. switch (optstate->option) {
  128.   default:
  129.     Usage(progName);
  130.     break;
  131.   case 'i':
  132.     inFile = fopen(optstate->value, "rb");
  133.     if (!inFile) {
  134. fprintf(stderr, "%s: unable to open "%s" for readingn",
  135. progName, optstate->value);
  136. return -1;
  137.     }
  138.     break;
  139.   case 'o':
  140.     outFile = fopen(optstate->value, "w");
  141.     if (!outFile) {
  142. fprintf(stderr, "%s: unable to open "%s" for writingn",
  143. progName, optstate->value);
  144. return -1;
  145.     }
  146.     break;
  147. }
  148.     }
  149.     if (status == PL_OPT_BAD)
  150. Usage(progName);
  151.     if (!inFile) {
  152. #if defined(WIN32)
  153. /* If we're going to read binary data from stdin, we must put stdin
  154. ** into O_BINARY mode or else incoming rn's will become n's.
  155. */
  156. int smrv = _setmode(_fileno(stdin), _O_BINARY);
  157. if (smrv == -1) {
  158.     fprintf(stderr,
  159.     "%s: Cannot change stdin to binary mode. Use -i option instead.n",
  160.             progName);
  161.     return smrv;
  162. }
  163. #endif
  164.      inFile = stdin;
  165.     }
  166.     if (!outFile) 
  167.      outFile = stdout;
  168.     rv = encode_file(outFile, inFile);
  169.     if (rv != SECSuccess) {
  170. fprintf(stderr, "%s: lossage: error=%d errno=%dn",
  171. progName, PORT_GetError(), errno);
  172. return -1;
  173.     }
  174.     return 0;
  175. }