… | |
… | |
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 | |
84 | char * uulib_id = "$Id: uulib.c,v 1.13 2005/03/26 14:20:49 root Exp $"; |
84 | char * 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 |
87 | BOOL _export WINAPI |
87 | BOOL _export WINAPI |
88 | DllEntryPoint (HINSTANCE hInstance, DWORD seginfo, |
88 | DllEntryPoint (HINSTANCE hInstance, DWORD seginfo, |
89 | LPVOID lpCmdLine) |
89 | LPVOID lpCmdLine) |
… | |
… | |
123 | void *uu_MsgCBArg = NULL; |
123 | void *uu_MsgCBArg = NULL; |
124 | void *uu_BusyCBArg = NULL; |
124 | void *uu_BusyCBArg = NULL; |
125 | void *uu_FileCBArg = NULL; |
125 | void *uu_FileCBArg = NULL; |
126 | void *uu_FFCBArg = NULL; |
126 | void *uu_FFCBArg = NULL; |
127 | void *uu_FNCBArg; |
127 | void *uu_FNCBArg; |
|
|
128 | |
|
|
129 | /* I/O buffer sizes */ |
|
|
130 | int uu_rbuf = 0; |
|
|
131 | int uu_wbuf = 0; |
128 | |
132 | |
129 | /* |
133 | /* |
130 | * Global variables |
134 | * Global variables |
131 | */ |
135 | */ |
132 | |
136 | |
… | |
… | |
419 | UUGetOption (int option, int *ivalue, char *cvalue, int clength) |
423 | UUGetOption (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 | |
514 | int UUEXPORT |
526 | int UUEXPORT |
515 | UUSetOption (int option, int ivalue, char *cvalue) |
527 | UUSetOption (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 | |
903 | int UUEXPORT |
929 | int UUEXPORT |
904 | UUDecodeFile (uulist *thefile, char *destname) |
930 | UUDecodeFile (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 | |