Копирование исполняемого файла на C
У меня проблема с копированием файла из одного каталога в другой на C. В частности, мой код хорошо работает с текстовыми файлами, но не с исполняемыми. Количество записанных байтов является правильным, как и права на файл, но тип результата копии не распознается как исполняемый файловой системой (я работаю на виртуальной машине xubuntu) и имеет тип "Неизвестно". Поэтому, если я повторю результаты md5sum из командной строки на bash, они будут другими.
В следующем коде "checkErrno" - это определенная мной функция, которая вызывает perror. "currDir" - это текущий каталог, а "DIRNAME" - это каталог, в который я хочу перейти. Все библиотеки правильно включены, я просто скопировал и вставил кусок кода, который имеет значение.
struct stat fileSt;
if(stat(fileName,&fileSt) != 0) checkErrno("Stats file");
char currDir[PATH_MAX];
FILE* file;
if(getcwd(currDir,PATH_MAX) == NULL) checkErrno("Currdir");
if(chdir(DIRNAME) != 0) checkErrno("Chdir");
if((file = fopen(fileName,"w")) == NULL) checkErrno("Create file");
if(chmod(fileName, fileSt.st_mode & 07777)) perror("chmod");
if(fwrite(fileMsg.data.buf,1,fileSize,file) < fileSize) checkErrno("fwrite");
fflush(file);
if(fclose(file) != 0) checkErrno("fclose");
if(chdir(currDir) != 0) checkErrno("chdir");
Заранее спасибо!
2 ответа
Ваш chmod будет очищать все биты, а не устанавливать какие-либо
if(chmod(fileName, fileSt.st_mode & 07777))
Вам нужно убедиться, что копия помечена как минимум исполняемой, а может и читаемой (я не уверен, что пользователю нужно иметь разрешение на чтение для выполнения чего-либо, но это имело бы смысл.
Я не знаю, является ли это вашей проблемой, но не забудьте открыть оба файла в двоичном режиме: "wb" вместо просто "w" и "rb" вместо просто "r".