int main(int argc, char **argv) { char filename[PATH_MAX]; int pid[NUM_CHILDREN]; int num_children = 1; int i; snprintf(filename, sizeof(filename), "%s/aiodio/file", getenv("TMP") ? getenv("TMP") : "/tmp"); for (i = 0; i < num_children; i++) { if ((pid[i] = fork()) == 0) { /* child */ return dio_read(filename); } else if (pid[i] < 0) { /* error */ perror("fork error"); break; } else { /* Parent */ continue; } } /* * Parent creates a zero file using DIO. * Truncates it to zero * Create another file with '0xaa' */ for (i = 0; i < 100; i++) { dio_append(filename, 0); truncate(filename, 0); dio_append("junkfile", 0xaa); truncate("junkfile", 0); } for (i = 0; i < num_children; i++) { kill(pid[i], SIGTERM); } return 0; }
int main (int argc, const char* argv[]) { unsigned char SourceId; unsigned char TargetId; dhandle_t Source = NULL; dhandle_t Target = NULL; unsigned int SectSize; unsigned int SectCount; char* Buffer; unsigned int Sector; unsigned int ChunkCount; unsigned int ChunkOffset = 0; clrscr (); screensize (&ScreenX, &ScreenY); /* Allow user to read exit messages */ if (doesclrscrafterexit ()) { atexit ((void (*)) cgetc); } cputs ("Floppy Disk Copy\r\n"); chline (16); cputs ("\r\n"); /* Get source and target drive id (which may very well be identical) */ switch (argc) { case 1: SourceId = AskForDrive ("Source"); TargetId = AskForDrive ("Target"); cputs ("\r\n"); break; case 2: SourceId = TargetId = atoi (argv[1]); break; case 3: SourceId = atoi (argv[1]); TargetId = atoi (argv[2]); break; default: cprintf ("\r\nToo many arguments\r\n"); return EXIT_FAILURE; } cputs ("\r\n"); do { /* Check for single drive copy or inital iteration */ if (SourceId == TargetId || Source == NULL) { AskForDisk ("Source", SourceId); } /* Check for initial iteration */ if (Source == NULL) { /* Open source drive */ Source = dio_open (SourceId); if (Source == NULL) { cprintf ("\r\n\nError %d on opening Drive %d\r\n", (int) _oserror, SourceId); return EXIT_FAILURE; } SectSize = dio_query_sectsize (Source); SectCount = dio_query_sectcount (Source); /* Allocate buffer */ Buffer = AllocBuffer (SectSize, SectCount, &ChunkCount); if (Buffer == NULL) { cputs ("\r\n\nError on allocating Buffer\r\n"); return EXIT_FAILURE; } } ClearLine (); /* Read one chunk of sectors into buffer */ for (Sector = ChunkOffset; Sector < SectCount && (Sector - ChunkOffset) < ChunkCount; ++Sector) { cprintf ("\rReading Sector %d of %d", Sector + 1, SectCount); /* Read one sector */ if (dio_read (Source, Sector, Buffer + (Sector - ChunkOffset) * SectSize) != 0) { cprintf ("\r\n\nError %d on reading from Drive %d\r\n", (int) _oserror, SourceId); return EXIT_FAILURE; } } /* Check for single drive copy or inital iteration */ if (TargetId == SourceId || Target == NULL) { AskForDisk ("Target", TargetId); } /* Open target drive on initial iteration */ if (Target == NULL) { Target = dio_open (TargetId); if (Target == NULL) { cprintf ("\r\n\nError %d on opening Drive %d\r\n", (int) _oserror, TargetId); return EXIT_FAILURE; } /* Check for compatible drives */ if (dio_query_sectsize (Target) != SectSize || dio_query_sectcount (Target) != SectCount) { cputs ("\r\n\nFormat mismatch between Drives\r\n"); return EXIT_FAILURE; } } ClearLine (); /* Write one chunk of sectors from buffer */ for (Sector = ChunkOffset; Sector < SectCount && (Sector - ChunkOffset) < ChunkCount; ++Sector) { cprintf ("\rWriting Sector %d of %d", Sector + 1, SectCount); /* Write one sector */ if (dio_write (Target, Sector, Buffer + (Sector - ChunkOffset) * SectSize) != 0) { cprintf ("\r\n\nError %d on writing to Drive %d\r\n", (int) _oserror, TargetId); return EXIT_FAILURE; } } /* Advance to next chunk */ ChunkOffset += ChunkCount; } while (Sector < SectCount); ClearLine (); cprintf ("\rSuccessfully copied %d Sectors\r\n", SectCount); free (Buffer); dio_close (Source); dio_close (Target); return EXIT_SUCCESS; }