1// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 2// 3// Copyright (c) 2004, Haiku 4// 5// This software is part of the Haiku distribution and is covered 6// by the MIT License. 7// 8// 9// File: release.c 10// Author: J��r��me Duval (korli@chez.com) 11// Description: release a semaphore. 12// 13// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 14 15#include <stdio.h> 16#include <stdlib.h> 17#include <string.h> 18#include <OS.h> 19 20static int usage(char *prog) 21{ 22 printf("usage: release [-f] [-c count] semaphore_number\n"); 23 printf("warning: this can be hazardous...\n"); 24 exit(1); 25} 26 27 28int main(int argc, char **argv) 29{ 30 int count = 1; 31 bool force = false; 32 sem_id semid = -1; 33 status_t err; 34 team_id teamid = -1; 35 36 int i; 37 if (argc < 2 || argc > 5) 38 usage("release"); 39 for (i = 1; i < argc; i++) { 40 if (strncmp(argv[i], "-f", 2) == 0) { 41 force = true; 42 } else if (strncmp(argv[i], "-c", 2) == 0) { 43 i++; 44 if (i < argc) { 45 count = strtol(argv[i], NULL, 10); 46 } else 47 usage("release"); 48 } else { 49 semid = strtol(argv[i], NULL, 10); 50 } 51 } 52 53 if (semid <=0) 54 usage("release"); 55 56 if (force) { 57 sem_info sinfo; 58 thread_info tinfo; 59 get_sem_info(semid, &sinfo); 60 teamid = sinfo.team; 61 get_thread_info(find_thread(NULL), &tinfo); 62 set_sem_owner(semid, tinfo.team); 63 } 64 65 printf("releasing semaphore %d\n", (int)semid); 66 err = release_sem_etc(semid, count, 0); 67 68 if (err < B_OK) { 69 fprintf(stderr, "release_sem failed: %s\n", strerror(err)); 70 return 1; 71 } else if (force) { 72 set_sem_owner(semid, teamid); 73 } 74 75 return 0; 76} 77