char *TreeOPE::parselabelandweight(char **str, double *weight, int *error) { char *answer = NULL; int a; *weight = 0; // cout << "str:" << *str << endl;//---- answer = parselabel(str); // cout << "str:" << *str << endl;//---- // cout << "label:" << answer << endl;//---- if (!answer) { cout << "Wrong in parselabelandweight()!\n\n";//---- *error = -1; return 0; } if (**str == ':') { (*str)++; a = sscanf(*str, "%lf", weight); while ((**str) == '.' || ((**str) >= '0' && (**str) <= '9') || (**str) == 'e' || (**str) == '-' || (**str) == 'E' || (**str) == '+') (*str)++; if (a != 1) { cout << "Wrong in parselabelandweight()!\n\n";//---- *error = -2; free(answer); return 0; } } if (*answer == NULL) { free(answer); answer = NULL; } *error = 0; return answer; }
int main(int argc, char *argv[]) { int ch, f, error = 0; FILE *t; char *autotable = NULL; getphysmem(); while ((ch = getopt(argc, argv, "AEf:F:hRcdenp:tT:vw")) != -1) switch (ch) { case 'A': aflag = 1; break; case 'R': if (op != UNSPEC) usage(); op = RESTORE; break; case 'c': cflag = 1; break; case 'd': dflag = 1; break; case 'e': if (op != UNSPEC) usage(); op = EDIT; break; case 'E': if (op != UNSPEC) usage(); op = EDITOR; break; case 'f': fstabfile = optarg; uidflag = 0; break; case 'F': fstabfile = optarg; uidflag = 1; break; case 'h': print_unit = '*'; break; case 't': tflag = 1; break; case 'T': autotable = optarg; break; case 'w': if (op != UNSPEC) usage(); op = WRITE; break; case 'p': if (strchr("bckmgtBCKMGT", optarg[0]) == NULL || optarg[1] != '\0') { fprintf(stderr, "Valid units are bckmgt\n"); return 1; } print_unit = tolower((unsigned char)optarg[0]); break; case 'n': donothing = 1; break; case 'v': verbose = 1; break; case '?': default: usage(); } argc -= optind; argv += optind; if (op == UNSPEC) op = READ; if (argc < 1 || (fstabfile && !(op == EDITOR || op == RESTORE || aflag))) usage(); if (argv[0] == NULL) usage(); dkname = argv[0]; f = opendev(dkname, (op == READ ? O_RDONLY : O_RDWR), OPENDEV_PART, &specname); if (f < 0) err(4, "%s", specname); if (op != WRITE || aflag || dflag) { readlabel(f); if (op == EDIT || op == EDITOR || aflag) { if (pledge("stdio rpath wpath cpath disklabel proc " "exec", NULL) == -1) err(1, "pledge"); } else if (fstabfile) { if (pledge("stdio rpath wpath cpath disklabel", NULL) == -1) err(1, "pledge"); } else { if (pledge("stdio rpath wpath disklabel", NULL) == -1) err(1, "pledge"); } if (autotable != NULL) parse_autotable(autotable); parselabel(); } else if (argc == 2 || argc == 3) { /* Ensure f is a disk device before pledging. */ if (ioctl(f, DIOCGDINFO, &lab) < 0) err(4, "ioctl DIOCGDINFO"); if (pledge("stdio rpath wpath disklabel", NULL) == -1) err(1, "pledge"); makelabel(argv[1], argc == 3 ? argv[2] : NULL, &lab); } else usage(); switch (op) { case EDIT: if (argc != 1) usage(); error = edit(&lab, f); break; case EDITOR: if (argc != 1) usage(); error = editor(f); break; case READ: if (argc != 1) usage(); if (pledge("stdio", NULL) == -1) err(1, "pledge"); if (tflag) makedisktab(stdout, &lab); else display(stdout, &lab, print_unit, 1); error = checklabel(&lab); break; case RESTORE: if (argc < 2 || argc > 3) usage(); if (!(t = fopen(argv[1], "r"))) err(4, "%s", argv[1]); error = getasciilabel(t, &lab); memset(&lab.d_uid, 0, sizeof(lab.d_uid)); if (error == 0) { error = writelabel(f, &lab); if (error == 0) { if (ioctl(f, DIOCGDINFO, &lab) < 0) err(4, "ioctl DIOCGDINFO"); mpsave(&lab); } } fclose(t); break; case WRITE: error = checklabel(&lab); if (error == 0) error = writelabel(f, &lab); break; default: break; } return error; }