Back to index

lightning-sunbird  0.9+nobinonly
semaerr1.c
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is the Netscape Portable Runtime (NSPR).
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1999-2000
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #include "nspr.h"
00039 #include "plgetopt.h"
00040 
00041 #include <stdio.h>
00042 
00043 #define SEM_NAME1 "/tmp/foo.sem"
00044 #define SEM_NAME2 "/tmp/bar.sem"
00045 #define SEM_MODE  0666
00046 
00047 static PRBool debug_mode = PR_FALSE;
00048 
00049 static void Help(void)
00050 {
00051     fprintf(stderr, "semaerr1 test program usage:\n");
00052     fprintf(stderr, "\t-d           debug mode         (FALSE)\n");
00053     fprintf(stderr, "\t-h           this message\n");
00054 }  /* Help */
00055 
00056 int main(int argc, char **argv)
00057 {
00058     PLOptStatus os;
00059     PLOptState *opt = PL_CreateOptState(argc, argv, "dh");
00060     PRSem *sem;
00061 
00062     while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) {
00063         if (PL_OPT_BAD == os) continue;
00064         switch (opt->option) {
00065             case 'd':  /* debug mode */
00066                 debug_mode = PR_TRUE;
00067                 break;
00068             case 'h':
00069             default:
00070                 Help();
00071                 return 2;
00072         }
00073     }
00074     PL_DestroyOptState(opt);
00075 
00076     /*
00077      * PR_SEM_CREATE|PR_SEM_EXCL should be able to
00078      * create a nonexistent semaphore.
00079      */
00080     (void) PR_DeleteSemaphore(SEM_NAME2);
00081     sem = PR_OpenSemaphore(SEM_NAME2, PR_SEM_CREATE|PR_SEM_EXCL, SEM_MODE, 0);
00082     if (sem == NULL) {
00083         fprintf(stderr, "PR_OpenSemaphore failed\n");
00084         exit(1);
00085     }
00086     if (PR_CloseSemaphore(sem) == PR_FAILURE) {
00087         fprintf(stderr, "PR_CloseSemaphore failed\n");
00088         exit(1);
00089     }
00090     if (PR_DeleteSemaphore(SEM_NAME2) == PR_FAILURE) {
00091         fprintf(stderr, "PR_DeleteSemaphore failed\n");
00092         exit(1);
00093     }
00094     
00095     /*
00096      * Opening an existing semaphore with PR_SEM_CREATE|PR_SEM_EXCL.
00097      * should fail with PR_FILE_EXISTS_ERROR.
00098      */
00099     sem = PR_OpenSemaphore(SEM_NAME1, PR_SEM_CREATE|PR_SEM_EXCL, SEM_MODE, 0);
00100     if (sem != NULL) {
00101         fprintf(stderr, "PR_OpenSemaphore should fail but succeeded\n");
00102         exit(1);
00103     }
00104     if (PR_GetError() != PR_FILE_EXISTS_ERROR) {
00105         fprintf(stderr, "Expect %d but got %d\n", PR_FILE_EXISTS_ERROR,
00106                 PR_GetError());
00107         exit(1);
00108     }
00109 
00110     /*
00111      * Try again, with just PR_SEM_CREATE.  This should succeed.
00112      */
00113     sem = PR_OpenSemaphore(SEM_NAME1, PR_SEM_CREATE, SEM_MODE, 0);
00114     if (sem == NULL) {
00115         fprintf(stderr, "PR_OpenSemaphore failed (%d, %d)\n",
00116                 PR_GetError(), PR_GetOSError());
00117         exit(1);
00118     }
00119     if (PR_CloseSemaphore(sem) == PR_FAILURE) {
00120         fprintf(stderr, "PR_CloseSemaphore failed\n");
00121         exit(1);
00122     }
00123 
00124     sem = PR_OpenSemaphore(SEM_NAME2, PR_SEM_CREATE|PR_SEM_EXCL, SEM_MODE, 0);
00125     if (sem == NULL) {
00126         fprintf(stderr, "PR_OpenSemaphore failed (%d, %d)\n",
00127                 PR_GetError(), PR_GetOSError());
00128         exit(1);
00129     }
00130     if (PR_CloseSemaphore(sem) == PR_FAILURE) {
00131         fprintf(stderr, "PR_CloseSemaphore failed\n");
00132         exit(1);
00133     }
00134 
00135     printf("PASS\n");
00136     return 0;
00137 }