From 5afca6b5369c729100543b718989b37238b41f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 19 Mar 2004 08:19:11 +0000 Subject: [PATCH] Added the bin command "release" git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7028 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/bin/Jamfile | 1 + src/apps/bin/release.c | 76 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/apps/bin/release.c diff --git a/src/apps/bin/Jamfile b/src/apps/bin/Jamfile index b8f5cf6587..3e0f325e69 100644 --- a/src/apps/bin/Jamfile +++ b/src/apps/bin/Jamfile @@ -61,6 +61,7 @@ StdBinCommands mount.c prio.c ps.c + release.c renice.c rescan.c rmattr.cpp diff --git a/src/apps/bin/release.c b/src/apps/bin/release.c new file mode 100644 index 0000000000..4ef41182fb --- /dev/null +++ b/src/apps/bin/release.c @@ -0,0 +1,76 @@ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2004, OpenBeOS +// +// This software is part of the OpenBeOS distribution and is covered +// by the OpenBeOS license. +// +// +// File: release.c +// Author: Jérôme Duval (korli@chez.com) +// Description: release a semaphore. +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + +#include +#include +#include +#include + +static int usage(char *prog) +{ + printf("usage: release [-f] [-c count] semaphore_number\n"); + printf("warning: this can be hazardous...\n"); + exit(1); +} + + +int main(int argc, char **argv) +{ + int count = 1; + bool force = false; + sem_id semid = -1; + status_t err; + team_id teamid = -1; + + int i; + if (argc < 2 || argc > 5) + usage("release"); + for (i = 1; i < argc; i++) { + if (strncmp(argv[i], "-f", 2) == 0) { + force = true; + } else if (strncmp(argv[i], "-c", 2) == 0) { + i++; + if (i < argc) { + count = strtol(argv[i], NULL, 10); + } else + usage("release"); + } else { + semid = strtol(argv[i], NULL, 10); + } + } + + if (semid <=0) + usage("release"); + + if (force) { + sem_info sinfo; + thread_info tinfo; + get_sem_info(semid, &sinfo); + teamid = sinfo.team; + get_thread_info(find_thread(NULL), &tinfo); + set_sem_owner(semid, tinfo.team); + } + + printf("releasing semaphore %d\n", (int)semid); + err = release_sem_etc(semid, count, 0); + + if (err < B_OK) { + fprintf(stderr, "release_sem failed: %s\n", strerror(err)); + return 1; + } else if (force) { + set_sem_owner(semid, teamid); + } + + return 0; +}