ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-UUlib/uulib/uulib.c
(Generate patch)

Comparing Convert-UUlib/uulib/uulib.c (file contents):
Revision 1.13 by root, Sat Mar 26 14:20:49 2005 UTC vs.
Revision 1.14 by root, Mon May 2 19:58:40 2005 UTC

79#include <uudeview.h> 79#include <uudeview.h>
80#include <uuint.h> 80#include <uuint.h>
81#include <fptools.h> 81#include <fptools.h>
82#include <uustring.h> 82#include <uustring.h>
83 83
84char * uulib_id = "$Id: uulib.c,v 1.13 2005/03/26 14:20:49 root Exp $"; 84char * uulib_id = "$Id: uulib.c,v 1.14 2005/05/02 19:58:40 root Exp $";
85 85
86#ifdef SYSTEM_WINDLL 86#ifdef SYSTEM_WINDLL
87BOOL _export WINAPI 87BOOL _export WINAPI
88DllEntryPoint (HINSTANCE hInstance, DWORD seginfo, 88DllEntryPoint (HINSTANCE hInstance, DWORD seginfo,
89 LPVOID lpCmdLine) 89 LPVOID lpCmdLine)
123void *uu_MsgCBArg = NULL; 123void *uu_MsgCBArg = NULL;
124void *uu_BusyCBArg = NULL; 124void *uu_BusyCBArg = NULL;
125void *uu_FileCBArg = NULL; 125void *uu_FileCBArg = NULL;
126void *uu_FFCBArg = NULL; 126void *uu_FFCBArg = NULL;
127void *uu_FNCBArg; 127void *uu_FNCBArg;
128
129/* I/O buffer sizes */
130int uu_rbuf = 0;
131int uu_wbuf = 0;
128 132
129/* 133/*
130 * Global variables 134 * Global variables
131 */ 135 */
132 136
419UUGetOption (int option, int *ivalue, char *cvalue, int clength) 423UUGetOption (int option, int *ivalue, char *cvalue, int clength)
420{ 424{
421 int result; 425 int result;
422 426
423 switch (option) { 427 switch (option) {
428 case UUOPT_RBUF:
429 *ivalue = uu_rbuf;
430 result = 0;
431 break;
432 case UUOPT_WBUF:
433 *ivalue = uu_wbuf;
434 result = 0;
435 break;
424 case UUOPT_VERSION: 436 case UUOPT_VERSION:
425 _FP_strncpy (cvalue, uulibversion, clength); 437 _FP_strncpy (cvalue, uulibversion, clength);
426 result = 0; 438 result = 0;
427 break; 439 break;
428 case UUOPT_FAST: 440 case UUOPT_FAST:
513 525
514int UUEXPORT 526int UUEXPORT
515UUSetOption (int option, int ivalue, char *cvalue) 527UUSetOption (int option, int ivalue, char *cvalue)
516{ 528{
517 switch (option) { 529 switch (option) {
530 case UUOPT_RBUF:
531 uu_rbuf = ivalue;
532 break;
533 case UUOPT_WBUF:
534 uu_wbuf = ivalue;
535 break;
518 case UUOPT_FAST: 536 case UUOPT_FAST:
519 uu_fast_scanning = ivalue; 537 uu_fast_scanning = ivalue;
520 break; 538 break;
521 case UUOPT_DUMBNESS: 539 case UUOPT_DUMBNESS:
522 uu_dumbness = ivalue; 540 uu_dumbness = ivalue;
686 struct stat finfo; 704 struct stat finfo;
687 fileread *loaded; 705 fileread *loaded;
688 uufile *fload; 706 uufile *fload;
689 itbd *killem; 707 itbd *killem;
690 FILE *datei; 708 FILE *datei;
709 void *datei_buf;
691 710
692 int _count; 711 int _count;
693 if (!partcount) 712 if (!partcount)
694 partcount = &_count; 713 partcount = &_count;
695 714
699 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 718 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
700 uustring (S_NOT_OPEN_SOURCE), 719 uustring (S_NOT_OPEN_SOURCE),
701 filename, strerror (uu_errno = errno)); 720 filename, strerror (uu_errno = errno));
702 return UURET_IOERR; 721 return UURET_IOERR;
703 } 722 }
723 UUSETBUF (datei, datei_buf, uu_rbuf);
704 724
705 if (fstat (fileno(datei), &finfo) == -1) { 725 if (fstat (fileno(datei), &finfo) == -1) {
706 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 726 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
707 uustring (S_NOT_STAT_FILE), 727 uustring (S_NOT_STAT_FILE),
708 filename, strerror (uu_errno = errno)); 728 filename, strerror (uu_errno = errno));
709 fclose (datei); 729 fclose (datei);
730 UUCLRBUF (uu_rbuf, datei_buf);
710 return UURET_IOERR; 731 return UURET_IOERR;
711 } 732 }
712 733
713 /* 734 /*
714 * schedule for destruction 735 * schedule for destruction
764 strerror (uu_errno)); 785 strerror (uu_errno));
765 786
766 UUCheckGlobalList (); 787 UUCheckGlobalList ();
767 progress.action = 0; 788 progress.action = 0;
768 fclose (datei); 789 fclose (datei);
790 UUCLRBUF (uu_rbuf, datei_buf);
769 return sr; 791 return sr;
770 } 792 }
771 continue; 793 continue;
772 } 794 }
773 795
776 uustring (S_READ_ERROR), filename, 798 uustring (S_READ_ERROR), filename,
777 strerror (uu_errno = errno)); 799 strerror (uu_errno = errno));
778 UUCheckGlobalList (); 800 UUCheckGlobalList ();
779 progress.action = 0; 801 progress.action = 0;
780 fclose (datei); 802 fclose (datei);
803 UUCLRBUF (uu_rbuf, datei_buf);
781 return UURET_IOERR; 804 return UURET_IOERR;
782 } 805 }
783 806
784 if (partno != -1) 807 if (partno != -1)
785 loaded->partno = partno; 808 loaded->partno = partno;
844 867
845 if (res != UURET_NODATA) { 868 if (res != UURET_NODATA) {
846 UUCheckGlobalList (); 869 UUCheckGlobalList ();
847 progress.action = 0; 870 progress.action = 0;
848 fclose (datei); 871 fclose (datei);
872 UUCLRBUF (uu_rbuf, datei_buf);
849 return res; 873 return res;
850 } 874 }
851 if (uu_fast_scanning && sr != UURET_CONT) 875 if (uu_fast_scanning && sr != UURET_CONT)
852 break; 876 break;
853 877
870 uustring (S_READ_ERROR), filename, 894 uustring (S_READ_ERROR), filename,
871 strerror (uu_errno = errno)); 895 strerror (uu_errno = errno));
872 UUCheckGlobalList (); 896 UUCheckGlobalList ();
873 progress.action = 0; 897 progress.action = 0;
874 fclose (datei); 898 fclose (datei);
899 UUCLRBUF (uu_rbuf, datei_buf);
875 return UURET_IOERR; 900 return UURET_IOERR;
876 } 901 }
877 fclose (datei); 902 fclose (datei);
903 UUCLRBUF (uu_rbuf, datei_buf);
878 904
879 if (!uu_fast_scanning && *partcount == 0) 905 if (!uu_fast_scanning && *partcount == 0)
880 UUMessage (uulib_id, __LINE__, UUMSG_NOTE, 906 UUMessage (uulib_id, __LINE__, UUMSG_NOTE,
881 uustring (S_NO_DATA_FOUND), filename); 907 uustring (S_NO_DATA_FOUND), filename);
882 908
902 928
903int UUEXPORT 929int UUEXPORT
904UUDecodeFile (uulist *thefile, char *destname) 930UUDecodeFile (uulist *thefile, char *destname)
905{ 931{
906 FILE *target, *source; 932 FILE *target, *source;
933 void *target_buf, *source_buf;
907 struct stat finfo; 934 struct stat finfo;
908 int fildes, res; 935 int fildes, res;
909 size_t bytes; 936 size_t bytes;
910 937
911 if (thefile == NULL) 938 if (thefile == NULL)
925 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 952 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
926 uustring (S_NOT_OPEN_FILE), 953 uustring (S_NOT_OPEN_FILE),
927 thefile->binfile, strerror (uu_errno = errno)); 954 thefile->binfile, strerror (uu_errno = errno));
928 return UURET_IOERR; 955 return UURET_IOERR;
929 } 956 }
957 UUSETBUF (source, source_buf, uu_rbuf);
930 958
931 /* 959 /*
932 * for system security, strip setuid/setgid bits from mode 960 * for system security, strip setuid/setgid bits from mode
933 */ 961 */
934 962
966 if (!uu_overwrite) { 994 if (!uu_overwrite) {
967 if (stat (uugen_fnbuffer, &finfo) == 0) { 995 if (stat (uugen_fnbuffer, &finfo) == 0) {
968 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 996 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
969 uustring (S_TARGET_EXISTS), uugen_fnbuffer); 997 uustring (S_TARGET_EXISTS), uugen_fnbuffer);
970 fclose (source); 998 fclose (source);
999 UUCLRBUF (uu_rbuf, source_buf);
971 return UURET_EXISTS; 1000 return UURET_EXISTS;
972 } 1001 }
973 } 1002 }
974 1003
975 if (fstat (fileno(source), &finfo) == -1) { 1004 if (fstat (fileno(source), &finfo) == -1) {
976 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 1005 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
977 uustring (S_NOT_STAT_FILE), 1006 uustring (S_NOT_STAT_FILE),
978 thefile->binfile, strerror (uu_errno = errno)); 1007 thefile->binfile, strerror (uu_errno = errno));
979 fclose (source); 1008 fclose (source);
1009 UUCLRBUF (uu_rbuf, source_buf);
980 return UURET_IOERR; 1010 return UURET_IOERR;
981 } 1011 }
982 1012
983 /* try rename() shortcut first */ 1013 /* try rename() shortcut first */
984 if (!rename (thefile->binfile, uugen_fnbuffer)) 1014 if (!rename (thefile->binfile, uugen_fnbuffer))
986 mode_t mask = 0000; /* there is a slight window here anyway */ 1016 mode_t mask = 0000; /* there is a slight window here anyway */
987#if HAVE_UMASK 1017#if HAVE_UMASK
988 mask = umask (0022); umask (mask); 1018 mask = umask (0022); umask (mask);
989#endif 1019#endif
990 fclose (source); 1020 fclose (source);
1021 UUCLRBUF (uu_rbuf, source_buf);
991#if HAVE_CHMOD 1022#if HAVE_CHMOD
992 chmod (uugen_fnbuffer, thefile->mode & ~mask); 1023 chmod (uugen_fnbuffer, thefile->mode & ~mask);
993#endif 1024#endif
994 goto skip_copy; 1025 goto skip_copy;
995 } 1026 }
1012 progress.action = 0; 1043 progress.action = 0;
1013 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 1044 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
1014 uustring (S_NOT_OPEN_TARGET), 1045 uustring (S_NOT_OPEN_TARGET),
1015 uugen_fnbuffer, strerror (uu_errno = errno)); 1046 uugen_fnbuffer, strerror (uu_errno = errno));
1016 fclose (source); 1047 fclose (source);
1048 UUCLRBUF (uu_rbuf, source_buf);
1017 return UURET_IOERR; 1049 return UURET_IOERR;
1018 } 1050 }
1019 1051
1020 if ((target = fdopen (fildes, "wb")) == NULL) { 1052 if ((target = fdopen (fildes, "wb")) == NULL) {
1021 progress.action = 0; 1053 progress.action = 0;
1022 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 1054 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
1023 uustring (S_IO_ERR_TARGET), 1055 uustring (S_IO_ERR_TARGET),
1024 uugen_fnbuffer, strerror (uu_errno = errno)); 1056 uugen_fnbuffer, strerror (uu_errno = errno));
1025 fclose (source); 1057 fclose (source);
1058 UUCLRBUF (uu_rbuf, source_buf);
1026 close (fildes); 1059 close (fildes);
1027 return UURET_IOERR; 1060 return UURET_IOERR;
1028 } 1061 }
1062 UUSETBUF (target, target_buf, uu_wbuf);
1029 1063
1030 while (!feof (source)) { 1064 while (!feof (source)) {
1031 1065
1032 if (UUBUSYPOLL(ftell(source),progress.fsize)) { 1066 if (UUBUSYPOLL(ftell(source),progress.fsize)) {
1033 UUMessage (uulib_id, __LINE__, UUMSG_NOTE, 1067 UUMessage (uulib_id, __LINE__, UUMSG_NOTE,
1034 uustring (S_DECODE_CANCEL)); 1068 uustring (S_DECODE_CANCEL));
1035 fclose (source); 1069 fclose (source);
1070 UUCLRBUF (uu_rbuf, source_buf);
1036 fclose (target); 1071 fclose (target);
1072 UUCLRBUF (uu_wbuf, target_buf);
1037 unlink (uugen_fnbuffer); 1073 unlink (uugen_fnbuffer);
1038 return UURET_CANCEL; 1074 return UURET_CANCEL;
1039 } 1075 }
1040 1076
1041 bytes = fread (uugen_inbuffer, 1, 1024, source); 1077 bytes = fread (uugen_inbuffer, 1, 1024, source);
1044 progress.action = 0; 1080 progress.action = 0;
1045 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 1081 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
1046 uustring (S_READ_ERROR), 1082 uustring (S_READ_ERROR),
1047 thefile->binfile, strerror (uu_errno = errno)); 1083 thefile->binfile, strerror (uu_errno = errno));
1048 fclose (source); 1084 fclose (source);
1085 UUCLRBUF (uu_rbuf, source_buf);
1049 fclose (target); 1086 fclose (target);
1087 UUCLRBUF (uu_wbuf, target_buf);
1050 unlink (uugen_fnbuffer); 1088 unlink (uugen_fnbuffer);
1051 return UURET_IOERR; 1089 return UURET_IOERR;
1052 } 1090 }
1053 if (fwrite (uugen_inbuffer, 1, bytes, target) != bytes) { 1091 if (fwrite (uugen_inbuffer, 1, bytes, target) != bytes) {
1054 progress.action = 0; 1092 progress.action = 0;
1055 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 1093 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
1056 uustring (S_WR_ERR_TARGET), 1094 uustring (S_WR_ERR_TARGET),
1057 uugen_fnbuffer, strerror (uu_errno = errno)); 1095 uugen_fnbuffer, strerror (uu_errno = errno));
1058 fclose (source); 1096 fclose (source);
1097 UUCLRBUF (uu_rbuf, source_buf);
1059 fclose (target); 1098 fclose (target);
1099 UUCLRBUF (uu_wbuf, target_buf);
1060 unlink (uugen_fnbuffer); 1100 unlink (uugen_fnbuffer);
1061 return UURET_IOERR; 1101 return UURET_IOERR;
1062 } 1102 }
1063 } 1103 }
1064 1104
1065 fclose (source); 1105 fclose (source);
1106 UUCLRBUF (uu_rbuf, source_buf);
1066 if (fclose (target)) { 1107 if (fclose (target)) {
1108 UUCLRBUF (uu_wbuf, target_buf);
1067 UUMessage (uulib_id, __LINE__, UUMSG_ERROR, 1109 UUMessage (uulib_id, __LINE__, UUMSG_ERROR,
1068 uustring (S_WR_ERR_TARGET), 1110 uustring (S_WR_ERR_TARGET),
1069 uugen_fnbuffer, strerror (uu_errno = errno)); 1111 uugen_fnbuffer, strerror (uu_errno = errno));
1070 unlink (uugen_fnbuffer); 1112 unlink (uugen_fnbuffer);
1071 return UURET_IOERR; 1113 return UURET_IOERR;
1072 } 1114 }
1115 UUCLRBUF (uu_wbuf, target_buf);
1073 1116
1074 /* 1117 /*
1075 * after a successful decoding run, we delete the temporary file 1118 * after a successful decoding run, we delete the temporary file
1076 */ 1119 */
1077 1120

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines