Хрестоматия по программированию на Си в Unix


Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 6


if((stf.st_mode & S_IFMT) == S_IFREG){ /* Проверка наличия свободного места в каталоге dirname */ struct statvfs fs; char tmpbuf[MAXPATHLEN+1];

if(dirname == NULL){ /* То 'to' - это имя файла, а не каталога */ strcpy(tmpbuf, to); if(s = strrchr(tmpbuf, '/')){ if(*tmpbuf != '/' s != tmpbuf){ /* Имена "../xxx" * и второй случай: * абсолютные имена не в корне, * то есть не "/" и не "/xxx" */ *s = '\0'; }else{ /* "/" или "/xxx" */ if(s[1]) s[1] = '\0'; } dirname = tmpbuf; } else dirname = "."; }

if(statvfs(dirname, &fs) >= 0){ size_t size = (geteuid() == 0 ) ? /* Доступно суперпользователю: байт */ fs.f_frsize * fs.f_bfree : /* Доступно обычному пользователю: байт */ fs.f_frsize * fs.f_bavail;

if(size < stf.st_size){ error("Not enough free space on %s: have %lu, need %lu", dirname, size, stf.st_size); close(fdin); return (-5); } } }

if((fdout = creat(to, stf.st_mode)) < 0){ error("Can't create %s", to); close(fdin); return (-6); } else { fchmod(fdout, stf.st_mode); fchown(fdout, stf.st_uid, stf.st_gid); }

while (n = read (fdin, iobuf, sizeof iobuf)) { if(n < 0){ error ("read error"); code = (-7); goto done; } if(write (fdout, iobuf, n) != n) { error ("write error"); code = (-8); goto done; } }

done: close (fdin); close (fdout);

/* Проверить: соответствует ли результат ожиданиям */ if(stat(to, &stt) >= 0 && (stt.st_mode & S_IFMT) == S_IFREG){ if(stf.st_size < stt.st_size){ error("File has grown at the time of copying"); } else if(stf.st_size > stt.st_size){ error("File too short, target %s removed", to); unlink(to); code = (-9); } } return code; }

int main(int argc, char *argv[]){ int i, code = 0;

progname = argv[0];

if(argc < 3){ error("Usage: %s from... to", argv[0]); return 1; } for(i=1; i < argc-1; i++) code |= copyFile(argv[argc-1], argv[i]) < 0 ? 1 : 0; return code; }




- Начало -  - Назад -  - Вперед -



Книжный магазин