| 5366 | } |
| 5367 | |
| 5368 | fn compute_mode(mode_str: &str) -> Result<(Mode, i32), ModeError> { |
| 5369 | let mut flags = 0; |
| 5370 | let mut plus = false; |
| 5371 | let mut rwa = false; |
| 5372 | let mut mode = Mode::empty(); |
| 5373 | for c in mode_str.bytes() { |
| 5374 | match c { |
| 5375 | b'x' => { |
| 5376 | if rwa { |
| 5377 | return Err(ModeError::BadRwa); |
| 5378 | } |
| 5379 | rwa = true; |
| 5380 | mode.insert(Mode::WRITABLE | Mode::CREATED); |
| 5381 | flags |= libc::O_EXCL | libc::O_CREAT; |
| 5382 | } |
| 5383 | b'r' => { |
| 5384 | if rwa { |
| 5385 | return Err(ModeError::BadRwa); |
| 5386 | } |
| 5387 | rwa = true; |
| 5388 | mode.insert(Mode::READABLE); |
| 5389 | } |
| 5390 | b'w' => { |
| 5391 | if rwa { |
| 5392 | return Err(ModeError::BadRwa); |
| 5393 | } |
| 5394 | rwa = true; |
| 5395 | mode.insert(Mode::WRITABLE); |
| 5396 | flags |= libc::O_CREAT | libc::O_TRUNC; |
| 5397 | } |
| 5398 | b'a' => { |
| 5399 | if rwa { |
| 5400 | return Err(ModeError::BadRwa); |
| 5401 | } |
| 5402 | rwa = true; |
| 5403 | mode.insert(Mode::WRITABLE | Mode::APPENDING); |
| 5404 | flags |= libc::O_APPEND | libc::O_CREAT; |
| 5405 | } |
| 5406 | b'+' => { |
| 5407 | if plus { |
| 5408 | return Err(ModeError::BadRwa); |
| 5409 | } |
| 5410 | plus = true; |
| 5411 | mode.insert(Mode::READABLE | Mode::WRITABLE); |
| 5412 | } |
| 5413 | b'b' => {} |
| 5414 | _ => return Err(ModeError::Invalid), |
| 5415 | } |
| 5416 | } |
| 5417 | |
| 5418 | if !rwa { |
| 5419 | return Err(ModeError::BadRwa); |
| 5420 | } |
| 5421 | |
| 5422 | if mode.contains(Mode::READABLE | Mode::WRITABLE) { |
| 5423 | flags |= libc::O_RDWR |
| 5424 | } else if mode.contains(Mode::READABLE) { |
| 5425 | flags |= libc::O_RDONLY |