void put_stat(struct gfs_stat *st) { if (GFARM_S_ISDIR(st->st_mode)) putchar('d'); else putchar('-'); put_perm(st->st_mode >> 6); put_perm(st->st_mode >> 3); put_perm(st->st_mode); putchar(' '); printf("%-8s %-8s ", st->st_user, st->st_group); printf("%10" PR_FILE_OFFSET " ", st->st_size); put_time(&st->st_mtimespec); putchar(' '); }
void transmit_data(void) { unsigned int count; u_short perm; char *buffer; int bufsize; int fd; struct stat st; int len, len2; int error; char exists; if (debug) diag("sending data"); if ((tempmode&WANT_BACK) == 0) { (void) unlink(tempfile); if (debug) diag("not wanted back"); return; } if (lstat(tempfile, &st) < 0) { if (errno != ENOENT) { error = errno; (void) unlink(tempfile); (void) rmdir(tempdir); errno = error; efatal("lstat", error); } exists = 0; } else { if ((st.st_mode&S_IFMT) != S_IFREG) { (void) unlink(tempfile); (void) rmdir(tempdir); fatal("tempfile no longer a regular file"); } exists = 1; } if (debug) diag("exists %d", exists); if ( ! put_exists ( &exists ) ) { (void) unlink(tempfile); (void) rmdir(tempdir); efatal("write failed"); } if (!exists) { (void) unlink(tempfile); return; } perm = st.st_mode&0777; if (debug) diag("perm %#o", perm); if ( ! put_perm ( &perm ) ) { (void) unlink(tempfile); (void) rmdir(tempdir); efatal("write failed"); } count = st.st_size; if (debug) diag("count %d", count); if ( ! put_count ( &count ) ) { (void) unlink(tempfile); (void) rmdir(tempdir); efatal("write failed"); } count = st.st_size; if (count == 0) { (void) unlink(tempfile); #ifdef notdef (void) rmdir(tempdir); #endif return; } if ((fd = open(tempfile, O_RDONLY, 0)) < 0) { (void) unlink(tempfile); (void) rmdir(tempdir); efatal("open failed"); } if ((bufsize = count) > 10*1024) buffer = (char *) malloc(bufsize = 10*1024); else buffer = (char *) malloc(bufsize); if (buffer == NULL) { (void) unlink(tempfile); (void) rmdir(tempdir); fatal("malloc failed"); } if (debug) diag("bufsize %d", bufsize); while (count != 0) { if (debug) diag("loop count %d", count); if ((len = read(fd, buffer, bufsize)) <= 0) { error = errno; (void) close(fd); (void) unlink(tempfile); (void) rmdir(tempdir); if (len == 0) fatal("1 premature EOF"); errno = error; efatal("server read", error); } if (debug) diag("read %d bytes", len); put_buffer ( buffer, len, &len2, fd ); if (debug) diag("wrote %d bytes", len2); count -= len; if (count < bufsize) bufsize = count; } if (close(fd) < 0) { error = errno; (void) unlink(tempfile); (void) rmdir(tempdir); errno = error; efatal("close"); } (void) free(buffer); (void) unlink(tempfile); if (debug) diag("transfer complete"); }