#include "function.h"
+#define BUFMAX 4096
+
int strmaxlen (char *str, char ch)
{
int len = 0;
return rc;
}
+int _copyfile (char *dest, char *src, size_t size)
+{
+ int rc = 0;
+
+ int fdsrc = open (src, O_RDONLY);
+ int fddest = open (dest, O_WRONLY | O_CREAT | O_EXCL, 0622);
+ if ((fdsrc < 0) || (fddest < 0)) {
+ if (fdsrc > 0) {
+ close (fdsrc);
+ }
+ if (fddest > 0) {
+ close (fddest);
+ }
+ return 1;
+ }
+
+ char bufin[BUFMAX];
+ size_t nread = 0;
+ int saved_errno;
+ while (nread = read(fdsrc, bufin, sizeof (bufin)), nread > 0) {
+ char *bufout = bufin;
+ size_t nwritten;
+
+ while ((nread > 0) && (rc == 0)) {
+ nwritten = write(fddest, bufout, nread);
+
+ if (nwritten >= 0) {
+ nread -= nwritten;
+ bufout += nwritten;
+ } else if (errno != EINTR) {
+ rc = 1;
+ }
+ }
+ }
+
+ if ((close (fddest) < 0) && (nread == 0)) {
+ rc = 1;
+ }
+ close (fdsrc);
+
+ return rc;
+}
+
int processcopy (char *dest, char *src)
{
+ int rc = 0;
+
+ struct stat sb;
+#ifdef WIN32
+ if (stat (src, &sb) == 0) {
+#else /* Linux*/
+ if (lstat (src, &sb) == 0) {
+#endif
+ if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+ char nextdest = strdupcat (dest, SEPARATOR, src, NULL);
+#ifdef WIN32
+ if (mkdir (nextdest) != 0) {
+#else
+ if (mkdir (nextdest, 0750) != 0) {
+#endif
+ char *msg = strdupcat (("Can't create directory '", nextdest, "'", NULL);
+ msgwindow (msg, winscreen, 0);
+ getch ();
+ free (msg);
+ rc = 1;
+ } else {
+ DIR *dir = opendir (src);
+
+ if (dir != NULL) {
+ struct dirent *dp = NULL;
+ while (((dp = readdir (dir)) != NULL) && (rc == 0)) {
+ if ((strcmp (dp->d_name, ".") == 0) || (strcmp (dp->d_name, "..") == 0)) {
+ continue;
+ }
+ char *nextsrc = strdupcat (src, SEPARATOR, dp->d_name, NULL);
+ rc = processdelete (nextdest, nextsrc);
+ free (nextsrc);
+ }
+ closedir (dir);
+ } else {
+ rc = 1;
+ }
+ }
+ free (nextdest);
+ } else {
+ char *basename = strrstr (srcn SEPARATOR);
+ char *newdest = strdupcat (dest, SEPARATOR, basename, NULL);
+ rc = _copyfile (dest, src, sb.st_size);
+ free (newdest);
+ }
+ } else {
+ rc = 1;
+ }
+
+ return rc;
+}
+
return 0;
}